File 3111-Write-the-api-footprint.patch of Package erlang
From f11186a7770b5d2d7987485329274f0317790fcb Mon Sep 17 00:00:00 2001
From: Dan Gudmundsson <dgud@erlang.org>
Date: Fri, 9 Oct 2020 13:45:53 +0200
Subject: [PATCH] Write the api footprint
So we can diff the API with future re-writes.
---
lib/wx/api_gen/wx_gen.erl | 4 +--
lib/wx/api_gen/wx_gen_erl.erl | 57 +++++++++++++++++++++++++++++++++--
2 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/lib/wx/api_gen/wx_gen.erl b/lib/wx/api_gen/wx_gen.erl
index d9dd624ca8..16b85be97d 100644
--- a/lib/wx/api_gen/wx_gen.erl
+++ b/lib/wx/api_gen/wx_gen.erl
@@ -1434,7 +1434,7 @@ extract_def([#xmlElement{name=name,content=[#xmlText{value=Name}]}|R], _N, Skip)
extract_def([#xmlElement{name=param}|_],Name,_) ->
throw(Name);
extract_def([#xmlElement{name=initializer,content=Cs}|_R],N,Skip) ->
- Val0 = extract_def2(Cs),
+ Val0 = string:strip(strip_comment(extract_def2(Cs))),
case Val0 of
"0x" ++ Val1 -> {N, list_to_integer(Val1, 16)};
_ ->
@@ -1458,7 +1458,7 @@ extract_def(_,N,_) ->
throw(N).
extract_def2([#xmlText{value=Val}|R]) ->
- string:strip(strip_comment(Val)) ++ extract_def2(R);
+ string:strip(Val) ++ extract_def2(R);
extract_def2([#xmlElement{content=Cs}|R]) ->
extract_def2(Cs) ++ extract_def2(R);
extract_def2([]) -> [].
diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl
index d029ae77cb..e8287c4b1f 100644
--- a/lib/wx/api_gen/wx_gen_erl.erl
+++ b/lib/wx/api_gen/wx_gen_erl.erl
@@ -49,8 +49,10 @@ gen(Defs) ->
Replace = fun(C=#class{name=Name}, Dfs) ->
lists:keyreplace(Name, #class.name, Dfs, C)
end,
- [gen_class(Class) || Class <- lists:foldl(Replace, Defs, Static)],
- gen_funcnames().
+ All = lists:foldl(Replace, Defs, Static),
+ [gen_class(Class) || Class <- All],
+ gen_funcnames(),
+ gen_api_footprint(All).
gen_class(Class) ->
try
@@ -1324,6 +1326,57 @@ gen_funcnames() ->
[w("-define(~s_~s, ~p).~n", [Class,Name,Id]) || {Class,Name,_,Id} <- Ns],
close().
+gen_api_footprint(All) ->
+ %% To be able to diff content between old and new generators.
+ open_write("wx_28_api.dump"),
+ TF = fun TF (Type) ->
+ try wx_gen:type_foot_print(Type) of
+ {class, C} -> list_to_atom(C);
+ {merged, MTs} -> [TF(MT) || {_, MT} <- MTs];
+ T -> T
+ catch _:R:ST ->
+ case Type of
+ void -> ok;
+ {merged, _,T1,_, _,T2,_} ->
+ lists:sort([TF(T1),TF(T2)]);
+ _ ->
+ io:format("ERROR: ~p~n ~p~n",[R,ST]),
+ exit(R)
+ end
+ end
+ end,
+ Out = fun(T, []) -> TF(T);
+ (void, [#param{type=T}]) -> TF(T);
+ (void, Ps) -> list_to_tuple([TF(T) || #param{type=T} <- Ps]);
+ (T, Ps) -> list_to_tuple([TF(T)|[TF(Tp) || #param{type=Tp} <- Ps]])
+ end,
+ Methods = fun(CName, Parent, #method{name=N, alias=Alias, method_type=MType,where=W,type=Type0,params=Ps}) ->
+ {Args0,Opts0} = split_optional(Ps),
+ Type = Out(Type0, [P || P=#param{in=In} <- Ps,In =/= true]),
+ Args = [TF(PT) || #param{type=PT} <- Args0],
+ case W of
+ merged_c ->
+ ignore;
+ erl_no_opt ->
+ {CName, list_to_atom(erl_func_name(N,Alias)), Type, Args, [], W, Parent};
+ _ ->
+ Opts = lists:sort([{list_to_atom(erl_option_name(ON)), TF(OT)} ||
+ #param{name=ON,type=OT} <- Opts0]),
+ {CName, list_to_atom(erl_func_name(N,Alias)), Type, Args, Opts, W, Parent}
+ end
+ end,
+ Class = fun(#class{name=CName0,parent=Parent,methods=Ms0,options=Opts}) ->
+ CName = case Parent of
+ "static" -> "wx_misc";
+ _ -> CName0
+ end,
+ [Methods(list_to_atom(CName), list_to_atom(Parent), M) || Ms <- Ms0, M <-Ms]
+ end,
+ Sorted = lists:sort(lists:append([Class(C) || C <- All])),
+ [w("~0p.~n", [E]) || E <- Sorted, E /= ignore],
+ close().
+
+
get_unique_name(ID) when is_integer(ID) ->
Tree = get(unique_names),
{Class,Name, _,_} = gb_trees:get(ID, Tree),
--
2.26.2