diff options
Diffstat (limited to 'lib/wx/api_gen/wx_gen_erl.erl')
-rw-r--r-- | lib/wx/api_gen/wx_gen_erl.erl | 310 |
1 files changed, 157 insertions, 153 deletions
diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl index e1201ab0d4..e882ae87ca 100644 --- a/lib/wx/api_gen/wx_gen_erl.erl +++ b/lib/wx/api_gen/wx_gen_erl.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2008-2010. All Rights Reserved. +%% Copyright Ericsson AB 2008-2011. All Rights Reserved. %% %% 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 @@ -19,7 +19,7 @@ %%%------------------------------------------------------------------- %%% File : wx_gen_erl.erl %%% Author : Dan Gudmundsson <[email protected]> -%%% Description : +%%% Description : %%% %%% Created : 25 Jan 2007 by Dan Gudmundsson <[email protected]> %%%------------------------------------------------------------------- @@ -32,7 +32,7 @@ -import(lists, [foldl/3,foldr/3,reverse/1, keysearch/3, map/2, filter/2]). -import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, uppercase_all/1, - open_write/1, close/0, erl_copyright/0, w/2, + open_write/1, close/0, erl_copyright/0, w/2, args/3, args/4, strip_name/2]). gen(Defs) -> @@ -42,9 +42,9 @@ gen(Defs) -> gen_enums_ints(), [gen_class(Class) || Class <- Defs], gen_funcnames(). - + gen_class(Class) -> - try + try gen_class1(Class) catch throw:skipped -> Class @@ -52,10 +52,10 @@ gen_class(Class) -> gen_class1(C=#class{name=Name,parent="static",methods=Ms,options=_Opts}) -> open_write("../src/gen/wx_misc.erl"), - put(current_class, Name), + put(current_class, Name), erl_copyright(), w("", []), - w("%% This file is generated DO NOT EDIT~n~n", []), + w("%% This file is generated DO NOT EDIT~n~n", []), w("%% @doc See external documentation: " "<a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html\">Misc</a>.\n\n",[]), @@ -67,8 +67,8 @@ gen_class1(C=#class{name=Name,parent="static",methods=Ms,options=_Opts}) -> Exp = fun(M) -> gen_export(C,M) end, ExportList = lists:usort(lists:append(lists:map(Exp,reverse(Ms)))), w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", ExportList, 60)]), - - + + Gen = fun(M) -> gen_method(Name,M) end, NewMs = lists:map(Gen,reverse(Ms)), close(), @@ -79,13 +79,13 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> case Opts of ["ignore"] -> throw(skipped); _ -> ok - end, + end, open_write("../src/gen/"++Name++".erl"), - put(current_class, Name), + put(current_class, Name), erl_copyright(), w("", []), - w("%% This file is generated DO NOT EDIT~n~n", []), - + w("%% This file is generated DO NOT EDIT~n~n", []), + case lists:member(taylormade, Opts) of true -> {ok, Bin} = file:read_file(filename:join([wx_extra, Name++".erl"])), @@ -95,33 +95,33 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> w("%% @doc See external documentation: " "<a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html\">~s</a>.\n", [lowercase_all(Name), Name]), - + case C#class.doc of undefined -> ignore; Str -> w("%%~n%% ~s~n~n%%~n", [Str]) end, - + case C#class.event of false -> ignore; Evs -> EvTypes = [event_type_name(Ev) || Ev <- Evs], EvStr = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes), - + w("%% <dl><dt>Use {@link wxEvtHandler:connect/3.} with EventType:</dt>~n",[]), w("%% <dd>~s</dd></dl>~n", [EvStr]), - w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n", + w("%% See also the message variant {@link wxEvtHandler:~s(). #~s{}} event record type.~n", [event_rec_name(Name),event_rec_name(Name)]), w("%%~n",[]), ok end, - + Parents = parents(Parent), case [P || P <- Parents, P =/= root, P =/= object] of [] -> ignore; - Ps -> + Ps -> w("%% <p>This class is derived (and can use functions) from:~n", []), [w("%% <br />{@link ~s}~n", [P]) || P <- Ps], - w("%% </p>~n",[]) + w("%% </p>~n",[]) end, w("%% @type ~s(). An object reference, The representation is internal~n",[Name]), w("%% and can be changed without notice. It can't be used for comparsion~n", []), @@ -137,17 +137,17 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> Done0 = ["Destroy", "New", "Create", "destroy", "new", "create"], Done = gb_sets:from_list(Done0 ++ [M|| #method{name=M} <- lists:append(Ms)]), {_, InExported} = gen_inherited(Parents, Done, []), - w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", - lists:usort(["parent_class/1"|InExported]), + w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", + lists:usort(["parent_class/1"|InExported]), 60)]), - + w("%% @hidden~n", []), parents_check(Parents), - + Gen = fun(M) -> gen_method(Name,M) end, NewMs = lists:map(Gen,reverse(Ms)), - gen_dest(C, Ms), - + gen_dest(C, Ms), + gen_inherited(Parents, Done, true) end, @@ -203,26 +203,26 @@ gen_export(#class{name=Class,abstract=Abs},Ms0) -> [] -> []; [M=#method{where=taylormade}|_] -> [taylormade_export(Class, M)]; - Ms -> + Ms -> GetF = fun(#method{method_type=constructor,where=W,params=Ps}) -> {Args,Opts} = split_optional(Ps), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, "new/" ++ integer_to_list(length(Args)+OptLen); (#method{method_type=destructor}) -> - case Abs of - true -> []; + case Abs of + true -> []; _ -> "destroy/1" end; (#method{name=N,alias=A,where=W, params=Ps}) -> {Args,Opts} = split_optional(Ps), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, erl_func_name(N,A) ++ "/" ++ integer_to_list(length(Args) + OptLen) end, @@ -235,10 +235,10 @@ gen_method(Class,Ms0) -> Res = filter(RemoveC, Ms0), case Res of [] -> Ms0; - [M=#method{where=taylormade}|_] -> - taylormade_func(Class, M), + [#method{where=taylormade}|_] -> + taylormade_func(Class, Res), Ms0; - Ms -> + Ms -> gen_doc(Class,Ms), gen_method1(Ms), Ms0 @@ -279,22 +279,22 @@ gen_method2(M=#method{name=N,alias=A,params=Ps,type=T,method_type=MT,id=MethodId ignore -> skip; _ -> w(" _Result =", []) end, - + case have_return_vals(T, Ps) of _ when MT =:= constructor -> w(" wxe_util:construct(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]); true -> w(" wxe_util:call(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]); - false -> + false -> w(" wxe_util:cast(~s,~n <<~s~s>>)", [MId, MArgs,MOpts]) end, case gen_util:get_hook(erl, M#method.post_hook) of ignore -> skip; - Post -> + Post -> w(",~n ~s~n", [Post]), w(" _Result", []) end, - + erase(current_func), M. @@ -306,9 +306,9 @@ gen_dest(#class{name=CName,abstract=Abs}, Ms) -> case lists:keysearch(destructor,#method.method_type, lists:append(Ms)) of {value, #method{method_type=destructor, id=Id}} -> case hd(reverse(parents(CName))) of - object -> + object -> gen_dest2(CName, object); - root -> + root -> gen_dest2(CName, Id) end; false -> @@ -320,7 +320,7 @@ gen_dest2(Class, Id) -> w("%% @spec (This::~s()) -> ok~n", [Class]), w("%% @doc Destroys this object, do not use object again~n", []), w("destroy(Obj=#wx_ref{type=Type}) ->~n", []), - w(" ?CLASS(Type,~s),~n",[Class]), + w(" ?CLASS(Type,~s),~n",[Class]), case Id of object -> w(" wxe_util:destroy(?DESTROY_OBJECT,Obj),~n ok.~n", []); @@ -341,14 +341,14 @@ gen_inherited([Parent|Ps], Done0, Exported0) -> gen_inherited(Ps, gb_sets:union(Done,Done0), Exported). gen_inherited_ms([[#method{name=Name,alias=A,params=Ps0,where=W,method_type=MT}|_]|R], - Class,Skip,Done, Exported) - when W =/= merged_c -> + Class,Skip,Done, Exported) + when W =/= merged_c -> case gb_sets:is_member(Name,Skip) of false when MT =:= member, Exported =:= true -> Ps = [patch_param(P,all) || P <- Ps0], Opts = if W =:= erl_no_opt -> []; - true -> - [Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps, + true -> + [Opt || Opt = #param{def=Def,in=In, where=Where} <- Ps, Def =/= none, In =/= false, Where =/= c] end, w("%% @hidden~n", []), @@ -359,10 +359,10 @@ gen_inherited_ms([[#method{name=Name,alias=A,params=Ps0,where=W,method_type=MT}| gen_inherited_ms(R,Class, Skip, gb_sets:add(Name,Done), Exported); false when MT =:= member, is_list(Exported) -> {Args,Opts} = split_optional(Ps0), - OptLen = case Opts of - [] -> 0; + OptLen = case Opts of + [] -> 0; _ when W =:= erl_no_opt -> 0; - _ -> 1 + _ -> 1 end, Export = erl_func_name(Name,A) ++ "/" ++ integer_to_list(length(Args) + OptLen), gen_inherited_ms(R,Class,Skip, gb_sets:add(Name,Done), [Export|Exported]); @@ -374,17 +374,21 @@ gen_inherited_ms([[_|Check]|R],Class,Skip, Done0,Exp) -> gen_inherited_ms([[]|R],Class,Skip,Done0,Exp) -> gen_inherited_ms(R,Class,Skip,Done0,Exp); gen_inherited_ms([], _, _Skip, Done,Exp) -> {Done,Exp}. - + %%%%%%%%%%%%%%% -taylormade_func(Class, #method{name=Name, id=Id}) -> +taylormade_func(Class, [#method{name=Name, id=Id}|_]) -> {ok, Bin} = file:read_file(filename:join([wx_extra, Class ++".erl"])), - Str0 = binary_to_list(Bin), - {match, [Str1]} = re:run(Str0, "<<"++Name++"(.*)"++Name++">>", - [dotall, {capture, all_but_first, list}]), - - w(Str1, ["?" ++ get_unique_name(Id)]), + Src = binary_to_list(Bin), + Str = case gen_util:get_taylor_made(Src, Name) of + nomatch -> + {match, [Str0]} = gen_util:get_taylor_made(Src, get_unique_name(Id)), + Str0; + {match, [Str0]} -> + Str0 + end, + w(Str, ["?" ++ get_unique_name(Id)]), ok. taylormade_export(Class, #method{name=Name}) -> @@ -398,12 +402,12 @@ taylormade_export(Class, #method{name=Name}) -> arg_type_tests([P|Ps], Mid0) -> case arg_type_test(P,"\n",Mid0) of - Mid0 -> + Mid0 -> arg_type_tests(Ps, Mid0); Mid -> %% Already checked the other args Mid end; -arg_type_tests([],Mid) -> Mid. +arg_type_tests([],Mid) -> Mid. arg_type_test(#param{where=c}, _, Acc) -> Acc; @@ -412,7 +416,7 @@ arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T},single=true},def Name = erl_arg_name(Name0), w(" ?CLASS(~sT,~s),~s", [Name,T,EOS]), Acc; -arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc) +arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS,Acc) when In =/= false -> Name = erl_arg_name(Name0), w(" [?CLASS(~sT,~s) || #wx_ref{type=~sT} <- ~s],~s", [Name,T,Name,Name,EOS]), @@ -420,35 +424,35 @@ arg_type_test(#param{name=Name0,in=In,type=#type{base={class,T}}, def=none},EOS, arg_type_test(#param{name=Name0,def=none,in=In, type={merged, M1, #type{base={class,T1},single=true},Ps1, - M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc) + M2, #type{base={class,T2},single=true},Ps2}}, EOS, _Acc) when In =/= false -> Name = erl_arg_name(Name0), Opname = Name++"OP", w(" ~s = case ?CLASS_T(~sT,~s) of~n true ->\n ", [Opname,Name,T1]), - lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, + lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, element(1,split_optional(Ps1))), w("?~s;~n",[get_unique_name(M1)]), w(" _ -> ?CLASS(~sT,~s),\n ",[Name,T2]), {Ps21,_} = split_optional(patchArgName(Ps2,Ps1)), - lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, + lists:foreach(fun(Param) -> arg_type_test(Param,"\n ", ignore) end, Ps21), w("?~s\n end,~s",[get_unique_name(M2),EOS]), Opname; -arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) -> +arg_type_test(#param{name=Name0, type=#type{base=eventType}}, EOS, Acc) -> Name = erl_arg_name(Name0), w(" ~sBin = list_to_binary([atom_to_list(~s)|[0]]),~s", [Name,Name,EOS]), w(" ThisTypeBin = list_to_binary([atom_to_list(ThisT)|[0]]),~s", [EOS]), Acc; -arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) -> +arg_type_test(#param{name=Name0,def=none,type=#type{base={term,_}}}, EOS, Acc) -> Name = erl_arg_name(Name0), w(" wxe_util:send_bin(term_to_binary(~s)),~s", [Name,EOS]), Acc; -arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) -> +arg_type_test(#param{name=Name0,type=#type{base=binary}},EOS,Acc) -> Name = erl_arg_name(Name0), w(" wxe_util:send_bin(~s),~s", [Name,EOS]), Acc; -arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) -> - if +arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},EOS,Acc) -> + if Type =:= "wxArtClient", Single =:= true -> Name = erl_arg_name(Name0), w(" ~s_UC = unicode:characters_to_binary([~s, $_, $C,0]),~s", @@ -458,11 +462,11 @@ arg_type_test(#param{name=Name0,type=#type{name=Type,base=Base,single=Single}},E w(" ~s_UC = unicode:characters_to_binary([~s,0]),~s", [Name,Name,EOS]); Type =:= "wxArrayString" -> Name = erl_arg_name(Name0), - w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s", + w(" ~s_UCA = [unicode:characters_to_binary([~sTemp,0]) || ~s", [Name,Name, EOS]), w(" ~sTemp <- ~s],~s", [Name,Name,EOS]); true -> %% Not a string - ignore + ignore end, Acc; arg_type_test(_,_,Acc) -> Acc. @@ -476,10 +480,10 @@ have_return_vals(void, Ps) -> have_return_vals(#type{}, _) -> true. gen_function_clause(Name0,MT,Ps,Optional,Variant) -> - PArg = fun(Arg) -> + PArg = fun(Arg) -> case lists:member(name_only, Variant) of true -> func_arg_name(Arg); - false -> + false -> case lists:member(name_type, Variant) of true -> Name = func_arg_name(Arg), @@ -495,17 +499,17 @@ gen_function_clause(Name0,MT,Ps,Optional,Variant) -> Args = args(PArg, ",", Ps), Name = case MT of constructor -> "new"; _ -> Name0 end, w("~s(~s",[Name,Args]), - Opts = case Optional of + Opts = case Optional of [] -> ""; empty_list when Args =:= [] -> "[]"; empty_list -> ", []"; _ when Args =:= [] -> "Options"; - _ -> ", Options" + _ -> ", Options" end, w("~s)", [Opts]), case lists:member(no_guards, Variant) of true -> ok; - false -> + false -> Guards = args(fun guard_test/1, ",", Ps), if Guards =:= [], Opts =:= "" -> w(" ->~n", []); @@ -517,10 +521,10 @@ gen_function_clause(Name0,MT,Ps,Optional,Variant) -> split_optional(Ps) -> split_optional(Ps, [], []). -split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) +split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) when Def =/= none, In =/= false, Where =/= c -> split_optional(Ps, Standard, [P|Opts]); -split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) +split_optional([P=#param{def=Def,in=In, where=Where}|Ps], Standard, Opts) when Def =:= none, In =/= false, Where =/= c -> split_optional(Ps, [P|Standard], Opts); split_optional([_|Ps], Standard, Opts) -> @@ -532,24 +536,24 @@ patch_param(P=#param{type=#type{base=Tuple}}, all) when is_tuple(Tuple) -> P#param{type={class,ignore}}; patch_param(P=#param{type={merged,_,_,_,_,_,_}}, _) -> P#param{type={class,ignore}}; -patch_param(P=#param{type=#type{base={class,_}}},_) -> +patch_param(P=#param{type=#type{base={class,_}}},_) -> P#param{type={class,ignore}}; -patch_param(P=#param{type=#type{base={ref,_}}},_) -> +patch_param(P=#param{type=#type{base={ref,_}}},_) -> P#param{type={class,ignore}}; patch_param(P,_) -> P. func_arg_name(#param{def=Def}) when Def =/= none -> skip; func_arg_name(#param{in=false}) -> skip; func_arg_name(#param{where=c}) -> skip; -func_arg_name(#param{name=Name}) -> +func_arg_name(#param{name=Name}) -> erl_arg_name(Name). func_arg(#param{def=Def}) when Def =/= none -> skip; func_arg(#param{in=false}) -> skip; func_arg(#param{where=c}) -> skip; -func_arg(#param{name=Name,type=#type{base=string}}) -> +func_arg(#param{name=Name,type=#type{base=string}}) -> erl_arg_name(Name); -func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) -> +func_arg(#param{name=Name,type=#type{name="wxArrayString"}}) -> erl_arg_name(Name); func_arg(#param{name=Name0,type=#type{base={class,_CN}, single=true}}) -> Name = erl_arg_name(Name0), @@ -570,7 +574,7 @@ func_arg(#param{name=Name,type=#type{base={comp,"wxDateTime",_Tup}, single=true} func_arg(#param{name=Name,type=#type{name="wxArtClient", single=true}}) -> erl_arg_name(Name); func_arg(#param{name=Name,type=#type{base={comp,_,Tup}, single=true}}) -> - N = erl_arg_name(Name), + N = erl_arg_name(Name), Doc = fun({_,V}) -> erl_arg_name(N)++V end, "{" ++ args(Doc, ",", Tup) ++ "}"; func_arg(#param{name=Name}) -> @@ -587,7 +591,7 @@ guard_test(#param{name=N, type=#type{name="wxArtClient"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; guard_test(#param{name=N, type=#type{name="wxArrayString"}}) -> "is_list(" ++ erl_arg_name(N) ++")"; -guard_test(#param{name=Name,type=#type{single=Single}}) +guard_test(#param{name=Name,type=#type{single=Single}}) when Single =/= true-> "is_list(" ++ erl_arg_name(Name) ++ ")"; guard_test(#param{name=N,type=#type{base=int}}) -> @@ -637,42 +641,42 @@ gen_doc(_Class,[#method{name=N,alias=A,params=Ps,type=T,where=erl_no_opt,method_ gen_function_clause(erl_func_name(N,A),MT,Ps,empty_list,[no_guards,name_only]); gen_doc(Class,[#method{name=N,params=Ps,type=T}])-> {_, Optional} = split_optional(Ps), - NonDef = [Arg || Arg = #param{def=Def,in=In, where=Where} <- Ps, + NonDef = [Arg || Arg = #param{def=Def,in=In, where=Where} <- Ps, Def =:= none, In =/= false, Where =/= c], OptsType = case Optional of [] -> ""; _ when NonDef =:= [] -> "[Option]"; - _ -> ", [Option]" + _ -> ", [Option]" end, w("%% @spec (~s~s) -> ~s~n", [doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]), doc_optional(Optional, normal), - DocEnum = doc_enum(T,Ps, normal), + DocEnum = doc_enum(T,Ps, normal), case Class of "utils" -> w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "external documentation</a>.~n", + "external documentation</a>.~n", [lowercase_all(N)]); _ -> w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" - "external documentation</a>.~n", + "external documentation</a>.~n", [lowercase_all(Class),lowercase_all(Class),lowercase_all(N)]) end, doc_enum_desc(DocEnum); gen_doc(Class, Cs = [#method{name=N, alias=A,method_type=MT}|_]) -> - GetRet = fun(#method{params=Ps,type=T}) -> + GetRet = fun(#method{params=Ps,type=T}) -> doc_return_types(T,Ps) end, - GetArgs = fun(#method{params=Ps, where=Where}) -> + GetArgs = fun(#method{params=Ps, where=Where}) -> Opt = case Where of erl_no_opt -> []; - _ -> + _ -> case split_optional(Ps) of {_, []} -> []; _ -> ["[Option]"] end end, - [doc_arg_type(P) || + [doc_arg_type(P) || P=#param{in=In,def=none,where=W} <- Ps, In =/= false, W =/= c] ++ Opt end, @@ -682,16 +686,16 @@ gen_doc(Class, Cs = [#method{name=N, alias=A,method_type=MT}|_]) -> case Class of "utils" -> w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "external documentation</a>.~n", + "external documentation</a>.~n", [lowercase_all(N)]); _ -> w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" - "external documentation</a>.~n", + "external documentation</a>.~n", [lowercase_all(Class),lowercase_all(Class),lowercase_all(N)]) end, Name = case MT of constructor -> "new"; _ -> erl_func_name(N,A) end, w("%% <br /> Alternatives:~n",[]), - [gen_doc2(Name, Clause) || Clause <- Cs], + [gen_doc2(Name, Clause) || Clause <- Cs], ok. gen_doc2(Name,#method{params=Ps,where=erl_no_opt,method_type=MT}) -> @@ -704,11 +708,11 @@ gen_doc2(Name,#method{params=Ps,type=T}) -> OptsType = case Optional of [] -> ""; _ when NonDef =:= [] -> "[Option]"; - _ -> ", [Option]" + _ -> ", [Option]" end, w("%% <p><c>~n",[]), w("%% ~s(~s~s) -> ~s </c>~n", - [Name,doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]), + [Name,doc_arg_types(Ps),OptsType,doc_return_types(T,Ps)]), doc_optional(Optional, xhtml), DocEnum = doc_enum(T,Ps, xhtml), doc_enum_desc(DocEnum), @@ -717,7 +721,7 @@ gen_doc2(Name,#method{params=Ps,type=T}) -> doc_arg(ArgList) -> case all_eq(ArgList) of true -> hd(ArgList); - false -> + false -> Get = fun(Str) -> [_Name|Types] = string:tokens(Str, ":"), case Types of @@ -734,12 +738,12 @@ doc_arg(ArgList) -> doc_ret(ArgList) -> case all_eq(ArgList) of true -> hd(ArgList); - false -> + false -> args(fun(A) -> A end, "|", ArgList) end. unique([], U) -> reverse(U); -unique([H|R], U) -> +unique([H|R], U) -> case lists:member(H,U) of false -> unique(R,[H|U]); true -> unique(R,U) @@ -756,7 +760,7 @@ zip(List) -> zip([[F|L1]|List], Rest, AccL, Acc) -> zip(List, [L1|Rest], [F|AccL], Acc); -zip(Empty, Rest, AccL, Acc) -> +zip(Empty, Rest, AccL, Acc) -> true = empty(Empty), case empty(Rest) andalso empty(AccL) of true -> reverse(Acc); @@ -779,7 +783,7 @@ doc_arg_type(_) -> skip. doc_arg_type2(T=#type{single=Single}) when Single =:= array; Single =:= list -> "[" ++ doc_arg_type3(T) ++ "]"; -doc_arg_type2(T) -> +doc_arg_type2(T) -> doc_arg_type3(T). doc_arg_type3(#type{base=string}) -> "string()"; @@ -799,8 +803,8 @@ doc_arg_type3(#type{base={binary,_}}) -> "binary()"; doc_arg_type3(#type{base=eventType}) -> "atom()"; doc_arg_type3(#type{base={ref,N}}) -> N++"()"; doc_arg_type3(#type{base={term,_N}}) -> "term()"; -doc_arg_type3(T=#type{base={class,N}}) -> - check_class(T), +doc_arg_type3(T=#type{base={class,N}}) -> + check_class(T), case get(current_class) of N -> N ++ "()"; _ -> N++":" ++ N++"()" @@ -809,7 +813,7 @@ doc_arg_type3({merged,_,T1=#type{base={class,N1}},_,_,T2=#type{base={class,N2}}, check_class(T1), check_class(T2), Curr = get(current_class), - if + if N1 =:= Curr, N2 =:= Curr -> N1++"() | "++ N2++"()"; N1 =:= Curr -> N1++"() | "++ N2++":" ++ N2++"()"; N2 =:= Curr -> N1++":" ++ N1++"() | "++ N2++"()"; @@ -824,7 +828,7 @@ doc_arg_type3(#type{base={comp,_,{record,Name}}}) -> "wx:" ++ atom_to_list(Name) ++ "()"; doc_arg_type3(#type{base={comp,_,Tup}}) -> Doc = fun({int,V}) -> V ++ "::integer()"; - ({double,V}) -> V ++ "::float()" + ({double,V}) -> V ++ "::float()" end, "{" ++ args(Doc, ",", Tup) ++ "}"; doc_arg_type3(T) -> ?error({unknown_type,T}). @@ -834,7 +838,7 @@ doc_return_types(T, Ps) -> doc_return_types2(void, []) -> "ok"; doc_return_types2(void, [#param{type=T}]) -> doc_arg_type2(T); doc_return_types2(T, []) -> doc_arg_type2(T); -doc_return_types2(void, Ps) -> +doc_return_types2(void, Ps) -> "{" ++ args(fun doc_arg_type/1,",",Ps) ++ "}"; doc_return_types2(T, Ps) -> "{" ++ doc_arg_type2(T) ++ "," ++ args(fun doc_arg_type/1,",",Ps) ++ "}". @@ -887,7 +891,7 @@ check_name(Name) -> Name. marshal_opts([], _,_) -> ""; %% No opts skip this! marshal_opts(Opts, Align, Args) -> - w(" MOpts = fun", []), + w(" MOpts = fun", []), marshal_opts1(Opts,1), w(";~n (BadOpt, _) -> erlang:error({badoption, BadOpt}) end,~n", []), w(" BinOpt = list_to_binary(lists:foldl(MOpts, [<<0:32>>], Options)),~n", []), @@ -896,7 +900,7 @@ marshal_opts(Opts, Align, Args) -> [] -> Str; % All Args are optional _ -> ", " ++ Str end. - + marshal_opts1([P],N) -> marshal_opt(P,N); marshal_opts1([P|R],N) -> @@ -909,15 +913,15 @@ marshal_opt(P0=#param{name=Name,type=Type},N) -> {Arg,Align} = marshal_arg(Type,erl_arg_name(Name),1), AStr = if Align =:= 0 -> ""; Align =:= 1 -> ",0:32" - end, - w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]), + end, + w("({~s, ~s}, Acc) -> ", [erl_option_name(Name), func_arg(P)]), arg_type_test(P,"",[]), case Arg of - skip -> + skip -> w("[<<~p:32/?UI~s>>|Acc]", [N, AStr]); - _ -> + _ -> w("[<<~p:32/?UI,~s~s>>|Acc]", [N, Arg,AStr]) - end. + end. marshal_args(Ps) -> marshal_args(Ps, [], 0). @@ -957,23 +961,23 @@ marshal_arg(#type{single=true,base={enum,_Enum}}, Name, Align) -> marshal_arg(#type{single=true,base=bool}, Name, Align) -> align(32, Align, "(wxe_util:from_bool(" ++ Name ++ ")):32/?UI"); -marshal_arg(#type{name="wxChar", single=Single}, Name, Align0) +marshal_arg(#type{name="wxChar", single=Single}, Name, Align0) when Single =/= true -> - {Str,Align} = + {Str,Align} = align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", {Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0}; marshal_arg(#type{base=string}, Name, Align0) -> - {Str,Align} = + {Str,Align} = align(32,Align0, "(byte_size("++Name++"_UC)):32/?UI,(" ++ Name ++ "_UC)/binary"), MsgSize = "(" ++ integer_to_list(Align*4)++"+byte_size("++Name++"_UC))", {Str++", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8",0}; marshal_arg(#type{name="wxArrayString"}, Name, Align0) -> - InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>", + InnerBin = "<<(byte_size(UC_Str)):32/?UI, UC_Str/binary>>", Outer = "(<< " ++ InnerBin ++ "|| UC_Str <- "++ Name ++"_UCA>>)/binary", Str0 = "(length("++Name++"_UCA)):32/?UI, " ++ Outer, {Str,Align} = align(32,Align0,Str0), - MsgSize = "("++integer_to_list(Align*4) ++ + MsgSize = "("++integer_to_list(Align*4) ++ " + lists:sum([byte_size(S)+4||S<-" ++ Name ++"_UCA]))", AStr = ", 0:(((8- (" ++ MsgSize ++" band 16#7)) band 16#7))/unit:8", {Str ++ AStr, 0}; @@ -997,15 +1001,15 @@ marshal_arg(#type{base={term,_}}, _Name, Align0) -> {skip,Align0}; marshal_arg(#type{base=binary}, _Name, Align0) -> {skip,Align0}; -marshal_arg(#type{base=Base, single=Single}, Name, Align0) +marshal_arg(#type{base=Base, single=Single}, Name, Align0) when Single =/= true -> - case Base of - int -> + case Base of + int -> Str0 = "(length("++Name++")):32/?UI,\n" " (<< <<C:32/?I>> || C <- "++Name++">>)/binary", {Str,Align} = align(32,Align0, Str0), {Str ++ ", 0:((("++integer_to_list(Align)++"+length("++Name++ ")) rem 2)*32)", 0}; - {ObjRef,_} when ObjRef =:= class; ObjRef =:= ref -> + {ObjRef,_} when ObjRef =:= class; ObjRef =:= ref -> Str0 = "(length("++Name++")):32/?UI,", Str1 = "\n (<< <<(C#wx_ref.ref):32/?UI>> || C <- "++Name++">>)/binary", {Str2,Align} = align(32, Align0, Str1), @@ -1033,7 +1037,7 @@ align(64, 0, Str) -> {Str, 0}; align(64, 1, Str) -> {"0:32," ++ Str,0}; align(Sz, W, Str) -> align(Sz, W rem 2, Str). -enum_name(Name) -> +enum_name(Name) -> case string:tokens(Name, ":") of [Name] -> Name; [C,N] -> C ++ "_" ++ N @@ -1053,10 +1057,10 @@ gen_enums_ints() -> " }).~n", []), w("~n%% Hardcoded Defines~n", []), Enums = [E || {{enum,_},E = #enum{as_atom=false}} <- get()], - w("-define(wxDefaultSize, {-1,-1}).~n", []), - w("-define(wxDefaultPosition, {-1,-1}).~n", []), + w("-define(wxDefaultSize, {-1,-1}).~n", []), + w("-define(wxDefaultPosition, {-1,-1}).~n", []), w("~n%% Global Variables~n", []), - [w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) || + [w("-define(~s, wxe_util:get_const(~s)).~n", [Gvar, Gvar]) || {Gvar,_,_Id} <- get(gvars)], w("~n%% Enum and defines~n", []), foldl(fun(Enum= #enum{vals=Vals}, Done) when Vals =/= [] -> @@ -1076,7 +1080,7 @@ build_enum_ints(#enum{from=From, vals=Vals},Done) -> {_File, Class, Name} -> w("% From class ~s::~s~n",[Class, Name]) end, - + Format = fun(#const{name="wxEVT_" ++ _}) -> ignore; %% Ignore event macros they are not valid in our event model (#const{name=Name,val=Value,is_const=true}) when is_integer(Value) -> @@ -1100,12 +1104,12 @@ build_enum_ints(#enum{from=From, vals=Vals},Done) -> Consts = get(consts), Write = fun({Name,_What}, Skip) -> case gb_sets:is_member(Name,Skip) of - true -> + true -> Skip; false -> case gb_trees:lookup(Name, Consts) of {value, Const} -> - Format(Const), + Format(Const), gb_sets:add(Name,Skip); none -> Skip end @@ -1119,8 +1123,8 @@ gen_event_recs() -> w("", []), w("%% This file is generated DO NOT EDIT~n~n", []), w("%% All event messages are encapsulated in a wx record~n" - "%% they contain the widget id and a specialized event record.~n" - "%% Each event record may be sent for one or more event types.~n" + "%% they contain the widget id and a specialized event record.~n" + "%% Each event record may be sent for one or more event types.~n" "%% The mapping to wxWidgets is one record per class.~n~n",[]), w("%% @type wx() = #wx{id=integer(), obj=wx:wxObject(), userData=term(), event=Rec}. Rec is a event record.~n",[]), w("-record(wx, {id, %% Integer Identity of object.~n" @@ -1130,7 +1134,7 @@ gen_event_recs() -> w("%% Here comes the definitions of all event records.~n" "%% they contain the event type and possible some extra information.~n~n",[]), Types = [build_event_rec(C) || {_,C=#class{event=Evs}} <- get(), Evs =/= false], - w("%% @type wxEventType() = ~s.~n", + w("%% @type wxEventType() = ~s.~n", [args(fun(Ev) -> Ev end, " | ", lists:sort(lists:append(Types)))]), %% close(), closed in gen_enums_ints ok. @@ -1145,22 +1149,22 @@ find_inherited_attr(Param = {PName,_}, Name) -> end. filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) -> - Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; + Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; (P=#param{prot=public},Acc) -> [P|Acc]; - (#param{acc=undefined},Acc) -> Acc; + (#param{acc=undefined},Acc) -> Acc; ({inherited, PName},Acc) -> case find_inherited_attr(PName, Parent) of - undefined -> + undefined -> io:format("~p:~p: Missing Event Attr ~p in ~p~n", [?MODULE,?LINE, PName, Name]), Acc; - P -> + P -> [P|Acc] end; (P, Acc) -> [P|Acc] end, [], Attrs), lists:reverse(Attr1). - + build_event_rec(Class=#class{name=Name, event=Evs}) -> EvTypes = [event_type_name(Ev) || Ev <- Evs], Str = args(fun(Ev) -> "<em>"++Ev++"</em>" end, ", ", EvTypes), @@ -1168,26 +1172,26 @@ build_event_rec(Class=#class{name=Name, event=Evs}) -> Rec = event_rec_name(Name), GetName = fun(#param{name=N}) ->event_attr_name(N) end, GetType = fun(#param{name=N,type=T}) -> - event_attr_name(N) ++ "=" ++ doc_arg_type2(T) + event_attr_name(N) ++ "=" ++ doc_arg_type2(T) end, case Attr =:= [] of - true -> + true -> w("%% @type ~s() = #~s{type=wxEventType()}.~n", [Rec,Rec]), w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), -%% case is_command_event(Name) of +%% case is_command_event(Name) of %% true -> w("%% This event skips other event handlers.~n",[]); %% false -> w("%% This event will be handled by other handlers~n",[]) %% end, w("%% Callback event: {@link ~s}~n", [Name]), w("-record(~s, {type}).~n~n", [Rec]); false -> - w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n", + w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n", [Rec,Rec,args(GetType,",",Attr)]), w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), -%% case is_command_event(Name) of +%% case is_command_event(Name) of %% true -> w("%% This event skips other event handlers.~n",[]); %% false -> w("%% This event will be handled by other handlers~n",[]) -%% end, +%% end, w("%% Callback event: {@link ~s}~n", [Name]), w("-record(~s,{type, ~s}).~n~n", [Rec,args(GetName,",",Attr)]) end, @@ -1198,7 +1202,7 @@ is_command_event(Name) -> true -> true; false -> false end. - + event_rec_name(Name0 = "wx" ++ _) -> "tnevE" ++ Name1 = reverse(Name0), reverse(Name1). @@ -1215,7 +1219,7 @@ event_attr_name(Attr) -> lowercase(Attr). -gen_funcnames() -> +gen_funcnames() -> open_write("../src/gen/wxe_debug.hrl"), erl_copyright(), w("%% This file is generated DO NOT EDIT~n~n", []), @@ -1257,7 +1261,7 @@ unique_names(Ms0, Class) -> Ms = split_list(fun(#method{name=N}, M) -> {N =:= M, N} end, undefined, Ms2), unique_names2(Ms,Class). %% by Names -unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) -> +unique_names2([[#method{id=Id, name=Method,alias=Alias, max_arity=A}]|Ms], Class) -> [{Class,uname(alias(Method,Alias),Class),A,Id} | unique_names2(Ms,Class)]; unique_names2([Ms0|RMs], Class) -> Split = fun(#method{max_arity=A}, P) -> {A =:= P, A} end, @@ -1278,11 +1282,11 @@ unique_names4([], _, _Class) -> []. alias(Method, undefined) -> Method; alias(_, Alias) -> Alias. - + uname(Class,Class) -> "new"; uname([$~ | _], _ ) -> "destruct"; uname(Name, _) -> Name. - + split_list(F, Keep, List) -> split_list(F, Keep, List, []). @@ -1297,5 +1301,5 @@ split_list(F, Keep, [M|Ms], Acc) -> end; split_list(_, _, [], []) -> []; split_list(_, _, [], Acc) -> [lists:reverse(Acc)]. - + |