Skip to content

Commit fa9683e

Browse files
committed
Fixed bug where defstruct with a list of atoms failed
1 parent 4a058e6 commit fa9683e

File tree

13 files changed

+189
-26
lines changed

13 files changed

+189
-26
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# v0.16.0-dev
2+
13
# v0.15.0
24
* Enhancements
35
* `alias`, `require`, and `import` now work inside lexical scopes

lib/elixir_script.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ defmodule ElixirScript do
4242

4343
@external_resource libs_path = Path.join([__DIR__, "elixir_script", "prelude", "**", "*.ex"])
4444
@libs Enum.filter(Path.wildcard(libs_path), fn(path) ->
45-
!String.contains?(path, @modules_to_not_read)
45+
!String.contains?(path, @modules_to_not_read)
4646
end)
4747
|> Enum.map(fn(path) ->
4848
path
@@ -147,7 +147,7 @@ defmodule ElixirScript do
147147
compiler_opts.import_standard_libs == false && ast.name in standard_lib_modules
148148
end)
149149
|> Enum.map(fn ast ->
150-
spawn_link fn ->
150+
spawn_link fn ->
151151
env = ElixirScript.Translator.Env.module_env(ast.name, Utils.name_to_js_file_name(ast.name) <> ".js")
152152

153153
module = case ast.type do

lib/elixir_script/translator.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ defmodule ElixirScript.Translator do
2121
alias ElixirScript.Translator.Utils
2222
alias ElixirScript.Translator.JS, as: JSLib
2323
alias ESTree.Tools.Builder, as: JS
24+
alias ElixirScript.Translator.Rewriter
2425

2526

2627

@@ -185,6 +186,11 @@ defmodule ElixirScript.Translator do
185186
end
186187
end
187188

189+
defp do_translate({{:., _, [erlang_module, _]}, _, _} = erlang_function_call, env) when erlang_module in [:erlang, :maps, :lists] do
190+
Rewriter.rewrite(erlang_function_call)
191+
|> translate(env)
192+
end
193+
188194
defp do_translate({{:., _, [Access, :get]}, _, [target, property]}, env) do
189195
{ Map.make_get_property(target, property, env), env }
190196
end

lib/elixir_script/translator/env.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ defmodule ElixirScript.Translator.Env do
8383
end
8484

8585
defp get_module(env, module_name) do
86-
module = ElixirScript.Translator.State.get_module(module_name)
86+
module = get_module_name(env, module_name) |>
87+
ElixirScript.Translator.State.get_module
8788

8889
unless module do
8990
raise "Module #{module_name} not found"

lib/elixir_script/translator/rewriter.ex

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
defmodule ElixirScript.Translator.Rewriter do
22

3+
# :erlang, :lists, :maps, :beam_lib, :binary, :calendar, :digraph,
4+
# :epp, :erl_lint, :erl_internal, :erl_expand_records, :erl_eval,
5+
# :ets, :filename, :gen_event, :gen_server, :io, :io_lib, :math,
6+
# :ordsets, :proc_lib, :rand, :re, :sets, :supervisor,:sys, :timer,
7+
# :unicode, :os, :application, :code, :gen_tcp, :error_logger, :gen,
8+
# :file
9+
# http://erlang.org/doc/applications.html
10+
311

412
def rewrite({{:., _, [:erlang, :abs]}, _, [number]}) do
513
quote do: Math.abs(unquote(number))
@@ -55,7 +63,7 @@ defmodule ElixirScript.Translator.Rewriter do
5563
end
5664

5765
def rewrite({{:., _, [:erlang, :is_float]}, _, [term]}) do
58-
quote do: (JS.typeof(unquote(term)) === "number" || JS.instanceof(unquote(term, Number))) && !Number.isInteger(unquote(term))
66+
quote do: (JS.typeof(unquote(term)) === "number" || JS.instanceof(unquote(term), Number)) && !Number.isInteger(unquote(term))
5967
end
6068

6169
def rewrite({{:., _, [:erlang, :is_function]}, _, [term]}) do
@@ -177,11 +185,6 @@ defmodule ElixirScript.Translator.Rewriter do
177185
quote do: nil
178186
end
179187

180-
def rewrite({{:., _, [:erlang, :spawn_monitor]}, _, [_module, _fun, _args]}) do
181-
#TODO: implement spawn_monitor
182-
quote do: nil
183-
end
184-
185188
def rewrite({{:., _, [:erlang, :throw]}, _, [term]}) do
186189
quote do: JS.throw(unquote(term))
187190
end
@@ -258,6 +261,43 @@ defmodule ElixirScript.Translator.Rewriter do
258261
quote do: JS.throw(unquote(reason))
259262
end
260263

264+
def rewrite({{:., _, [:erlang, :atom_to_binary]}, _, [atom, _]}) do
265+
quote do: Symbol.keyFor(unquote(atom))
266+
end
267+
268+
def rewrite({{:., _, [:erlang, :atom_to_list]}, _, [atom]}) do
269+
quote do: to_string(unquote(atom)).split("")
270+
end
271+
272+
def rewrite({{:., _, [:erlang, :bnot]}, _, [expr]}) do
273+
{:"~", [], [expr]}
274+
end
275+
276+
def rewrite({{:., _, [:erlang, :band]}, _, [left, right]}) do
277+
{:&, [], [left, right]}
278+
end
279+
280+
def rewrite({{:., _, [:erlang, :bor]}, _, [left, right]}) do
281+
{:|, [], [left, right]}
282+
end
283+
284+
def rewrite({{:., _, [:erlang, :bxor]}, _, [left, right]}) do
285+
{:^, [], [left, right]}
286+
end
287+
288+
def rewrite({{:., _, [:erlang, :bsl]}, _, [left, right]}) do
289+
{:"<<", [], [left, right]}
290+
end
291+
292+
def rewrite({{:., _, [:erlang, :bsr]}, _, [left, right]}) do
293+
{:">>", [], [left, right]}
294+
end
295+
296+
def rewrite({{:., _, [:erlang, :function_exported]}, _, [_, _, _]}) do
297+
quote do: true
298+
end
299+
300+
261301
def rewrite({{:., _, [:lists, :map]}, _, [fun, list]}) do
262302
quote do: unquote(list).map(unquote(fun))
263303
end
@@ -298,5 +338,9 @@ defmodule ElixirScript.Translator.Rewriter do
298338
quote do: Elixir.Core.Functions.update_map(unquote(map), unquote(key), unquote(value))
299339
end
300340

341+
def rewrite({{:., _, [:maps, :find]}, _, [key, map]}) do
342+
quote do: Elixir.Core.Functions.maps_find(unquote(key), unquote(map))
343+
end
344+
301345

302346
end

lib/elixir_script/translator/state.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ defmodule ElixirScript.Translator.State do
9191
Agent.get(__MODULE__, &(&1))
9292
end
9393

94+
def get_module_name({:__aliases__, _, _} = name) do
95+
get_module_name(Utils.quoted_to_name(name))
96+
end
97+
9498
def get_module_name(module_name) do
9599
Agent.get(__MODULE__, fn(state) ->
96100
do_get_module_name(module_name, state)

lib/elixir_script/translator/struct.ex

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,17 @@ defmodule ElixirScript.Translator.Struct do
3636
def make_defstruct(attributes, env) when length(attributes) == 1 do
3737
attributes = Enum.flat_map(attributes, fn(x) -> x end)
3838

39-
defaults = Enum.map(attributes, fn({x, y}) ->
40-
Map.make_property(
41-
Translator.translate!(x, env),
42-
Translator.translate!(y, env)
43-
)
39+
defaults = Enum.map(attributes, fn
40+
({x, y}) ->
41+
Map.make_property(
42+
Translator.translate!(x, env),
43+
Translator.translate!(y, env)
44+
)
45+
(attribute) ->
46+
Map.make_property(
47+
Translator.translate!(attribute, env),
48+
Translator.translate!(nil, env)
49+
)
4450
end)
4551
|> JS.object_expression
4652

mix.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ defmodule ElixirScript.Mixfile do
44
def project do
55
[
66
app: :elixir_script,
7-
version: "0.15.0",
7+
version: "0.16.0-dev",
88
elixir: "~> 1.0",
99
escript: escript_config,
1010
deps: deps,
@@ -28,7 +28,7 @@ defmodule ElixirScript.Mixfile do
2828

2929
defp deps do
3030
[
31-
{:estree, "~> 2.0"},
31+
{:estree, "~> 2.2"},
3232
{:earmark, "~> 0.2", only: :dev },
3333
{:ex_doc, "~> 0.11", only: :dev },
3434
{:excoveralls, "~> 0.4", only: :test},

mix.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
"certifi": {:hex, :certifi, "0.3.0"},
44
"credo": {:hex, :credo, "0.2.5"},
55
"dogma": {:hex, :dogma, "0.0.7"},
6-
"earmark": {:hex, :earmark, "0.2.0"},
7-
"estree": {:hex, :estree, "2.1.2"},
8-
"ex_doc": {:hex, :ex_doc, "0.11.3"},
9-
"excoveralls": {:hex, :excoveralls, "0.4.3"},
6+
"earmark": {:hex, :earmark, "0.2.1"},
7+
"estree": {:hex, :estree, "2.2.0"},
8+
"ex_doc": {:hex, :ex_doc, "0.11.4"},
9+
"excoveralls": {:hex, :excoveralls, "0.4.5"},
1010
"exjsx": {:hex, :exjsx, "3.2.0"},
1111
"hackney": {:hex, :hackney, "1.4.8"},
1212
"idna": {:hex, :idna, "1.0.3"},

priv/Elixir.js

Lines changed: 94 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)