Remember source location when computing used names
This commit is contained in:
parent
5aed8b3ef5
commit
6bd2b7c483
@ -98,29 +98,31 @@ fold(Alg = #alg{zero = Zero, plus = Plus, scoped = Scoped}, Fun, K, X) ->
|
|||||||
%% Name dependencies
|
%% Name dependencies
|
||||||
|
|
||||||
used_ids(E) ->
|
used_ids(E) ->
|
||||||
[ X || {term, [X]} <- used(E) ].
|
[ X || {{term, [X]}, _} <- used(E) ].
|
||||||
|
|
||||||
used_types(T) ->
|
used_types(T) ->
|
||||||
[ X || {type, [X]} <- used(T) ].
|
[ X || {{type, [X]}, _} <- used(T) ].
|
||||||
|
|
||||||
-type entity() :: {term, [string()]}
|
-type entity() :: {term, [string()]}
|
||||||
| {type, [string()]}
|
| {type, [string()]}
|
||||||
| {namespace, [string()]}.
|
| {namespace, [string()]}.
|
||||||
|
|
||||||
-spec entity_alg() -> alg([entity()]).
|
-spec entity_alg() -> alg(#{entity() => aeso_syntax:ann()}).
|
||||||
entity_alg() ->
|
entity_alg() ->
|
||||||
IsBound = fun({K, _}) -> lists:member(K, [bound_term, bound_type]) end,
|
IsBound = fun({K, _}) -> lists:member(K, [bound_term, bound_type]) end,
|
||||||
Unbind = fun(bound_term) -> term; (bound_type) -> type end,
|
Unbind = fun(bound_term) -> term; (bound_type) -> type end,
|
||||||
|
Remove = fun(Keys, Map) -> lists:foldl(fun maps:remove/2, Map, Keys) end,
|
||||||
Scoped = fun(Xs, Ys) ->
|
Scoped = fun(Xs, Ys) ->
|
||||||
{Bound, Others} = lists:partition(IsBound, Ys),
|
Bound = [E || E <- maps:keys(Ys), IsBound(E)],
|
||||||
|
Others = Remove(Bound, Ys),
|
||||||
Bound1 = [ {Unbind(Tag), X} || {Tag, X} <- Bound ],
|
Bound1 = [ {Unbind(Tag), X} || {Tag, X} <- Bound ],
|
||||||
lists:umerge(Xs -- Bound1, Others)
|
maps:merge(Remove(Bound1, Xs), Others)
|
||||||
end,
|
end,
|
||||||
#alg{ zero = []
|
#alg{ zero = #{}
|
||||||
, plus = fun lists:umerge/2
|
, plus = fun maps:merge/2
|
||||||
, scoped = Scoped }.
|
, scoped = Scoped }.
|
||||||
|
|
||||||
-spec used(_) -> [entity()].
|
-spec used(_) -> [{entity(), aeso_syntax:ann()}].
|
||||||
used(D) ->
|
used(D) ->
|
||||||
Kind = fun(expr) -> term;
|
Kind = fun(expr) -> term;
|
||||||
(bind_expr) -> bound_term;
|
(bind_expr) -> bound_term;
|
||||||
@ -128,14 +130,14 @@ used(D) ->
|
|||||||
(bind_type) -> bound_type
|
(bind_type) -> bound_type
|
||||||
end,
|
end,
|
||||||
NS = fun(Xs) -> {namespace, lists:droplast(Xs)} end,
|
NS = fun(Xs) -> {namespace, lists:droplast(Xs)} end,
|
||||||
NotBound = fun({Tag, _}) -> not lists:member(Tag, [bound_term, bound_type]) end,
|
NotBound = fun({{Tag, _}, _}) -> not lists:member(Tag, [bound_term, bound_type]) end,
|
||||||
Xs =
|
Xs =
|
||||||
fold(entity_alg(),
|
maps:to_list(fold(entity_alg(),
|
||||||
fun(K, {id, _, X}) -> [{Kind(K), [X]}];
|
fun(K, {id, Ann, X}) -> #{{Kind(K), [X]} => Ann};
|
||||||
(K, {qid, _, Xs}) -> [{Kind(K), Xs}, NS(Xs)];
|
(K, {qid, Ann, Xs}) -> #{{Kind(K), Xs} => Ann, NS(Xs) => Ann};
|
||||||
(K, {con, _, X}) -> [{Kind(K), [X]}];
|
(K, {con, Ann, X}) -> #{{Kind(K), [X]} => Ann};
|
||||||
(K, {qcon, _, Xs}) -> [{Kind(K), Xs}, NS(Xs)];
|
(K, {qcon, Ann, Xs}) -> #{{Kind(K), Xs} => Ann, NS(Xs) => Ann};
|
||||||
(_, _) -> []
|
(_, _) -> #{}
|
||||||
end, decl, D),
|
end, decl, D)),
|
||||||
lists:filter(NotBound, Xs).
|
lists:filter(NotBound, Xs).
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user