Current section

Files

Jump to
elixir_script lib elixir_script translator kernel js.ex
Raw

lib/elixir_script/translator/kernel/js.ex

defmodule ElixirScript.Translator.JS do
@moduledoc false
alias ESTree.Tools.Builder
alias ElixirScript.Translator
alias ElixirScript.Translator.Identifier
alias ElixirScript.ModuleSystems
@doc false
def translate_js_function(name, params, env) do
{ do_translate({name, [], params}, env), env }
end
defp do_translate({op, _, [param]}, env) when op in [:typeof, :delete, :void, :-, :+, :!, :"~"] do
Builder.unary_expression(
op,
true,
Translator.translate!(param, env)
)
end
defp do_translate({op, _, [value, type]}, env) when op in [:"**", :==, :!=, :===, :!==, :<, :<=, :>, :>=, :"<<", :">>", :<<<, :+, :-, :*, :/, :%, :|, :^, :&, :in, :instanceof] do
Builder.binary_expression(
op,
Translator.translate!(value, env),
Translator.translate!(type, env)
)
end
defp do_translate({op, _, [value, type]}, env) when op in [:||, :&&] do
Builder.logical_expression(
op,
Translator.translate!(value, env),
Translator.translate!(type, env)
)
end
defp do_translate({:yield, _, []}, env) do
Builder.yield_expression()
end
defp do_translate({:yield, _, [term]}, env) do
Builder.yield_expression(
Translator.translate!(term, env)
)
end
defp do_translate({:yield_to, _, [term]}, env) do
Builder.yield_expression(
Translator.translate!(term, env),
true
)
end
defp do_translate({:throw, _, [term]}, env) do
Builder.throw_statement(
Translator.translate!(term, env)
)
end
defp do_translate({:new, _, [module_name, params]}, env) when not is_list(params) do
Builder.new_expression(
Translator.translate!(module_name, env),
[Builder.rest_element(Translator.translate!(params, env))]
)
end
defp do_translate({:new, _, [module_name, params]}, env) do
Builder.new_expression(
Translator.translate!(module_name, env),
Enum.map(params, &Translator.translate!(&1, env))
)
end
defp do_translate({:update, _, [object, map]}, env) do
quoted = quote do
Object.assign(unquote(object), unquote(map))
end
Translator.translate!(quoted, env)
end
defp do_translate({:import, _, [module_name, from, [default: false]]}, env) do
ModuleSystems.import_namespace_module(module_name, from, env)
end
defp do_translate({:import, _, [module_name, from, [default: true]]}, env) do
ModuleSystems.import_module(module_name, from, env)
end
defp do_translate({:import, _, [module_name, from]}, env) do
ModuleSystems.import_module(module_name, from, env)
end
defp do_translate({:object, _, [args]}, env) do
args = Enum.map(args, fn
{ k, v } when Kernel.is_atom(k) ->
{ Atom.to_string(k), v }
pair ->
pair
end)
Translator.translate!({ :%{}, [], args }, env)
end
end