ic_java_type.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,212 行 · 第 1/3 页

ERL
1,212
字号
%% ``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_java_type).-include("icforms.hrl").-include("ic.hrl").-include("ic_debug.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([getType/3, getHolderType/3,	 getParamType/4, inlinedTypes/2,	 marshalFun/4, unMarshalFun/4, getFullType/4, 	 getFullType/3, getMarshalType/4, getUnmarshalType/4,	 getdim/1]).-export([isBasicType/3, isBasicType/1]).-export([isIntegerType/3, isIntegerType/1]).-export([isTermType/3]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([]).%%-----------------------------------------------------------------%% External functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: getType/3%%-----------------------------------------------------------------getType(G, N, T) when record(T, scoped_id) ->    {FullScopedName, _, TK, _} = ic_symtab:get_full_scoped_name(G, N, T),    BT = ic_code:get_basetype(G, ic_util:to_dot(G,FullScopedName)),     case BT of	"erlang.pid" ->	    ?ICPACKAGE ++ "Pid";	"erlang.port" ->	    ?ICPACKAGE ++ "Port";	"erlang.ref" ->	    ?ICPACKAGE ++ "Ref";	"erlang.term" ->	    ?ICPACKAGE ++ "Term";	{enum, Type} ->	    getType(G, N, Type);	Type -> 	    case TK of		{tk_array,_,_} ->		    tk2type(G,N,T,TK);		{tk_sequence,_,_} ->		    tk2type(G,N,T,TK);		tk_any ->		    ?ICPACKAGE ++ "Any";		_ ->		    case isBasicType(G,N,TK) of			true ->			    tk2type(G,N,T,TK);			false ->			    Type %% Other types		    end	    end    end;getType(_G, _N, S) when list(S) ->    S;getType(_G, _N, T) when record(T, string) ->    "java.lang.String";getType(_G, _N, T) when record(T, wstring) ->  %% WSTRING    "java.lang.String";getType(G, N, T) when record(T, struct) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]);getType(G, N, T) when record(T, union) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]);getType(G, N, T) when record(T, sequence) ->    getType(G, N, ic_forms:get_type(T)) ++ "[]";getType(G, N, T) when record(T, enum) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]);%% NOTE i am using the new isJavaElementaryType%% to avoid members declared as keywords (except%% all java elementary types) to be used as a %% classgetType(G, N, T) when record(T, member) ->    Type = tk2type(G,N,T,ic_forms:get_type_code(G, N, T)),    case isJavaElementaryType(list_to_atom(Type)) of	true ->	    Type;	false ->	    Prefix = list_to_atom(lists:flatten(string:tokens(Type,"[]"))),	    case isJavaElementaryType(Prefix) of %% Checks if Type is an array		                                 %% of elementary java types		true ->		    Type;		false -> 		    ic_forms:get_java_id(getType(G,N,ic_forms:get_type(T))) ++			if record(hd(T#member.id),array) ->				arrayEmptyDim(hd(T#member.id));			   true ->				""			end	    end    end;getType(_G, _N, {boolean, _}) ->    "boolean";getType(_G, _N, {octet, _}) ->    "byte";getType(_G, _N, {void, _}) ->    "void";getType(_G, _N, {unsigned, U}) ->    case U of	{short,_} ->	    "short";	{long,_} ->	    "int";	{'long long',_} ->	    "long"    end;getType(_G, _N, {char, _}) ->    "char";getType(_G, _N, {wchar, _}) ->  %% WCHAR     "char";getType(_G, _N, {short, _}) ->    "short";getType(_G, _N, {long, _}) ->    "int";getType(_G, _N, {'long long', _}) ->    "long";getType(_G, _N, {float, _}) ->    "float";getType(_G, _N, {double, _}) ->    "double";    getType(_G, _N, {any, _}) ->    ?ICPACKAGE ++ "Any".%%-----------------------------------------------------------------%% Func: getHolderType/3%%-----------------------------------------------------------------getHolderType(G, N, T) when element(1, T) == scoped_id ->    {FullScopedName, _, TK, _} = ic_symtab:get_full_scoped_name(G, N, T),    BT = ic_code:get_basetype(G, ic_util:to_dot(G,FullScopedName)),     case BT of	"erlang.pid" ->	    ?ICPACKAGE ++ "PidHolder";	"erlang.port" ->	    ?ICPACKAGE ++ "PortHolder";	"erlang.ref" ->	    ?ICPACKAGE ++ "RefHolder";	"erlang.term" ->	    ?ICPACKAGE ++ "TermHolder";	{enum, Type} ->	    getHolderType(G, N, Type);		Type ->	    case TK of		{'tk_struct', _, _, _} ->		    Type ++ "Holder";		{'tk_union', _, _, _, _, _} ->		    Type ++ "Holder";		{'tk_array', _ , _} ->		    Type ++ "Holder";		{'tk_sequence', _ , _} ->		    Type ++ "Holder";		{'tk_string', _} ->		    ?ICPACKAGE ++ "StringHolder";		{'tk_wstring', _} ->  %% WSTRING		    ?ICPACKAGE ++ "StringHolder";		{'tk_enum', _, _, _} ->		    Type ++ "Holder";		'tk_boolean' ->		    ?ICPACKAGE ++ "BooleanHolder";				'tk_octet' ->		    ?ICPACKAGE ++ "ByteHolder";				'tk_ushort' ->		    ?ICPACKAGE ++ "ShortHolder";				'tk_ulong' ->		    ?ICPACKAGE ++ "IntHolder";				'tk_ulonglong' ->               %% ULLONG		    ?ICPACKAGE ++ "LongHolder";				'tk_short' ->		    ?ICPACKAGE ++ "ShortHolder";				'tk_long' ->		    ?ICPACKAGE ++ "IntHolder";		'tk_longlong' ->		    ?ICPACKAGE ++ "LongHolder"; %% LLONG				'tk_float' ->		    ?ICPACKAGE ++ "FloatHolder";				'tk_double' ->		    ?ICPACKAGE ++ "DoubleHolder";				'tk_char' ->		    ?ICPACKAGE ++ "CharHolder";		'tk_wchar' ->                    %% WCHAR		    ?ICPACKAGE ++ "CharHolder";		'tk_any' ->		    ?ICPACKAGE ++ "AnyHolder";		_ ->		    case isBasicType(G,N,TK) of			true ->			    %% Faked the type !			    getHolderType(G, N, {list_to_atom(tk2type(G,N,T,TK)), -1}); 			false ->			    %%io:format("TK = ~p, Type = ~p\n",[TK,Type]),			    ic_util:to_dot(G,FullScopedName) ++ "Holder"		    end	    end    end;getHolderType(G, N, S) when list(S) ->    ic_util:to_dot(G,[S|N]) ++ "Holder";getHolderType(_G, _N, T) when record(T, string) ->    ?ICPACKAGE ++"StringHolder";getHolderType(_G, _N, T) when record(T, wstring) ->  %% WSTRING    ?ICPACKAGE ++"StringHolder";getHolderType(G, N, T) when record(T, struct) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]) ++ "Holder";getHolderType(G, N, T) when record(T, union) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]) ++ "Holder";getHolderType(G, N, T) when record(T, array) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]) ++ "Holder";getHolderType(G, N, T) when record(T, sequence) ->    getType(G, N, ic_forms:get_type(T)) ++ "Holder[]";getHolderType(G, N, T) when record(T, enum) ->    ic_util:to_dot(G,[ic_forms:get_id2(T)|N]) ++ "Holder";getHolderType(_G, _N, {boolean, _}) ->    ?ICPACKAGE ++"BooleanHolder";getHolderType(_G, _N, {octet, _}) ->    ?ICPACKAGE ++"ByteHolder";getHolderType(_G, _N, {void, _}) ->    "void";getHolderType(_G, _N, {unsigned, U}) ->    case U of	{short,_} ->	    ?ICPACKAGE ++"ShortHolder";	{long,_} ->	    ?ICPACKAGE ++"IntHolder";	{'long long',_} ->	    ?ICPACKAGE ++"LongHolder"    end;getHolderType(_G, _N, {char, _}) ->    ?ICPACKAGE ++"CharHolder";getHolderType(_G, _N, {wchar, _}) ->  %% WCHAR    ?ICPACKAGE ++"CharHolder";getHolderType(_G, _N, {short, _}) ->    ?ICPACKAGE ++"ShortHolder";getHolderType(_G, _N, {long, _}) ->    ?ICPACKAGE ++"IntHolder";getHolderType(_G, _N, {'long long', _}) ->    ?ICPACKAGE ++"LongHolder";getHolderType(_G, _N, {float, _}) ->    ?ICPACKAGE ++"FloatHolder";getHolderType(_G, _N, {double, _}) ->    ?ICPACKAGE ++"DoubleHolder";getHolderType(_G, _N, {any,_}) ->    ?ICPACKAGE ++ "AnyHolder".%%-----------------------------------------------------------------%% Func: getParamType/4%%-----------------------------------------------------------------getParamType(G, N, S, in) ->    getType(G, N, S);getParamType(G, N, S, ret) ->    getType(G, N, S);getParamType(G, N, S, out) ->    getHolderType(G, N, S);getParamType(G, N, S, inout) ->    getHolderType(G, N, S).%%-----------------------------------------------------------------%% Func: getUnmarshalType/4%%-----------------------------------------------------------------getUnmarshalType(G, N, X, T) when element(1, T) == scoped_id ->    {FullScopedName, _, TK, _} = ic_symtab:get_full_scoped_name(G, N, T),    BT = ic_code:get_basetype(G, ic_util:to_dot(G,FullScopedName)),     case BT of	"erlang.pid" ->	    ?ICPACKAGE ++ "PidHelper";	"erlang.port" ->	    ?ICPACKAGE ++ "PortHelper";	"erlang.ref" ->	    ?ICPACKAGE ++ "RefHelper";	"erlang.term" ->	    ?ICPACKAGE ++ "TermHelper";	{enum, Type} ->	    getUnmarshalType(G, N, X, Type);	Type ->	    case TK of		{'tk_struct', _, _, _} ->		    Type ++ "Helper";		{'tk_union', _, _, _, _, _} ->		    Type ++ "Helper";		{'tk_sequence', _ , _} ->		    Type ++ "Helper";		{'tk_array', _ , _} ->		    Type ++ "Helper";		{'tk_enum', _, _, _} ->		    Type ++ "Helper";		{'tk_string',_} ->		    ?ERLANGPACKAGE ++ "OtpErlangString";		{'tk_wstring',_} ->                     %% WSTRING		    ?ERLANGPACKAGE ++ "OtpErlangString";		'tk_char' ->		    ?ERLANGPACKAGE ++ "OtpErlangLong";		'tk_wchar' ->                           %% WCHAR		    ?ERLANGPACKAGE ++ "OtpErlangLong";		'tk_octet' ->		    ?ERLANGPACKAGE ++ "OtpErlangLong";				'tk_ushort' ->		    ?ERLANGPACKAGE ++ "OtpErlangLong";		'tk_ulong' ->		    ?ERLANGPACKAGE ++ "OtpErlangLong";		'tk_ulonglong' ->                       %% ULLONG		    ?ERLANGPACKAGE ++ "OtpErlangLong";		

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?