|
|
@ -0,0 +1,69 @@ |
|
|
|
defmodule ErlToEx do |
|
|
|
@ellipse quote(do: ...) |
|
|
|
|
|
|
|
def erl_variable_name_to_ex_variable_name(erl_var_name) do |
|
|
|
case String.match?(erl_var_name, ~r/@|_/) do |
|
|
|
true -> |
|
|
|
case Regex.run(~r/_([^@_]+)@.*/, erl_var_name) do |
|
|
|
[_, match] -> match |
|
|
|
_ -> "..." |
|
|
|
end |
|
|
|
|
|
|
|
false -> |
|
|
|
Macro.underscore(erl_var_name) |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:var, _loc, erl_var}) when is_atom(erl_var) do |
|
|
|
erl_var_name = Atom.to_string(erl_var) |
|
|
|
ex_var_name = erl_variable_name_to_ex_variable_name(erl_var_name) |
|
|
|
ex_var = String.to_atom(ex_var_name) |
|
|
|
{ex_var, [], nil} |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:op, _loc, erl_op, left, right}) do |
|
|
|
ex_op = op_erl_to_ex(erl_op) |
|
|
|
ex_left = erl_to_ex(left) |
|
|
|
ex_right = erl_to_ex(right) |
|
|
|
{ex_op, [], [ex_left, ex_right]} |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:atom, _meta, atom}), do: atom |
|
|
|
def erl_to_ex({:string, _meta, charlist}), do: charlist |
|
|
|
def erl_to_ex({:integer, _meta, integer}), do: integer |
|
|
|
def erl_to_ex({:float, _meta, float}), do: float |
|
|
|
|
|
|
|
def erl_to_ex({:bin, _meta, patterns}) do |
|
|
|
patterns_ex = Enum.map(patterns, &erl_to_ex/1) |
|
|
|
quote(do: <<unquote_splicing(patterns_ex)>>) |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:bin_element, _meta, value, size, :default}) do |
|
|
|
value_ex = erl_to_ex(value) |
|
|
|
size_ex = erl_to_ex(size) |
|
|
|
quote(do: unquote(value_ex) :: size(unquote(size_ex))) |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:bin_element, _meta, _value, _size, _type}), do: @ellipse |
|
|
|
|
|
|
|
def erl_to_ex({:call, _line1, {:remote, _, m, f}, args}) when is_list(args) do |
|
|
|
args_ex = Enum.map(args, &erl_to_ex/1) |
|
|
|
m_ex = erl_to_ex(m) |
|
|
|
f_ex = erl_to_ex(f) |
|
|
|
quote(do: unquote(m_ex).unquote(f_ex)(unquote_splicing(args_ex))) |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex({:call, _line1, {:var, _, _} = f, args}) do |
|
|
|
ex_args = Enum.map(args, &erl_to_ex/1) |
|
|
|
ex_f = erl_to_ex(f) |
|
|
|
quote(do: unquote(ex_f).(unquote_splicing(ex_args))) |
|
|
|
end |
|
|
|
|
|
|
|
def erl_to_ex(_), do: @ellipse |
|
|
|
|
|
|
|
def op_erl_to_ex(op) when op == :"=<", do: :<= |
|
|
|
def op_erl_to_ex(op) when op == :"/=", do: :!= |
|
|
|
def op_erl_to_ex(op) when op == :"=/=", do: :!== |
|
|
|
def op_erl_to_ex(op) when op == :"=:=", do: :=== |
|
|
|
def op_erl_to_ex(op), do: op |
|
|
|
end |