|
9 | 9 | -include("elixir.hrl"). |
10 | 10 | -define(defs(Kind), Kind == def; Kind == defp; Kind == defmacro; Kind == defmacrop; Kind == '@'). |
11 | 11 | -define(lexical(Kind), Kind == import; Kind == alias; Kind == require). |
12 | | --compile({inline, [keyfind/2, keystore/3, keydelete/2, keynew/3, do_tuple_linify/5]}). |
| 12 | +-compile({inline, [keyfind/2, keystore/3, keydelete/2, keynew/3, do_tuple_linify/6]}). |
13 | 13 |
|
14 | 14 | -record(elixir_quote, { |
15 | 15 | line=false, |
@@ -84,53 +84,58 @@ linify(Line, Key, Exprs) when is_integer(Line) -> |
84 | 84 | end |
85 | 85 | end, |
86 | 86 |
|
87 | | - do_linify(Fun, Exprs, nil). |
| 87 | + do_linify(Fun, Exprs, nil, false). |
88 | 88 |
|
89 | 89 | %% Same as linify but also considers the context counter and generated. |
90 | 90 | linify_with_context_counter(ContextMeta, Var, Exprs) when is_list(ContextMeta) -> |
91 | 91 | Line = ?line(ContextMeta), |
92 | 92 |
|
93 | | - Fun = |
94 | | - case lists:keyfind(generated, 1, ContextMeta) of |
95 | | - {generated, true} when Line =:= 0 -> fun elixir_utils:generated/1; |
96 | | - {generated, true} -> fun(Meta) -> elixir_utils:generated(keynew(line, Meta, Line)) end; |
97 | | - _ when Line =:= 0 -> fun(Meta) -> Meta end; |
98 | | - _ -> fun(Meta) -> keynew(line, Meta, Line) end |
99 | | - end, |
| 93 | + Generated = keyfind(generated, ContextMeta) == {generated, true}, |
| 94 | + |
| 95 | + Fun = if |
| 96 | + Line =:= 0 -> fun(Meta) -> Meta end; |
| 97 | + true -> fun(Meta) -> keynew(line, Meta, Line) end |
| 98 | + end, |
100 | 99 |
|
101 | | - do_linify(Fun, Exprs, Var). |
| 100 | + do_linify(Fun, Exprs, Var, Generated). |
102 | 101 |
|
103 | | -do_linify(Fun, {quote, Meta, [_ | _] = Args}, {Receiver, Counter} = Var) |
| 102 | +do_linify(Fun, {quote, Meta, [_ | _] = Args}, {Receiver, Counter} = Var, Gen) |
104 | 103 | when is_list(Meta) -> |
105 | 104 | NewMeta = |
106 | 105 | case keyfind(context, Meta) == {context, Receiver} of |
107 | 106 | true -> keynew(counter, Meta, Counter); |
108 | 107 | false -> Meta |
109 | 108 | end, |
110 | | - do_tuple_linify(Fun, NewMeta, quote, Args, Var); |
| 109 | + do_tuple_linify(Fun, NewMeta, quote, Args, Var, Gen); |
111 | 110 |
|
112 | | -do_linify(Fun, {Left, Meta, Receiver}, {Receiver, Counter} = Var) |
| 111 | +do_linify(Fun, {Left, Meta, Receiver}, {Receiver, Counter} = Var, Gen) |
113 | 112 | when is_atom(Left), is_list(Meta), Left /= '_' -> |
114 | | - do_tuple_linify(Fun, keynew(counter, Meta, Counter), Left, Receiver, Var); |
| 113 | + do_tuple_linify(Fun, keynew(counter, Meta, Counter), Left, Receiver, Var, Gen); |
115 | 114 |
|
116 | | -do_linify(Fun, {Lexical, Meta, [_ | _] = Args}, {_, Counter} = Var) |
| 115 | +do_linify(Fun, {Lexical, Meta, [_ | _] = Args}, {_, Counter} = Var, Gen) |
117 | 116 | when ?lexical(Lexical); Lexical == '__aliases__' -> |
118 | | - do_tuple_linify(Fun, keynew(counter, Meta, Counter), Lexical, Args, Var); |
| 117 | + do_tuple_linify(Fun, keynew(counter, Meta, Counter), Lexical, Args, Var, Gen); |
| 118 | + |
| 119 | +do_linify(Fun, {Left, Meta, Right}, Var, Gen) when is_list(Meta) -> |
| 120 | + do_tuple_linify(Fun, Meta, Left, Right, Var, Gen); |
119 | 121 |
|
120 | | -do_linify(Fun, {Left, Meta, Right}, Var) when is_list(Meta) -> |
121 | | - do_tuple_linify(Fun, Meta, Left, Right, Var); |
| 122 | +do_linify(Fun, {Left, Right}, Var, Gen) -> |
| 123 | + {do_linify(Fun, Left, Var, Gen), do_linify(Fun, Right, Var, Gen)}; |
122 | 124 |
|
123 | | -do_linify(Fun, {Left, Right}, Var) -> |
124 | | - {do_linify(Fun, Left, Var), do_linify(Fun, Right, Var)}; |
| 125 | +do_linify(Fun, List, Var, Gen) when is_list(List) -> |
| 126 | + [do_linify(Fun, X, Var, Gen) || X <- List]; |
125 | 127 |
|
126 | | -do_linify(Fun, List, Var) when is_list(List) -> |
127 | | - [do_linify(Fun, X, Var) || X <- List]; |
| 128 | +do_linify(_, Else, _, _Gen) -> Else. |
128 | 129 |
|
129 | | -do_linify(_, Else, _) -> Else. |
| 130 | +do_tuple_linify(Fun, Meta, Left, Right, Var, Gen) -> |
| 131 | + {NewMeta, NewGen} = |
| 132 | + case keyfind(stop_generated, Meta) of |
| 133 | + {stop_generated, true} -> {keydelete(stop_generated, Meta), false}; |
| 134 | + _ when Gen -> {elixir_utils:generated(Meta), Gen}; |
| 135 | + _ -> {Meta, Gen} |
| 136 | + end, |
130 | 137 |
|
131 | | --compile({inline, do_tuple_linify/5}). |
132 | | -do_tuple_linify(Fun, Meta, Left, Right, Var) -> |
133 | | - {do_linify(Fun, Left, Var), Fun(Meta), do_linify(Fun, Right, Var)}. |
| 138 | + {do_linify(Fun, Left, Var, NewGen), Fun(NewMeta), do_linify(Fun, Right, Var, NewGen)}. |
134 | 139 |
|
135 | 140 | %% Escaping |
136 | 141 |
|
|
0 commit comments