diff options
Diffstat (limited to 'lib/ic/src/ic_union_java.erl')
-rw-r--r-- | lib/ic/src/ic_union_java.erl | 755 |
1 files changed, 0 insertions, 755 deletions
diff --git a/lib/ic/src/ic_union_java.erl b/lib/ic/src/ic_union_java.erl deleted file mode 100644 index 14d585b0a4..0000000000 --- a/lib/ic/src/ic_union_java.erl +++ /dev/null @@ -1,755 +0,0 @@ -%% -%% %CopyrightBegin% -%% -%% Copyright Ericsson AB 1999-2016. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%% -%% %CopyrightEnd% -%% -%% - - --module(ic_union_java). - --include("icforms.hrl"). --include("ic.hrl"). --include("ic_debug.hrl"). -%%----------------------------------------------------------------- -%% External exports -%%----------------------------------------------------------------- --export([gen/3]). - -%%----------------------------------------------------------------- -%% Internal exports -%%----------------------------------------------------------------- --export([]). - -%%----------------------------------------------------------------- -%% External functions -%%----------------------------------------------------------------- - -%%----------------------------------------------------------------- -%% Func: gen/3 -%%----------------------------------------------------------------- -gen(G, N, X) when is_record(X, union) -> - - %% Create a TK value if not existed - %% Should be integrated in fetchTk - %% instead - NewX = case ic_forms:get_tk(X) of - undefined -> - S = ic_genobj:tktab(G), - Tk = ictype:tk(G, S, N, X), - #union{ id = X#union.id, - type = X#union.type, - body = X#union.body, - tk = Tk }; - _Tk -> - X - end, - - UnionName = ic_forms:get_java_id(NewX), - WiredUnionName = ic_forms:get_id2(NewX), - N2 = [UnionName ++ "Package"|N], - %%?PRINTDEBUG2("Recursive call over type ~p", - %% [[ic_forms:get_type(NewX)]]), - ic_jbe:gen(G, N, [ic_forms:get_type(NewX)]), - %%?PRINTDEBUG2("Recursive call over body: ~p", - %% [ic_forms:get_body(NewX)]), - ic_jbe:gen(G, N2, ic_forms:get_body(NewX)), - - emit_union_class(G, N, NewX, UnionName), - emit_holder_class(G, N, NewX, UnionName), - emit_helper_class(G, N, NewX, UnionName, WiredUnionName); -gen(_G, _N, _X) -> - ok. - - -%%----------------------------------------------------------------- -%% Internal functions -%%----------------------------------------------------------------- - -%%----------------------------------------------------------------- -%% Func: emit_union_class/4 -%%----------------------------------------------------------------- -emit_union_class(G, N, X, UnionName) -> - {Fd, _} = ic_file:open_java_file(G, N, UnionName), - - DiscrType = ic_java_type:getType(G, [UnionName ++ "Package"|N], - ic_forms:get_type(X)), - - MList = union_member_list(G, N, X, DiscrType), - - ic_codegen:emit(Fd, "final public class ~s {\n",[UnionName]), - - ic_codegen:emit(Fd, " // instance variables\n", []), - ic_codegen:emit(Fd, " private boolean _initialized;\n", []), - ic_codegen:emit(Fd, " private ~s _discriminator;\n", [DiscrType]), - ic_codegen:emit(Fd, " private java.lang.Object _value;\n", []), - - {tk_union,_, _,DiscrTk, _, _} = ic_forms:get_tk(X), - - DV = get_default_val(G, [UnionName |N], DiscrType, DiscrTk, MList), - - case DV of - none -> %% all values in case - ok; - _ -> - ic_codegen:emit(Fd, " private ~s _default = ~s;\n", - [DiscrType, DV]) - end, - - ic_codegen:nl(Fd), - ic_codegen:emit(Fd, " // constructors\n", []), - - ic_codegen:emit(Fd, " public ~s() {\n", [UnionName]), - ic_codegen:emit(Fd, " _initialized = false;\n", []), - ic_codegen:emit(Fd, " _value = null;\n", []), - ic_codegen:emit(Fd, " }\n", []), - ic_codegen:nl(Fd), - - ic_codegen:emit(Fd, " // discriminator access\n", []), - - ic_codegen:emit(Fd, " public ~s discriminator() " - "throws java.lang.Exception {\n", [DiscrType]), - ic_codegen:emit(Fd, " if (!_initialized) {\n", []), - ic_codegen:emit(Fd, " throw new java.lang.Exception(\"\");\n",[]), - ic_codegen:emit(Fd, " }\n", []), - ic_codegen:emit(Fd, " return _discriminator;\n", []), - ic_codegen:emit(Fd, " }\n", []), - ic_codegen:nl(Fd), - - emit_union_members_functions(G, [UnionName ++ "Package"|N], X, - Fd, UnionName, DiscrType, MList, MList), - ic_codegen:nl(Fd), - - ic_codegen:emit(Fd, "}\n", []), - file:close(Fd). - -%%----------------------------------------------------------------- -%% Func: emit_holder_class/4 -%%----------------------------------------------------------------- -emit_holder_class(G, N, _X, UnionName) -> - UName = string:concat(UnionName, "Holder"), - {Fd, _} = ic_file:open_java_file(G, N, UName), - - ic_codegen:emit(Fd, "final public class ~sHolder {\n",[UnionName]), - - ic_codegen:emit(Fd, " // instance variables\n"), - ic_codegen:emit(Fd, " public ~s value;\n", [UnionName]), - ic_codegen:nl(Fd), - - ic_codegen:emit(Fd, " // constructors\n"), - ic_codegen:emit(Fd, " public ~sHolder() {}\n", [UnionName]), - ic_codegen:emit(Fd, " public ~sHolder(~s initial) {\n", - [UnionName, UnionName]), - ic_codegen:emit(Fd, " value = initial;\n"), - ic_codegen:emit(Fd, " }\n"), - ic_codegen:nl(Fd), - - ic_codegen:emit(Fd, " // methods\n"), - - ic_codegen:emit(Fd, " public void _marshal(~sOtpOutputStream out) throws java.lang.Exception {\n", - [?ERLANGPACKAGE]), - ic_codegen:emit(Fd, " ~sHelper.marshal(out, value);\n", [UnionName]), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public void _unmarshal(~sOtpInputStream in) throws java.lang.Exception {\n", - [?ERLANGPACKAGE]), - ic_codegen:emit(Fd, " value = ~sHelper.unmarshal(in);\n", [UnionName]), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, "}\n"), - file:close(Fd). - - -%%----------------------------------------------------------------- -%% Func: emit_helper_class/4 -%%----------------------------------------------------------------- -emit_helper_class(G, N, X, UnionName, WiredUnionName) -> - UName = string:concat(UnionName, "Helper"), - {Fd, _} = ic_file:open_java_file(G, N, UName), - - DiscrType = ic_java_type:getType(G, [ UnionName ++ "Package" |N], - ic_forms:get_type(X)), - - ic_codegen:emit(Fd, "public class ~sHelper {\n",[UnionName]), - - ic_codegen:emit(Fd, " // constructors\n", []), - ic_codegen:emit(Fd, " private ~sHelper() {}\n", [UnionName]), - ic_codegen:nl(Fd), - - ic_codegen:emit(Fd, " // methods\n", []), - MList = union_member_list(G, N, X, DiscrType), - - ic_codegen:emit(Fd, " public static void marshal(~sOtpOutputStream _out, ~s _value)\n", - [?ERLANGPACKAGE, UnionName]), - ic_codegen:emit(Fd, " throws java.lang.Exception {\n\n"), - emit_union_marshal_function(G, N, X, Fd, UnionName, WiredUnionName, MList), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public static ~s unmarshal(~sOtpInputStream _in)\n", - [UnionName, ?ERLANGPACKAGE]), - ic_codegen:emit(Fd, " throws java.lang.Exception {\n\n"), - emit_union_unmarshal_function(G, N, X, Fd, UnionName, WiredUnionName, MList), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public static String id() {\n"), - ic_codegen:emit(Fd, " return ~p;\n",[ictk:get_IR_ID(G, N, X)]), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public static String name() {\n"), - ic_codegen:emit(Fd, " return ~p;\n",[UnionName]), - ic_codegen:emit(Fd, " }\n\n"), - - ic_jbe:emit_type_function(G, N, X, Fd), - - - ic_codegen:emit(Fd, " public static void insert(~sAny _any, ~s _this)\n", - [?ICPACKAGE,UnionName]), - ic_codegen:emit(Fd, " throws java.lang.Exception {\n\n"), - - ic_codegen:emit(Fd, " ~sOtpOutputStream _os = \n",[?ERLANGPACKAGE]), - ic_codegen:emit(Fd, " new ~sOtpOutputStream();\n\n",[?ERLANGPACKAGE]), - - ic_codegen:emit(Fd, " _any.type(type());\n"), - ic_codegen:emit(Fd, " marshal(_os, _this);\n"), - ic_codegen:emit(Fd, " _any.insert_Streamable(_os);\n"), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public static ~s extract(~sAny _any)\n", - [UnionName,?ICPACKAGE]), - ic_codegen:emit(Fd, " throws java.lang.Exception {\n\n"), - - ic_codegen:emit(Fd, " return unmarshal(_any.extract_Streamable());\n"), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " public static int discriminatorAsInt(~s _discriminator)\n", - [DiscrType]), - ic_codegen:emit(Fd, " throws java.lang.Exception {\n"), - emit_discriminator_as_int(G, N, ic_forms:get_type(X), Fd), - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, "}\n"), - file:close(Fd). - -%%----------------------------------------------------------------- -%% Func: emit_union_members_functions/7 -%%----------------------------------------------------------------- -emit_union_members_functions(_, _, _, _, _, _, [], _) -> - ok; -emit_union_members_functions(G, N, X, Fd, UnionName, DiscrType, - [{Label, Case, TypeDef, Id, Ls} | MList], MListTot) -> - - CaseId = Case#case_dcl.id, %% Maybe Array - CaseType = Case#case_dcl.type, %% Maybe Sequence - - Type = if element(1,CaseId) == array -> - ic_java_type:getType(G, N, TypeDef) ++ - ic_java_type:getdim(CaseId#array.size); - true -> - ic_java_type:getType(G, N, TypeDef) - end, - - HolderType = - if element(1,CaseId) == array -> - ic_java_type:getHolderType(G, N, CaseId); - true -> - if element(1,CaseType) == sequence -> - ic_util:to_dot(G,[Id|N]) ++"Holder"; - true -> - ic_java_type:getHolderType(G, N, TypeDef) - end - end, - - %% - %% Set method - %% - ic_codegen:emit(Fd, " // ~s access and set functions\n",[Id]), - ic_codegen:emit(Fd, " public void ~s(~s value) " - "throws java.lang.Exception {\n", - [Id, Type]), - ic_codegen:emit(Fd, " _initialized = true;\n", []), - case Label of - "default" -> - ic_codegen:emit(Fd, " _discriminator = (~s) _default;\n", - [DiscrType]); - _ -> - case ic_java_type:isBasicType(G, N, ic_forms:get_type(X)) of - true -> - ic_codegen:emit(Fd, " _discriminator = (~s) " - "~s;\n", - [DiscrType, Label]); - _ -> - ic_codegen:emit(Fd, " _discriminator = (~s) " - "~s.~s;\n", - [DiscrType, DiscrType, Label]) - end - end, - ic_codegen:emit(Fd, " _value = new ~s(value);\n", - [HolderType]), - ic_codegen:emit(Fd, " }\n", []), - - %% - %% Check this entry has more than one label and the generate an extra set method. - %% - case Ls of - [] -> - ok; - _ -> - ic_codegen:emit(Fd, " public void ~s(~s discriminator, ~s value) " - "throws java.lang.Exception {\n", - [Id, DiscrType, Type]), - ic_codegen:emit(Fd, " _initialized = true;\n", []), - ic_codegen:emit(Fd, " _discriminator = (~s) discriminator;\n", - [DiscrType]), - ic_codegen:emit(Fd, " _value = new ~s(value);\n", - [HolderType]), - ic_codegen:emit(Fd, " }\n", []) - end, - - %% - %% Get method - %% - ic_codegen:emit(Fd, " public ~s ~s() throws java.lang.Exception {\n", - [Type, Id]), - ic_codegen:emit(Fd, " if (!_initialized) {\n", []), - ic_codegen:emit(Fd, " throw new java.lang.Exception(\"\");\n",[]), - ic_codegen:emit(Fd, " }\n", []), - ic_codegen:emit(Fd, " switch (~sHelper.discriminatorAsInt" - "(discriminator())) {\n", - [UnionName]), - if - Label == "default" -> - ic_codegen:emit(Fd, " default:\n", []), - ic_codegen:emit(Fd, " break;\n", []), - emit_default_access_fun_switch_cases(G, N, X, Fd, DiscrType, - MListTot), - ic_codegen:emit(Fd, " throw new java.lang.Exception(\"\");\n", []); - true -> - ic_codegen:emit(Fd, " case ~s:\n", - [get_case_as_int(G, N, ic_forms:get_type(X), - DiscrType, Label)]), - ic_codegen:emit(Fd, " break;\n", []), - ic_codegen:emit(Fd, " default:\n", []), - ic_codegen:emit(Fd, " throw new java.lang.Exception(\"\");\n", []) - end, - ic_codegen:emit(Fd, " }\n", []), - - ic_codegen:emit(Fd, " return ((~s) _value).value;\n", - [HolderType]), - ic_codegen:emit(Fd, " }\n", []), - ic_codegen:nl(Fd), - emit_union_members_functions(G, N, X, Fd, UnionName, DiscrType, MList, - MListTot). - - -%%----------------------------------------------------------------- -%% Func: emit_default_access_fun_switch_cases/6 -%%----------------------------------------------------------------- -emit_default_access_fun_switch_cases(_G, _N, _X, _Fd, _DiscrType, []) -> - ok; -emit_default_access_fun_switch_cases(G, N, X, Fd, DiscrType, - [{"default", _, _, _, _} |MList]) -> - emit_default_access_fun_switch_cases(G, N, X, Fd, DiscrType, MList); -emit_default_access_fun_switch_cases(G, N, X, Fd, DiscrType, - [{Label, _Case, _TypeDef, _Id, _} | MList]) -> - ic_codegen:emit(Fd, " case ~s:\n", - [get_case_as_int(G, N, ic_forms:get_type(X), - DiscrType, Label)]), - emit_default_access_fun_switch_cases(G, N, X, Fd, DiscrType, MList). - - - -%%----------------------------------------------------------------- -%% Func: emit_union_unmarshal_function/5 -%%----------------------------------------------------------------- -emit_union_unmarshal_function(G, N, X, Fd, UnionName, WiredUnionName, MList) -> - DiscrTypeForm = ic_forms:get_type(X), - DiscrType = ic_java_type:getType(G, [UnionName ++ "Package"|N], - DiscrTypeForm), - - ic_codegen:emit(Fd, " _in.read_tuple_head();\n\n"), - - ic_codegen:emit(Fd, " if ((_in.read_atom()).compareTo(~p) != 0)\n", - [ic_util:to_undersc([WiredUnionName|N])]), - ic_codegen:emit(Fd, " throw new java.lang.Exception(\"\");\n\n",[]), - - ic_codegen:emit(Fd, " ~s _value = new ~s();\n", [UnionName, UnionName]), - - %% Decode discriminator - case ic_java_type:isBasicType(G, N, DiscrTypeForm) of - true -> - ic_codegen:emit(Fd, " ~s _discriminator = _in~s;\n\n", - [DiscrType, - ic_java_type:unMarshalFun(G, N, X, DiscrTypeForm)]); - _ -> - ic_codegen:emit(Fd, " ~s _discriminator = ~s.unmarshal(_in);\n\n", - [DiscrType,ic_java_type:getUnmarshalType(G, N, X, DiscrTypeForm)]) - end, - - ic_codegen:emit(Fd, " switch (~sHelper.discriminatorAsInt(_discriminator)) {\n", - [UnionName]), - - emit_union_unmarshal_function_loop(G, [UnionName ++ "Package"|N], X, - Fd, DiscrType, MList), - - ic_codegen:emit(Fd, " }\n\n"), - - ic_codegen:emit(Fd, " return _value;\n"). - -%%----------------------------------------------------------------- -%% Func: emit_union_unmarshal_function_loop/6 -%%----------------------------------------------------------------- -emit_union_unmarshal_function_loop(_, _, _, _, _, []) -> - ok; -emit_union_unmarshal_function_loop(G, N, X, Fd, DiscrType, - [{Label, Case, Type, Id, Ls} |MList]) -> - case Label of - "default" -> - ic_codegen:emit(Fd, " default:\n"); - _ -> - ic_codegen:emit(Fd, " case ~s:\n", - [get_case_as_int(G, N, ic_forms:get_type(X), - DiscrType, Label)]) - end, - - gen_multiple_cases(G, N, X, Fd, DiscrType, Ls), - - CaseId = Case#case_dcl.id, %% Maybe Array - CaseType = Case#case_dcl.type, %% Maybe Sequence - - case element(1,CaseId) of - array -> - ic_codegen:emit(Fd, " _value.~s(~s.unmarshal(_in));\n", - [Id, - ic_java_type:getUnmarshalType(G, N, Case, CaseId)]); - - _ -> - case element(1, CaseType) of - sequence -> - ic_codegen:emit(Fd, " _value.~s(~s.unmarshal(_in));\n", - [Id, - ic_java_type:getUnmarshalType(G, N, Case, CaseType)]); - _ -> - case ic_java_type:isBasicType(G, N, CaseType) of - true -> - ic_codegen:emit(Fd, " _value.~s(_in~s);\n", - [Id, - ic_java_type:unMarshalFun(G, N, X, Type)]); - false -> - ic_codegen:emit(Fd, " _value.~s(~s.unmarshal(_in));\n", - [Id, - ic_java_type:getUnmarshalType(G, N, X, Type)]) - end - end - end, - - ic_codegen:emit(Fd, " break;\n", []), - emit_union_unmarshal_function_loop(G, N, X, Fd, DiscrType, MList). - - - - - -%%----------------------------------------------------------------- -%% Func: emit_union_marshal_function/6 -%%----------------------------------------------------------------- -emit_union_marshal_function(G, N, X, Fd, UnionName, WiredUnionName, MList) -> - - DiscrTypeForm = ic_forms:get_type(X), - DiscrType = ic_java_type:getType(G, [UnionName ++ "Package" |N], - DiscrTypeForm), - - ic_codegen:emit(Fd, " _out.write_tuple_head(3);\n"), - ic_codegen:emit(Fd, " _out.write_atom(~p);\n", - [ic_util:to_undersc([WiredUnionName|N])]), - - case ic_java_type:isBasicType(G, N, DiscrTypeForm) of - true -> - ic_codegen:emit(Fd, " _out~s(_value.discriminator());\n\n", - [ic_java_type:marshalFun(G, N, X, DiscrTypeForm)]); - false -> - ic_codegen:emit(Fd, " ~s(_out, _value.discriminator());\n\n", - [ic_java_type:marshalFun(G, N, X, DiscrTypeForm)]) - end, - - ic_codegen:emit(Fd, " switch(~sHelper.discriminatorAsInt(_value.discriminator())) {\n", - [UnionName]), - - emit_union_marshal_function_loop(G, - [ UnionName ++ "Package"|N], - X, - Fd, - DiscrType, - MList), - - ic_codegen:emit(Fd, " }\n\n", []). - - -%%----------------------------------------------------------------- -%% Func: emit_union_marshal_function_loop/ -%%----------------------------------------------------------------- -emit_union_marshal_function_loop(_, _, _, _, _, []) -> - ok; -emit_union_marshal_function_loop(G, N, X, Fd, DiscrType, - [{Label, Case, Type, Id, Ls} |MList]) -> - case Label of - "default" -> - ic_codegen:emit(Fd, " default:\n", - []); - _ -> - ic_codegen:emit(Fd, " case ~s:\n", - [get_case_as_int(G, N, ic_forms:get_type(X), - DiscrType, Label)]) - end, - - gen_multiple_cases(G, N, X, Fd, DiscrType, Ls), - - - CaseId = Case#case_dcl.id, %% Maybe Array - CaseType = Case#case_dcl.type, %% Maybe Sequence - - case element(1,CaseId) of - array -> - ic_codegen:emit(Fd, " ~s(_out, _value.~s());\n", - [ic_java_type:marshalFun(G, N, Case, CaseId), - Id]); - _ -> - case element(1, CaseType) of - sequence -> - ic_codegen:emit(Fd, " ~s.marshal(_out, _value.~s());\n", - [ic_util:to_dot(G,[Id|N]) ++ "Helper", - Id]); - _ -> - case ic_java_type:isBasicType(G, N, CaseType) of - true -> - ic_codegen:emit(Fd, " _out~s(_value.~s());\n", - [ic_java_type:marshalFun(G, N, X, Type), - Id]); - false -> - ic_codegen:emit(Fd, " ~s(_out, _value.~s());\n", - [ic_java_type:marshalFun(G, N, X, Type), - Id]) - end - end - end, - - ic_codegen:emit(Fd, " break;\n", []), - emit_union_marshal_function_loop(G, N, X, Fd, DiscrType, MList). - - - -gen_multiple_cases(_G, _N, _X, _Fd, _DiscrType, []) -> - ok; -gen_multiple_cases(G, N, X, Fd, DiscrType, [Label |Ls]) -> - ic_codegen:emit(Fd, " case ~s:\n", - [get_case_as_int(G, N, ic_forms:get_type(X), - DiscrType, getLabel(DiscrType, Label))]), - gen_multiple_cases(G, N, X, Fd, DiscrType, Ls). - - -%%----------------------------------------------------------------- -%% Func: union_member_list/3 -%%----------------------------------------------------------------- -union_member_list(G, N, X, DiscrType) -> - M = lists:map( - fun(Case) -> - {Label, LabelList} = case check_default(ic_forms:get_idlist(Case)) of - {{default, C}, List} -> - {{default, C}, List}; - {L, []} -> - {L, []}; - {_, [L |Ls]} -> - {L, Ls} - end, - - CName = ic_forms:get_java_id(Case), - CId = Case#case_dcl.id, - CType = Case#case_dcl.type, - - if element(1,CId) == array -> - N2 = [ic_forms:get_id2(X) ++ "Package" |N], - ic_array_java:gen(G, N2, Case, CId); - true -> - if element(1,Case#case_dcl.type) == sequence -> - N2 = [ic_forms:get_id2(X) ++ "Package" |N], - ic_sequence_java:gen(G, N2, CType, CName); - true -> - ok - end - end, - - {getLabel(DiscrType, Label), - Case, - ic_forms:get_type(Case), - CName, - LabelList} - end, - ic_forms:get_body(X)), - lists:flatten(M). - -check_default([]) -> - {false, []}; -check_default([{default, X} |Ls]) -> - {{default, X}, Ls}; -check_default([L]) -> - {false, [L]}; -check_default([L |Ls]) -> - {X, Y} = check_default(Ls), - {X, [L | Y]}. - -getLabel(_, {'<integer_literal>', _, N}) -> - N; -getLabel(_, {'<character_literal>', _, N}) -> - "'" ++ N ++ "'"; -getLabel(_, {'<wcharacter_literal>', _, N}) -> - "'" ++ N ++ "'"; -getLabel(_, {'TRUE',_}) -> - "true"; -getLabel(_, {'FALSE',_}) -> - "true"; -getLabel(_, {default, _}) -> - "default"; -getLabel(_DiscrType, X) -> %%DiscrType ++ "." ++ - ic_util:to_dot(ic_forms:get_id(X)). - -get_default_val(G, N, _, tk_short, MList) -> - integer_default_val(G, N, 1, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, _, tk_long, MList) -> - integer_default_val(G, N, 1, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, _, tk_ushort, MList) -> - integer_default_val(G, N, 1, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, _, tk_ulong, MList) -> - integer_default_val(G, N, 1, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, _, tk_char, MList) -> - char_default_val(G, N, $a, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, _, tk_boolean, MList) -> - boolean_default_val(G, N, lists:map(fun({V, _, _, _, _}) -> V end, MList)); -get_default_val(G, N, DiscrType, {tk_enum, _, _, Values}, MList) -> - enum_default_val(G, N, DiscrType, Values, MList). - -integer_default_val(G, N, Num, MList) -> - Num2 = integer_to_list(Num), - case lists:member(Num2, MList) of - true -> - integer_default_val(G, N, Num + 1, MList); - false -> - Num2 - end. - -char_default_val(G, N, CharNum, MList) -> - Str = "'", - CharNum2 = Str ++ [CharNum | Str], - case lists:member(CharNum2, MList) of - true -> - char_default_val(G, N, CharNum + 1, MList); - false -> - CharNum2 - end. - -boolean_default_val(G, N, MList) -> - if - length(MList) > 2 -> - ic_error:error(G, {plain_error_string, - lists:flatten( - io_lib:format("Default value found while all values have label on ~s", - [ic_util:to_colon(N)]))}), - none; - true -> - case MList of - ["true"] -> - "false"; - ["false"] -> - "true"; - ["default","true"] -> - "false"; - ["true","default"] -> - "false"; - ["default","false"] -> - "true"; - ["false","default"] -> - "true"; - _ -> - none - end - end. - - - - -enum_default_val(G, N, DiscrType, Values, Mlist) -> - - VLen = length(Values), - MLen = length(Mlist), - - case MLen > VLen of - true -> - ic_error:error(G, {plain_error_string, - lists:flatten( - io_lib:format("Default value found while all values have label on ~s", - [ic_util:to_colon(N)]))}), - none; - false -> - enum_default_val_loop(G, N, DiscrType, Values, Mlist) - end. - -enum_default_val_loop(_G, _N, _, [], []) -> - none; -enum_default_val_loop(_G, _N, DiscrType, [Value| _], []) -> - DiscrType ++ "." ++ Value; -enum_default_val_loop(G, N, DiscrType, Values, [Case | MList]) when is_tuple(Case) -> - NewValues = lists:delete(element(1,Case), Values), - enum_default_val_loop(G, N, DiscrType, NewValues, MList). - - - -emit_discriminator_as_int(G, N, T, Fd) -> - case ictype:isBoolean(G,N,T) of - true -> - ic_codegen:emit(Fd, " if(_discriminator)\n", []), - ic_codegen:emit(Fd, " return 1;\n", []), - ic_codegen:emit(Fd, " else\n", []), - ic_codegen:emit(Fd, " return 0;\n", []); - false -> - case ictype:isEnum(G, N, T) of - true -> - ic_codegen:emit(Fd, " return _discriminator.value();\n", - []); - false -> - ic_codegen:emit(Fd, " return _discriminator;\n", []) - end - end. - - -get_case_as_int(G, N, T, DiscrJavaTypeName, Label) -> - case ictype:isBoolean(G,N,T) of - true -> - case Label of - "true" -> - "1"; - "false" -> - "0" - end; - false -> - case ictype:isEnum(G, N, T) of - true -> - DiscrJavaTypeName ++ "._" ++ Label; - false -> - "(" ++ DiscrJavaTypeName ++ ") " ++ Label - end - end. - - - |