From 246470bd7492f97ca4b7528b3c1c4ed76b91d4e0 Mon Sep 17 00:00:00 2001 From: Anders Svensson Date: Sat, 3 Dec 2011 11:54:16 +0100 Subject: Minor codegen tweaks --- lib/diameter/src/compiler/diameter_codegen.erl | 49 ++++++++++++++------------ 1 file changed, 27 insertions(+), 22 deletions(-) (limited to 'lib/diameter/src') diff --git a/lib/diameter/src/compiler/diameter_codegen.erl b/lib/diameter/src/compiler/diameter_codegen.erl index b3af326049..3105310c5b 100644 --- a/lib/diameter/src/compiler/diameter_codegen.erl +++ b/lib/diameter/src/compiler/diameter_codegen.erl @@ -48,6 +48,13 @@ %% =========================================================================== +-spec from_dict(File, Spec, Opts, Mode) + -> ok + when File :: string(), + Spec :: orddict:orddict(), + Opts :: list(), + Mode :: spec | erl | hrl. + from_dict(File, Spec, Opts, Mode) -> Outdir = proplists:get_value(outdir, Opts, "."), putr(verbose, lists:member(verbose, Opts)), @@ -114,15 +121,11 @@ mod(_, {ok, Mod}) -> Mod. gen(spec, Spec, _Mod, Path) -> - write(Path ++ ".spec", Spec); + write(Path ++ ".spec", [?VERSION | Spec]); gen(hrl, Spec, Mod, Path) -> gen_hrl(Path ++ ".hrl", Mod, Spec); -gen(erl = Mode, Spec, Mod, Path) - when is_list(Mod) -> - gen(Mode, Spec, ?A(Mod), Path); - gen(erl, Spec, Mod, Path) -> Forms = [{?attribute, module, Mod}, {?attribute, compile, [{parse_transform, diameter_exprecs}]}, @@ -259,11 +262,11 @@ c_id(error) -> f_vendor_id(Spec) -> {?function, vendor_id, 0, - [{?clause, [], [], [vendor_id(orddict:find(vendor, Spec))]}]}. + [{?clause, [], [], [b_vendor_id(orddict:find(vendor, Spec))]}]}. -vendor_id({ok, {Id, _}}) -> +b_vendor_id({ok, {Id, _}}) -> ?INTEGER(Id); -vendor_id(error) -> +b_vendor_id(error) -> ?APPLY(erlang, error, [?TERM(undefined)]). %%% ------------------------------------------------------------------------ @@ -272,11 +275,11 @@ vendor_id(error) -> f_vendor_name(Spec) -> {?function, vendor_name, 0, - [{?clause, [], [], [vendor_name(orddict:find(vendor, Spec))]}]}. + [{?clause, [], [], [b_vendor_name(orddict:find(vendor, Spec))]}]}. -vendor_name({ok, {_, Name}}) -> +b_vendor_name({ok, {_, Name}}) -> ?Atom(Name); -vendor_name(error) -> +b_vendor_name(error) -> ?APPLY(erlang, error, [?TERM(undefined)]). %%% ------------------------------------------------------------------------ @@ -290,8 +293,9 @@ f_msg_name(Spec) -> %% DIAMETER_COMMAND_UNSUPPORTED should be replied. msg_name(Spec) -> - lists:flatmap(fun c_msg_name/1, - proplists:get_value(command_codes, Spec, [])) + lists:flatmap(fun c_msg_name/1, proplists:get_value(command_codes, + Spec, + [])) ++ [{?clause, [?VAR('_'), ?VAR('_')], [], [?ATOM('')]}]. c_msg_name({Code, Req, Ans}) -> @@ -480,15 +484,15 @@ not_in(List, X) -> c_base_avp({AvpName, T}) -> {?clause, [?VAR('T'), ?VAR('Data'), ?Atom(AvpName)], [], - [base_avp(AvpName, T)]}. + [b_base_avp(AvpName, T)]}. -base_avp(AvpName, "Enumerated") -> +b_base_avp(AvpName, "Enumerated") -> ?CALL(enumerated_avp, [?VAR('T'), ?Atom(AvpName), ?VAR('Data')]); -base_avp(AvpName, "Grouped") -> +b_base_avp(AvpName, "Grouped") -> ?CALL(grouped_avp, [?VAR('T'), ?Atom(AvpName), ?VAR('Data')]); -base_avp(_, Type) -> +b_base_avp(_, Type) -> ?APPLY(diameter_types, ?A(Type), [?VAR('T'), ?VAR('Data')]). cs_imported_avp({Mod, Avps}, Enums, CustomNames) -> @@ -522,14 +526,15 @@ cs_custom_avp({Mod, Key, Avps}, Dict) -> Avps). c_custom_avp(Mod, Key, AvpName, Type) -> + {F,A} = custom(Key, AvpName, Type), {?clause, [?VAR('T'), ?VAR('Data'), ?Atom(AvpName)], [], - [custom(Mod, Key, AvpName, Type)]}. + [?APPLY(?A(Mod), ?A(F), [?VAR('T'), ?Atom(A), ?VAR('Data')])]}. -custom(Mod, custom_types, AvpName, Type) -> - ?APPLY(?A(Mod), ?A(AvpName), [?VAR('T'), ?Atom(Type), ?VAR('Data')]); -custom(Mod, codecs, AvpName, Type) -> - ?APPLY(?A(Mod), ?A(Type), [?VAR('T'), ?Atom(AvpName), ?VAR('Data')]). +custom(custom_types, AvpName, Type) -> + {AvpName, Type}; +custom(codecs, AvpName, Type) -> + {Type, AvpName}. %%% ------------------------------------------------------------------------ %%% # enumerated_avp/3 -- cgit v1.2.3