diff options
Diffstat (limited to 'lib/wx/api_gen/wx_gen_erl.erl')
-rw-r--r-- | lib/wx/api_gen/wx_gen_erl.erl | 412 |
1 files changed, 174 insertions, 238 deletions
diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl index 5d73d93ead..5e35631589 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-2011. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. 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 @@ -28,12 +28,16 @@ -include("wx_gen.hrl"). --compile(export_all). +%%-compile(export_all). +-export([gen/1]). +-export([parents/1, get_unique_names/0, get_unique_name/1, + event_type_name/1, event_rec_name/1, filter_attrs/1]). --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, + +-import(lists, [foldl/3,reverse/1, filter/2]). +-import(gen_util, [lowercase/1, lowercase_all/1, uppercase/1, open_write/1, close/0, erl_copyright/0, w/2, - args/3, args/4, strip_name/2]). + args/3, args/4]). gen(Defs) -> [put({class,N},C) || C=#class{name=N} <- Defs], @@ -128,8 +132,6 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> w("%% stored on disc or distributed for use on other nodes.~n~n", []), w("-module(~s).~n", [Name]), w("-include(\"wxe.hrl\").~n",[]), - %% w("-compile(export_all).~n~n", []), %% XXXX remove ??? - %% w("-compile(nowarn_unused_vars).~n~n", []), %% XXXX remove ??? 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)]), @@ -140,10 +142,10 @@ gen_class1(C=#class{name=Name,parent=Parent,methods=Ms,options=Opts}) -> w("-export([~s]).~n~n", [args(fun(EF) -> EF end, ",", lists:usort(["parent_class/1"|InExported]), 60)]), - + w("-export_type([~s/0]).~n", [Name]), w("%% @hidden~n", []), parents_check(Parents), - + w("-type ~s() :: wx:wx_object().~n", [Name]), Gen = fun(M) -> gen_method(Name,M) end, NewMs = lists:map(Gen,reverse(Ms)), gen_dest(C, Ms), @@ -317,8 +319,8 @@ gen_dest(#class{name=CName,abstract=Abs}, Ms) -> end. gen_dest2(Class, Id) -> - w("%% @spec (This::~s()) -> ok~n", [Class]), w("%% @doc Destroys this object, do not use object again~n", []), + w("-spec destroy(This::~s) -> ok.~n", [Class]), w("destroy(Obj=#wx_ref{type=Type}) ->~n", []), w(" ?CLASS(Type,~s),~n",[Class]), case Id of @@ -635,142 +637,88 @@ guard_test(#param{name=N,type={class,ignore}}) -> guard_test(T) -> ?error({unknown_type,T}). gen_doc(_Class, [#method{method_type=destructor}]) -> skip; -gen_doc(_Class,[#method{name=N,alias=A,params=Ps,type=T,where=erl_no_opt,method_type=MT}])-> - w("%% @spec (~s~s) -> ~s~n",[doc_arg_types(Ps),"",doc_return_types(T,Ps)]), +gen_doc(_Class,Ms=[#method{name=N,alias=A,params=Ps,where=erl_no_opt,method_type=MT}])-> w("%% @equiv ", []), - 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, - Def =:= none, In =/= false, Where =/= c], - OptsType = case Optional of - [] -> ""; - _ when NonDef =:= [] -> "[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), - case Class of - "utils" -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "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", - [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}) -> - doc_return_types(T,Ps) - end, - 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) || - P=#param{in=In,def=none,where=W} <- Ps, - In =/= false, W =/= c] ++ Opt - end, - Args = zip(lists:map(GetArgs, Cs)), - Ret = lists:map(GetRet, Cs), - w("%% @spec (~s) -> ~s~n",[args(fun doc_arg/1,",",Args),doc_ret(Ret)]), - case Class of - "utils" -> - w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" - "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", - [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_function_clause(erl_func_name(N,A),MT,Ps,empty_list,[no_guards,name_only]), + w("~n",[]), + write_specs(Ms); +gen_doc(Class,Ms=[#method{name=N,params=Ps,type=T}])-> + %%doc_optional(Optional, normal), + doc_link(Class, N), + doc_enum_desc(doc_enum(T,Ps)), + write_specs(Ms); + +gen_doc(Class, Ms = [#method{name=N, type=T}|_]) -> + doc_link(Class, N), + Ps = lists:usort([Ps || #method{params=Ps} <- Ms]), + doc_enum_desc(doc_enum(T,Ps)), + write_specs(Ms), ok. -gen_doc2(Name,#method{params=Ps,where=erl_no_opt,method_type=MT}) -> - w("%% <p><c>~n",[]), - w("%% ~s(~s) -> ", [Name,doc_arg_types(Ps)]), - gen_function_clause(Name,MT,Ps,empty_list,[no_guards,name_only]), - w(" </c></p>~n",[]); -gen_doc2(Name,#method{params=Ps,type=T}) -> +write_specs(M=[#method{method_type=constructor}|_]) -> + w("-spec new", []), + write_specs1(M); +write_specs(M=[#method{name=N, alias=A}|_]) -> + w("-spec ~s", [erl_func_name(N,A)]), + write_specs1(M). + +write_specs1([M]) -> + write_spec(M), + w(".~n", []); +write_specs1([M|Next]) -> + write_spec(M), + w(";~n ", []), + write_specs1(Next). + +write_spec(#method{params=Ps,type=T,where=erl_no_opt}) -> + {NonDef, _Optional} = split_optional(Ps), + Res = doc_return_types(T,Ps), + write_spec(NonDef, [], Res); +write_spec(#method{params=Ps,type=T}) -> {NonDef, Optional} = split_optional(Ps), - OptsType = case Optional of - [] -> ""; - _ when NonDef =:= [] -> "[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)]), - doc_optional(Optional, xhtml), - DocEnum = doc_enum(T,Ps, xhtml), - doc_enum_desc(DocEnum), - w("%% </p>~n",[]). - -doc_arg(ArgList) -> - case all_eq(ArgList) of - true -> hd(ArgList); - false -> - Get = fun(Str) -> - [_Name|Types] = string:tokens(Str, ":"), - case Types of - [Type] -> Type; - _ -> - "term()" - end - end, - Args0 = lists:map(Get, ArgList), - Args = unique(Args0, []), - "X::" ++ args(fun(A) -> A end, "|", Args) - end. - -doc_ret(ArgList) -> - case all_eq(ArgList) of - true -> hd(ArgList); - false -> - args(fun(A) -> A end, "|", ArgList) - end. - -unique([], U) -> reverse(U); -unique([H|R], U) -> - case lists:member(H,U) of - false -> unique(R,[H|U]); - true -> unique(R,U) - end. - -all_eq([H|R]) -> all_eq(R,H). - -all_eq([H|R],H) -> all_eq(R,H); -all_eq([],_) -> true; -all_eq(_,_) -> false. - -zip(List) -> - zip(List, [], [], []). - -zip([[F|L1]|List], Rest, AccL, Acc) -> - zip(List, [L1|Rest], [F|AccL], Acc); -zip(Empty, Rest, AccL, Acc) -> - true = empty(Empty), - case empty(Rest) andalso empty(AccL) of - true -> reverse(Acc); - false -> - zip(reverse(Rest), [], [], [reverse(AccL)|Acc]) - end. - -empty([[]|R]) -> empty(R); -empty([]) -> true; -empty(_) -> false. + Res = doc_return_types(T,Ps), + write_spec(NonDef, Optional, Res). + +write_spec([], [], {simple, Res}) -> + w("() -> ~s", [Res]); +write_spec([], [], {complex, Res}) -> + w("() -> Resultwhen~n\tResult ::~s", [Res]); +write_spec(Args, [], {simple, Res}) -> + w("(~s) -> ~s when~n\t~s", + [erl_arg_names(Args), Res, doc_arg_types(Args)]); +write_spec(Args, [], {complex, Res}) -> + w("(~s) -> Result when~n\tResult ::~s,~n\t~s", + [erl_arg_names(Args), Res, doc_arg_types(Args)]); +write_spec([], Optional, {simple, Res}) -> + w("([Option]) -> ~s when~n\t~s", + [Res, optional_type(Optional)]); +write_spec([], Optional, {complex, Res}) -> + w("([Option]) -> Result when~n\tResult :: ~s,~n\t~s", + [Res, optional_type(Optional)]); +write_spec(Args, Optional, {simple, Res}) -> + w("(~s, [Option]) -> ~s when~n\t~s,~n\t~s", + [erl_arg_names(Args), Res, doc_arg_types(Args), optional_type(Optional)]); +write_spec(Args, Optional, {complex, Res}) -> + w("(~s, [Option]) -> Result when~n\tResult :: ~s,~n\t~s,~n\t~s", + [erl_arg_names(Args), Res, doc_arg_types(Args), optional_type(Optional)]). + +optional_type(Opts) -> + "Option :: " ++ args(fun optional_type2/1, "\n\t\t | ", Opts). +optional_type2(#param{name=Name, def=Def, type=T}) -> + "{" ++ erl_option_name(Name) ++ ", " ++ doc_arg_type2(T) ++ "}". %% %% Default: " ++ Def. + +doc_link("utils", Func) -> + w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_miscellany.html#~s\">" + "external documentation</a>.~n", + [lowercase_all(Func)]); +doc_link(Class, Func) -> + w("%% @doc See <a href=\"http://www.wxwidgets.org/manuals/stable/wx_~s.html#~s~s\">" + "external documentation</a>.~n", + [lowercase_all(Class),lowercase_all(Class),lowercase_all(Func)]). + +erl_arg_names(Ps0) -> + Ps = [Name || #param{name=Name, in=In, where=Where} <- Ps0,In =/= false, Where =/= c], + args(fun erl_arg_name/1, ", ", Ps). doc_arg_types(Ps0) -> Ps = [P || P=#param{in=In, where=Where} <- Ps0,In =/= false, Where =/= c], @@ -789,13 +737,13 @@ doc_arg_type2(T) -> doc_arg_type3(#type{base=string}) -> "string()"; doc_arg_type3(#type{name="wxChar", single=S}) when S =/= true -> "string()"; doc_arg_type3(#type{name="wxArrayString"}) -> "[string()]"; -doc_arg_type3(#type{name="wxDateTime"}) -> "wx:datetime()"; +doc_arg_type3(#type{name="wxDateTime"}) -> "wx:wx_datetime()"; doc_arg_type3(#type{name="wxArtClient"}) -> "string()"; doc_arg_type3(#type{base=int}) -> "integer()"; doc_arg_type3(#type{base=int64}) -> "integer()"; doc_arg_type3(#type{base=long}) -> "integer()"; doc_arg_type3(#type{name="wxTreeItemId"}) -> "wxTreeCtrl:treeItemId()"; -doc_arg_type3(#type{base=bool}) -> "bool()"; +doc_arg_type3(#type{base=bool}) -> "boolean()"; doc_arg_type3(#type{base=float}) -> "float()"; doc_arg_type3(#type{base=double}) -> "float()"; doc_arg_type3(#type{base=binary}) -> "binary()"; @@ -820,12 +768,13 @@ doc_arg_type3({merged,_,T1=#type{base={class,N1}},_,_,T2=#type{base={class,N2}}, true -> N1++":" ++ N1++"() | "++ N2++":" ++ N2++"()" end; -doc_arg_type3(#type{base={enum,{_,N}}}) -> uppercase(N); -doc_arg_type3(#type{base={enum,N}}) -> uppercase(N); +%% doc_arg_type3(#type{base={enum,{_,N}}}) -> uppercase(N); +%% doc_arg_type3(#type{base={enum,N}}) -> uppercase(N); +doc_arg_type3(#type{base={enum,_N}}) -> "wx:wx_enum()"; doc_arg_type3(#type{base={comp,"wxColour",_Tup}}) -> - "wx:colour()"; + "wx:wx_colour()"; doc_arg_type3(#type{base={comp,_,{record,Name}}}) -> - "wx:" ++ atom_to_list(Name) ++ "()"; + "wx:wx_" ++ atom_to_list(Name) ++ "()"; doc_arg_type3(#type{base={comp,_,Tup}}) -> Doc = fun({int,V}) -> V ++ "::integer()"; ({double,V}) -> V ++ "::float()" @@ -835,45 +784,36 @@ doc_arg_type3(T) -> ?error({unknown_type,T}). doc_return_types(T, Ps) -> doc_return_types2(T, [P || P=#param{in=In} <- Ps,In =/= true]). -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, []) -> {simple, "ok"}; +doc_return_types2(void, [#param{type=T}]) -> {simple, doc_arg_type2(T)}; +doc_return_types2(T, []) -> {simple, doc_arg_type2(T)}; +doc_return_types2(void, Ps) when length(Ps) < 4 -> + {simple, "{" ++ args(fun doc_arg_type/1,", ",Ps) ++ "}"}; doc_return_types2(void, Ps) -> - "{" ++ args(fun doc_arg_type/1,", ",Ps) ++ "}"; + {complex, "{" ++ args(fun doc_arg_type/1,", ",Ps) ++ "}"}; doc_return_types2(T, Ps) -> - "{" ++ doc_arg_type2(T) ++ ", " ++ args(fun doc_arg_type/1,", ",Ps) ++ "}". - -break(xhtml) -> "<br />"; -break(_) -> "". + {complex, "{Res ::" ++ doc_arg_type2(T) ++ ", " ++ args(fun doc_arg_type/1,", ",Ps) ++ "}"}. -doc_optional([],_) -> ok; -doc_optional(Opts,Type) -> - w("%%~s Option = ~s~n", [break(Type),args(fun doc_optional2/1, " | ", Opts)]). +doc_enum(#type{base={enum,Enum}},Ps) -> + [doc_enum_type(Enum, "res") | + [doc_enum_type(Type,Name) || #param{name=Name, type=#type{base={enum,Type}}} <- Ps]]; +doc_enum(_,Ps) -> + [doc_enum_type(Type,Name) || #param{name=Name, type=#type{base={enum,Type}}} <- Ps]. -doc_optional2(#param{name=Name, def=_Def, type=T}) -> - "{" ++ erl_option_name(Name) ++ ", " ++ doc_arg_type2(T) ++ "}". - -doc_enum(#type{base={enum,Enum}},Ps,Break) -> - [doc_enum_type(Enum,Break) | - [doc_enum_type(Type,Break) || #param{type=#type{base={enum,Type}}} <- Ps]]; -doc_enum(_,Ps,Break) -> - [doc_enum_type(Type,Break) || #param{type=#type{base={enum,Type}}} <- Ps]. - -doc_enum_type(Type,Break) -> +doc_enum_type(Type, Name) -> {Enum0, #enum{vals=Vals}} = wx_gen:get_enum(Type), - case Enum0 of {_, Enum} -> Enum; Enum -> Enum end, + Enum = case Enum0 of {_, E} -> E; E -> E end, Consts = get(consts), - Format = fun({Name,_What}) -> - #const{name=Name} = gb_trees:get(Name, Consts), - "?" ++ enum_name(Name) + Format = fun({N,_What}) -> + #const{name=N} = gb_trees:get(N, Consts), + "?" ++ enum_name(N) end, Vs = args(Format, " | ", Vals), - w("%%~s ~s = integer()~n", [break(Break),uppercase(Enum)]), - {uppercase(Enum),Vs}. + {uppercase(Enum),Name, Vs}. doc_enum_desc([]) -> ok; -doc_enum_desc([{Enum,Vs}|R]) -> - w("%%<br /> ~s is one of ~s~n", [Enum,Vs]), +doc_enum_desc([{_Enum,Name,Vs}|R]) -> + w("%%<br /> ~s = ~s~n", [erl_arg_name(Name),Vs]), doc_enum_desc(R). %% Misc functions prefixed with wx @@ -1126,82 +1066,53 @@ gen_event_recs() -> "%% 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" - " obj, %% Object reference that was used in the connect call.~n" - " userData, %% User data specified in the connect call.~n" - " event}).%% The event record~n~n",[]), + w("-record(wx, {id :: integer(), %% Integer Identity of object.~n" + " obj :: wx:wx_object(), %% Object reference that was used in the connect call.~n" + " userData :: term(), %% User data specified in the connect call.~n" + " event :: event() %% The event record~n" + " }).~n~n", []), + w("-type wx() :: #wx{}. %% wx event record ~n",[]), 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", - [args(fun(Ev) -> Ev end, " | ", lists:sort(lists:append(Types)))]), + Events = [build_event_rec(C) || {_,C=#class{event=Evs}} <- get(), Evs =/= false], + EventSubTypes = [Type || {_Rec, Type} <- Events], + EventRecs = [Rec || {Rec, _Type} <- Events], + w("-type event() :: ~s.~n", + [args(fun(Ev) -> Ev++"()" end, " | ", lists:sort(EventRecs))]), + + w("-type wxEventType() :: ~s.~n", + [args(fun(Ev) -> Ev++"()" end, " | ", lists:sort(EventSubTypes))]), %% close(), closed in gen_enums_ints ok. -find_inherited_attr(Param = {PName,_}, Name) -> - #class{parent=Parent, attributes=Attrs} = get({class, Name}), - case lists:keysearch(atom_to_list(PName), #param.name, Attrs) of - {value, P=#param{}} -> - P; - _ -> - find_inherited_attr(Param, Parent) - end. - -filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) -> - Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; - (P=#param{prot=public},Acc) -> [P|Acc]; - (#param{acc=undefined},Acc) -> Acc; - ({inherited, PName},Acc) -> - case find_inherited_attr(PName, Parent) of - undefined -> - io:format("~p:~p: Missing Event Attr ~p in ~p~n", - [?MODULE,?LINE, PName, Name]), - Acc; - 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), + Str = args(fun(Ev) -> Ev end, " | ", EvTypes), Attr = filter_attrs(Class), Rec = event_rec_name(Name), - GetName = fun(#param{name=N}) ->event_attr_name(N) end, + %%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, + EventType = Name ++ "Type", case Attr =:= [] of 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 -%% 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]); + %% w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), + %% w("%% Callback event: {@link ~s}~n", [Name]), + w("-record(~s, {type :: ~s()}). %% Callback event: {@link ~s}~n", + [Rec, EventType, Name]), + w("-type ~s() :: ~s.~n", [EventType, Str]); false -> - 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 -%% 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, ~s}).~n~n", [Rec,args(GetName,",",Attr)]) + %% w("%% @type ~s() = #~s{type=wxEventType(),~s}.~n", + %% [Rec,Rec,args(GetType,",",Attr)]), + %% w("%% <dl><dt>EventType:</dt> <dd>~s</dd></dl>~n",[Str]), + %% w("%% Callback event: {@link ~s}~n", [Name]), + w("-record(~s,{type :: ~s(), %% Callback event: {@link ~s}~n\t~s}).~n", + [Rec,EventType, Name, args(GetType,",\n\t",Attr)]), + w("-type ~s() :: ~s.~n", [EventType, Str]) end, - EvTypes. - -is_command_event(Name) -> - case lists:member("wxCommandEvent", parents(Name)) of - true -> true; - false -> false - end. + w("-type ~s() :: #~s{}. %% Callback event: {@link ~s}~n~n", [Rec,Rec,Name]), + {Rec, EventType}. event_rec_name(Name0 = "wx" ++ _) -> "tnevE" ++ Name1 = reverse(Name0), @@ -1218,6 +1129,31 @@ event_attr_name("m_" ++ Attr) -> event_attr_name(Attr) -> lowercase(Attr). +find_inherited_attr(Param = {PName,_}, Name) -> + #class{parent=Parent, attributes=Attrs} = get({class, Name}), + case lists:keysearch(atom_to_list(PName), #param.name, Attrs) of + {value, P=#param{}} -> + P; + _ -> + find_inherited_attr(Param, Parent) + end. + +filter_attrs(#class{name=Name, parent=Parent,attributes=Attrs}) -> + Attr1 = lists:foldl(fun(#param{acc=skip},Acc) -> Acc; + (P=#param{prot=public},Acc) -> [P|Acc]; + (#param{acc=undefined},Acc) -> Acc; + ({inherited, PName},Acc) -> + case find_inherited_attr(PName, Parent) of + undefined -> + io:format("~p:~p: Missing Event Attr ~p in ~p~n", + [?MODULE,?LINE, PName, Name]), + Acc; + P -> + [P|Acc] + end; + (P, Acc) -> [P|Acc] + end, [], Attrs), + lists:reverse(Attr1). gen_funcnames() -> open_write("../src/gen/wxe_debug.hrl"), |