Skip to content

Commit 315931e

Browse files
committed
Now appending the counter value to variables if exists
fixes #346
1 parent e93906a commit 315931e

File tree

2 files changed

+38
-13
lines changed

2 files changed

+38
-13
lines changed

lib/elixir_script/passes/translate/form.ex

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,14 +386,18 @@ defmodule ElixirScript.Translate.Form do
386386
end
387387
end
388388

389-
def compile({:default, _, _}, state) do
389+
def compile({:default, meta, _}, state) do
390+
counter = Pattern.get_counter(meta)
391+
390392
var = :__default__
391-
var = Pattern.get_variable_name(to_string(var), state)
393+
var = Pattern.get_variable_name(to_string(var) <> counter, state)
392394
{ ElixirScript.Translate.Identifier.make_identifier(var), state }
393395
end
394396

395-
def compile({var, _, _}, state) do
396-
var = Pattern.get_variable_name(to_string(var), state)
397+
def compile({var, meta, _}, state) do
398+
counter = Pattern.get_counter(meta)
399+
400+
var = Pattern.get_variable_name(to_string(var) <> counter, state)
397401
{ ElixirScript.Translate.Identifier.make_identifier(var), state }
398402
end
399403

lib/elixir_script/passes/translate/forms/pattern.ex

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,12 @@ defmodule ElixirScript.Translate.Forms.Pattern do
194194

195195
defp process_pattern({:<<>>, _, elements}, state) do
196196
params = Enum.reduce(elements, [], fn
197-
({:::, _, [{ variable, _, params }, _]}, state) when is_nil(params)
197+
({:::, _, [{ _, _, params } = ast, _]}, state) when is_nil(params)
198198
when is_list(params) and length(params) == 0 ->
199-
state ++ [ElixirScript.Translate.Identifier.make_identifier(variable)]
199+
200+
var_str = make_identifier(ast)
201+
var_atom = String.to_atom(var_str)
202+
state ++ [ElixirScript.Translate.Identifier.make_identifier(var_atom)]
200203
_, state ->
201204
state
202205
end)
@@ -215,16 +218,18 @@ defmodule ElixirScript.Translate.Forms.Pattern do
215218
{ [PM.starts_with(prefix)], [Form.compile!(value, state)] }
216219
end
217220

218-
defp process_pattern({:=, _, [{name, _, _}, right]}, state) when not name in [:%, :{}, :^, :%{}, :<<>>] do
219-
unify(name, right, state)
221+
defp process_pattern({:=, _, [{name, _, _} = target, right]}, state) when not name in [:%, :{}, :^, :%{}, :<<>>] do
222+
unify(target, right, state)
220223
end
221224

222-
defp process_pattern({:=, _, [left, {name, _, _}]}, state) when not name in [:%, :{}, :^, :%{}, :<<>>] do
223-
unify(name, left, state)
225+
defp process_pattern({:=, _, [left, {name, _, _} = target]}, state) when not name in [:%, :{}, :^, :%{}, :<<>>] do
226+
unify(target, left, state)
224227
end
225228

226-
defp process_pattern({var, _, a}, _) when is_atom(a) do
227-
{ [PM.parameter(J.literal(to_string(var)))], [ElixirScript.Translate.Identifier.make_identifier(var)] }
229+
defp process_pattern({_, _, a} = ast, _) when is_atom(a) do
230+
var_str = make_identifier(ast)
231+
var_atom = String.to_atom(var_str)
232+
{ [PM.parameter(J.literal(var_str))], [ElixirScript.Translate.Identifier.make_identifier(var_atom)] }
228233
end
229234

230235
defp process_pattern(ast, state) do
@@ -240,6 +245,22 @@ defmodule ElixirScript.Translate.Forms.Pattern do
240245

241246
defp unify(target, source, state) do
242247
{ patterns, params } = do_compile([source], state)
243-
{ [PM.capture(hd(patterns))], params ++ [ElixirScript.Translate.Identifier.make_identifier(target)] }
248+
{ [_] , [param] } = process_pattern(target, state)
249+
{ [PM.capture(hd(patterns))], params ++ [param] }
250+
end
251+
252+
def get_counter(meta) do
253+
case Keyword.get(meta, :counter, nil) do
254+
nil -> ""
255+
counter ->
256+
counter
257+
|> Kernel.abs()
258+
|> to_string()
259+
end
260+
end
261+
262+
defp make_identifier({var, meta, _}) do
263+
counter = get_counter(meta)
264+
to_string(var) <> counter
244265
end
245266
end

0 commit comments

Comments
 (0)