ic_jbe.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,486 行 · 第 1/4 页
ERL
1,486 行
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%-module(ic_jbe).-export([do_gen/3, gen/3, emit_type_function/4]).-include("icforms.hrl").-include("ic.hrl").-include("ic_debug.hrl").-include_lib("stdlib/include/erl_compile.hrl").%%------------------------------------------------------------%%%% Entry point%%%%------------------------------------------------------------do_gen(G, _File, Form) -> gen(G, [], Form).%%------------------------------------------------------------%%%% Generate the client side C stubs.%%%% Each module is generated to a separate file.%%%% Each function needs to generate a function head and%% a body. IDL parameters must be converted into C parameters.%%%%------------------------------------------------------------gen(G, N, [X|Xs]) when record(X, preproc) -> NewG = handle_preproc(G, N, X#preproc.cat, X), gen(NewG, N, Xs);gen(G, N, [X|Xs]) when record(X, module) -> gen_module(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, interface) -> gen_interface(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, const) -> ic_constant_java:gen(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, op) -> gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, attr) -> gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, except) -> gen_exception(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, enum) -> ic_enum_java:gen(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, struct) -> ic_struct_java:gen(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, union) -> ic_union_java:gen(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, typedef) -> gen_typedef(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, member) -> %%?PRINTDEBUG2("gen member: ~p\n",[ic_forms:get_type(X)]), gen_member(G, N, X), gen(G, N, Xs);gen(G, N, [X|Xs]) when record(X, case_dcl) -> %%?PRINTDEBUG2("gen case decl: ~p\n",[ic_forms:get_type(X)]), gen(G, N, [ic_forms:get_type(X)]), gen(G, N, Xs);gen(G, N, [_|Xs]) -> gen(G, N, Xs);gen(_G, _N, []) -> ok.%%%--------------------------------------------%%%%%% Just generates the directory to host %%% the module files%%%%%%--------------------------------------------gen_module(G, N, X) -> case ic_genobj:do_gen(G) of true -> %% Generate & register N1 = [ic_forms:get_id2(X) | N], %% Create directory ic_file:createJavaDirectory(G, N1), gen(G, N1, ic_forms:get_body(X)); false -> %% Register only N1 = [ic_forms:get_id2(X) | N], reg(G, N1, ic_forms:get_body(X)) end.reg(G, N, [X|_Xs]) when record(X, module) -> reg(G, [ic_forms:get_id2(X) | N], ic_forms:get_body(X));reg(G, N, [X|_Xs]) when record(X, interface) -> reg(G, [ic_forms:get_id2(X) | N], ic_forms:get_body(X));reg(G, N, [X|Xs]) when record(X, typedef) -> Name = ic_util:to_dot(G,[ic_forms:get_java_id(X) | N]), case X#typedef.type of {scoped_id,_,_,_} -> {FullScopedName, _, _, _} = ic_symtab:get_full_scoped_name(G, N, X#typedef.type), Type = ic_code:get_basetype(G, ic_util:to_dot(G,FullScopedName)), ic_code:insert_typedef(G, Name, Type); _ -> ok end, reg(G, N, Xs);reg(G, N, [_|Xs]) -> reg(G, N, Xs);reg(_G, _N, []) -> ok. %%%----------------------------------------------%%%%%% Generates the interface code%%%%%%----------------------------------------------gen_interface(G, N, X) -> case ic_genobj:do_gen(G) of true -> G1 = ic_file:javaInterfaceFilePush(G, N, X), %% Generate Interface file InterfaceFd = ic_genobj:interfacefiled(G1), emit_interface(G1, N, X, InterfaceFd), %% Generate Helper file HelperFd = ic_genobj:helperfiled(G1), emit_helper(G1, N, X, HelperFd), %% Generate Holder file HolderFd = ic_genobj:holderfiled(G1), emit_holder(G1, N, X, HolderFd), %% Generate Stub file StubFd = ic_genobj:stubfiled(G1), emit_stub(G1,N,X,StubFd), %<--------------------------------------------------- 1 %% Generate Skeleton file SkelFd = ic_genobj:skelfiled(G1), emit_skel(G1, N, X, SkelFd), ic_file:javaInterfaceFilePop(G1); false -> ok end. %%%--------------------------------------------%%%%%% Typedef redirection%%%%%%--------------------------------------------gen_typedef(G, N, X) -> Name = ic_util:to_dot(G,[ic_forms:get_java_id(X) | N]), case X#typedef.type of {scoped_id,_,_,_} -> {FullScopedName, _, _, _} = ic_symtab:get_full_scoped_name(G, N, X#typedef.type), Type = ic_code:get_basetype(G, ic_util:to_dot(G,FullScopedName)), ic_code:insert_typedef(G, Name, Type); _ -> ok end, gen_typedef_1(G, N, X, ic_forms:get_body(X)).gen_typedef_1(G, N, X, Type) when record(Type, sequence) -> ic_sequence_java:gen(G, N, Type, ic_forms:get_java_id(X));gen_typedef_1(G, N, X, Type) when record(Type, array) -> ic_array_java:gen(G, N, X, Type);gen_typedef_1(G, N, X, _Type) -> gen_typedef_2(G, N, X, X#typedef.id), ok.gen_typedef_2(G, N, X, Type) when record(Type, array) -> gen_typedef_1(G, N, X, Type);gen_typedef_2(G, N, X, Type) when list(Type) -> case Type of [] -> ok; _ -> gen_typedef_2(G, N, X, hd(Type)), gen_typedef_2(G, N, X, tl(Type)) end;%gen_typedef_2(G, N, X, Type) -> %% Generating Helpers for typedef% %% Stoped due to compatibility problems% %% with erl_genserv backend% case ic_java_type:isBasicType(G,N,X#typedef.type) of% true ->% ok;% false ->% case ic_forms:get_type_code(G,N,X#typedef.type) of% {'tk_struct', _, _, _} ->% ic_struct_java:gen(G, N, X);% {'tk_sequence',_,_} ->% ic_sequence_java:gen(G, N, X, ic_forms:get_java_id(X)),% ok;% _ ->% ok% end% end;gen_typedef_2(_G, _N, _X, _Type) -> ok.%%%--------------------------------------------%%%%%% Member redirection%%%%%%--------------------------------------------gen_member(G, N, X) -> gen_member_1(G, N, X, [X#member.type]), gen_member_2(G, N, X, X#member.id).gen_member_1(_G, _N, _X, []) -> ok;gen_member_1(G, N, X, [T|Ts]) when record(T, sequence) -> ic_sequence_java:gen(G, N, T, ic_forms:get_java_id(X)), gen_member_1(G, N, X, Ts);gen_member_1(G, N, X, [T|Ts]) -> gen(G,N,[T]), gen_member_1(G,N,X,Ts).gen_member_2(_G, _N, _X, []) -> ok;gen_member_2(G, N, X, [T|Ts]) when record(T, array) -> %% BUG ! ic_array_java:gen(G, N, X, T), gen_member_2(G, N, X, Ts);gen_member_2(G, N, X, [_T|Ts]) -> gen_member_2(G, N, X, Ts).gen_exception(_G, N, X) -> io:format("Warning : Exceptions not supported for java mapping, ~p ignored\n", [ic_util:to_colon([ic_forms:get_java_id(X)|N])]), ok.%%%-----------------------------------------------------%%%%%% Interface file generation%%%%%%-----------------------------------------------------emit_interface(G, N, X, Fd) -> Interface = ic_forms:get_java_id(X), %% Java Interface Name IFCName = ic_forms:get_id2(X), %% Internal Interface Name ic_codegen:emit(Fd, "public interface ~s {\n\n",[Interface]), Body = ic_forms:get_body(X), %% Generate type declarations inside interface gen(G, [IFCName |N], Body), lists:foreach(fun({_Name, Body1}) -> emit_interface_prototypes(G, [IFCName|N], Body1, Fd) end, [{x, Body} | X#interface.inherit_body]), ic_codegen:emit(Fd, "}\n\n").emit_interface_prototypes(G, N, [X |Xs], Fd) when record(X, op) -> {_, ArgNames, TypeList} = extract_info(G, N, X), {R, ParameterTypes, _} = TypeList, OpName = ic_forms:get_java_id(X), RT = ic_java_type:getParamType(G,N,R,ret), PL = ic_util:mk_list(gen_par_list(G, N, X, ParameterTypes,ArgNames)), ic_codegen:emit(Fd, "/*\n"), ic_codegen:emit(Fd, " * Operation ~p interface functions \n", [ic_util:to_colon([OpName|N])]), ic_codegen:emit(Fd, " */\n\n"), ic_codegen:emit(Fd, "~s ~s(~s)\n",[RT, OpName, PL]), ic_codegen:emit(Fd, " throws java.lang.Exception;\n\n\n"), emit_interface_prototypes(G, N, Xs, Fd);emit_interface_prototypes(G, N, [X |Xs], Fd) when record(X, attr) -> ic_attribute_java:emit_attribute_prototype(G, N, X, Fd), emit_interface_prototypes(G, N, Xs, Fd);emit_interface_prototypes(G, N, [_X|Xs], Fd) -> emit_interface_prototypes(G, N, Xs, Fd);emit_interface_prototypes(_G, _N, [], _Fd) -> ok.%%%-----------------------------------------------------%%%%%% Holder file generation%%%%%%-----------------------------------------------------emit_holder(_G, N, X, Fd) -> InterfaceName = ic_forms:get_java_id(X), FullInterfaceName = ic_util:to_dot([InterfaceName|N]), ic_codegen:emit(Fd, "public final class ~sHolder {\n\n",[InterfaceName]), ic_codegen:emit(Fd, " // Instance variable\n"), ic_codegen:emit(Fd, " public ~s value;\n\n",[FullInterfaceName]), ic_codegen:emit(Fd, " // Constructors\n"), ic_codegen:emit(Fd, " public ~sHolder() {\n",[InterfaceName]), ic_codegen:emit(Fd, " this(null);\n"), ic_codegen:emit(Fd, " }\n\n"),
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?