Skip to content

Commit 83dbdff

Browse files
committed
Fixed issue where calling modules using the . syntax concatenated names instead of using . in js
1 parent 4f3c38c commit 83dbdff

10 files changed

Lines changed: 201 additions & 27 deletions

File tree

lib/elixir_script/parse_error.ex

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
11
defmodule ElixirScript.ParseError do
22
defexception [:message]
3-
4-
def exception(value) do
5-
msg = "Currently unsupported #{inspect value}"
6-
%ElixirScript.ParseError{message: msg}
7-
end
83
end

lib/elixir_script/translator.ex

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -129,36 +129,45 @@ defmodule ElixirScript.Translator do
129129
ExKernel.make___DIR__()
130130
end
131131

132-
defp do_translate({:receive, _, _expressions }) do
133-
raise ElixirScript.ParseError, :receive
132+
133+
# defp do_translate({:try, _, [ [do: do_block, rescue: clauses, after: after_block] ]}) do
134+
# Control.make_try(do_block, clauses, after_block)
135+
# end
136+
#
137+
# defp do_translate({:try, _, [ [do: do_block, rescue: clauses] ]}) do
138+
# Control.make_try(do_block, clauses)
139+
# end
140+
141+
defp do_translate({:try, _, _expressions}) do
142+
raise ElixirScript.UnsupportedError, ":try"
134143
end
135144

136-
defp do_translate({:super, _, _expressions }) do
137-
raise ElixirScript.ParseError, :super
145+
defp do_translate({:receive, _, _expressions }) do
146+
raise ElixirScript.UnsupportedError, :receive
138147
end
139148

140-
defp do_translate({:try, _, _expressions }) do
141-
raise ElixirScript.ParseError, :try
149+
defp do_translate({:super, _, _expressions }) do
150+
raise ElixirScript.UnsupportedError, :super
142151
end
143152

144153
defp do_translate({:__CALLER__, _, _expressions }) do
145-
raise ElixirScript.ParseError, :__CALLER__
154+
raise ElixirScript.UnsupportedError, :__CALLER__
146155
end
147156

148157
defp do_translate({:__ENV__, _, _expressions }) do
149-
raise ElixirScript.ParseError, :__ENV__
158+
raise ElixirScript.UnsupportedError, :__ENV__
150159
end
151160

152161
defp do_translate({:quote, [], _expr}) do
153-
raise ElixirScript.ParseError, :quote
162+
raise ElixirScript.UnsupportedError, :quote
154163
end
155164

156165
defp do_translate({:unquote, [], _expr}) do
157-
raise ElixirScript.ParseError, :unquote
166+
raise ElixirScript.UnsupportedError, :unquote
158167
end
159168

160169
defp do_translate({:unquote_splicing, _, _expressions }) do
161-
raise ElixirScript.ParseError, :unquote_splicing
170+
raise ElixirScript.UnsupportedError, :unquote_splicing
162171
end
163172

164173
defp do_translate({:import, _, [{:__aliases__, _, module_name_list}]}) do

lib/elixir_script/translator/control.ex

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ defmodule ElixirScript.Translator.Control do
150150
)
151151
end
152152
[into: expression] ->
153-
raise ElixirScript.ParseError, :into
153+
raise ElixirScript.UnsupportedError, :into
154154
[do: expression] ->
155155
push_last_expression(Translator.translate(expression))
156156
filter ->
@@ -289,4 +289,51 @@ defmodule ElixirScript.Translator.Control do
289289
)
290290
end
291291

292+
293+
def make_try(try_block, rescue_clauses, after_block) do
294+
IO.inspect(try_block)
295+
Builder.try_statement(
296+
Builder.block_statement(List.wrap(
297+
Translator.translate(try_block)
298+
)),
299+
Builder.catch_clause(
300+
Builder.identifier(:e),
301+
Builder.block_statement([])
302+
),
303+
Builder.block_statement(List.wrap(
304+
Translator.translate(after_block)
305+
))
306+
)
307+
end
308+
309+
def make_try(try_block, rescue_clauses) do
310+
Builder.try_statement(
311+
Builder.block_statement(List.wrap(Translator.translate(try_block))),
312+
Builder.catch_clause(
313+
Builder.identifier(:e),
314+
Builder.block_statement(translate_rescue_clauses(rescue_clauses))
315+
),
316+
nil
317+
)
318+
end
319+
320+
def translate_rescue_clauses(clauses) do
321+
Enum.map(clauses, fn(x) ->
322+
case x do
323+
{:->, _, [[error_name], block]} ->
324+
{body, _} = PatternMatching.build_pattern_matched_body(
325+
List.wrap(Translator.translate(block)),
326+
[error_name],
327+
fn(_index) ->
328+
Translator.translate(error_name)
329+
end,
330+
nil
331+
)
332+
333+
IO.inspect(body)
334+
hd(body)
335+
end
336+
end)
337+
end
338+
292339
end

lib/elixir_script/translator/utils.ex

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,54 @@ defmodule ElixirScript.Translator.Utils do
4444
end
4545

4646
def make_member_expression(module_name, function_name, computed \\ false) do
47-
Builder.member_expression(
48-
Builder.identifier(module_name),
49-
Builder.identifier(function_name),
50-
computed
51-
)
47+
case module_name do
48+
modules when is_list(modules) and length(modules) > 1 ->
49+
ast = Enum.chunk(modules, 2)
50+
|> Enum.reduce(nil, fn(x, ast) ->
51+
case x do
52+
[one] ->
53+
if is_nil(ast) do
54+
Builder.identifier(one)
55+
else
56+
Builder.member_expression(
57+
ast,
58+
Builder.identifier(one),
59+
computed
60+
)
61+
end
62+
[one, two] ->
63+
if is_nil(ast) do
64+
Builder.member_expression(
65+
Builder.identifier(one),
66+
Builder.identifier(two),
67+
computed
68+
)
69+
else
70+
Builder.member_expression(
71+
ast,
72+
Builder.member_expression(
73+
Builder.identifier(one),
74+
Builder.identifier(two),
75+
computed
76+
),
77+
computed
78+
)
79+
end
80+
end
81+
end)
82+
83+
Builder.member_expression(
84+
ast,
85+
Builder.identifier(function_name),
86+
computed
87+
)
88+
_ ->
89+
Builder.member_expression(
90+
Builder.identifier(module_name),
91+
Builder.identifier(function_name),
92+
computed
93+
)
94+
end
5295
end
5396

5497
def make_array_accessor_call(name, index) do
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
defmodule ElixirScript.UnsupportedError do
2+
defexception [:message]
3+
4+
def exception(value) do
5+
msg = "Currently unsupported #{inspect value}"
6+
%ElixirScript.UnsupportedError{message: msg}
7+
end
8+
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ defmodule ElixirScript.Mixfile do
2323
defp deps do
2424
[
2525
{ :poison, "~> 1.4" },
26-
{ :estree, "~> 1.0.1"},
26+
{ :estree, github: "bryanjos/elixir-estree"},
2727
{ :excoveralls, only: [:dev, :test] },
2828
{ :shouldi, github: "batate/shouldi", only: :test },
2929
{ :mix_test_watch, github: "lpil/mix-test.watch" }

mix.lock

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
%{"estree": {:hex, :estree, "1.0.1"},
2-
"excoveralls": {:hex, :excoveralls, "0.3.9"},
1+
%{"estree": {:git, "git://github.com/bryanjos/elixir-estree.git", "527fa7005504884359b66da3c9eb53c706dfccb1", []},
2+
"excoveralls": {:hex, :excoveralls, "0.3.10"},
33
"exjsx": {:hex, :exjsx, "3.1.0"},
44
"fs": {:hex, :fs, "0.9.2"},
55
"hackney": {:hex, :hackney, "1.1.0"},
66
"idna": {:hex, :idna, "1.0.2"},
77
"jsx": {:hex, :jsx, "2.4.0"},
8-
"mix_test_watch": {:git, "git://github.com/lpil/mix-test.watch.git", "79aacc3d36ab6dee483f9e75f6e1d84dc0ab6ab8", []},
8+
"mix_test_watch": {:git, "git://github.com/lpil/mix-test.watch.git", "2fa4dc88271ce1c3544c7069fedbc107437d0d6d", []},
99
"poison": {:hex, :poison, "1.4.0"},
10+
"porcelain": {:hex, :porcelain, "2.0.0"},
1011
"shouldi": {:git, "git://github.com/batate/shouldi.git", "319737ba8ab0152df31fb0761994029da815b316", []},
1112
"ssl_verify_hostname": {:hex, :ssl_verify_hostname, "1.0.4"}}

test/test_helper.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ defmodule ElixirScript.TestHelper do
1414
{:ok, js_code} ->
1515
js_code
1616
{:error, error} ->
17-
raise ElixirScript.ParseError, message: error
17+
raise ElixirScript.ParseError, message: Poison.encode!(js_ast)
1818
end
1919
end
2020

test/translator/bug_test.exs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
defmodule ElixirScript.Translator.Bug.Test do
2+
use ShouldI
3+
import ElixirScript.TestHelper
4+
5+
6+
should "correctly call multi-module functions" do
7+
ex_ast = quote do
8+
def getDispatcher() do
9+
DeLorean.Flux.createDispatcher(%{
10+
startPainting: fn() -> this.dispatch("startPainting") end,
11+
stopPainting: fn() -> this.dispatch("stopPainting") end,
12+
addPoint: fn(data) -> this.dispatch("addPoint", data) end,
13+
getStores: fn() -> %{ graphic: GraphicStore } end
14+
})
15+
end
16+
end
17+
18+
19+
js_code = """
20+
export function getDispatcher() {
21+
return DeLorean.Flux.createDispatcher({
22+
'startPainting': function () {
23+
return this.dispatch('startPainting');
24+
},
25+
'stopPainting': function () {
26+
return this.dispatch('stopPainting');
27+
},
28+
'addPoint': function (data) {
29+
return this.dispatch('addPoint', data);
30+
},
31+
'getStores': function () {
32+
return { 'graphic': GraphicStore };
33+
}
34+
});
35+
}
36+
"""
37+
38+
assert_translation(ex_ast, js_code)
39+
end
40+
41+
42+
end

test/translator/try_test.exs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
defmodule ElixirScript.Translator.Try.Test do
2+
use ShouldI
3+
import ElixirScript.TestHelper
4+
5+
should "translate " do
6+
ex_ast = quote do
7+
try do
8+
do_something_that_may_fail(some_arg)
9+
rescue
10+
ArgumentError ->
11+
IO.puts "Invalid argument given"
12+
end
13+
end
14+
15+
js_code = """
16+
try{
17+
do_something_that_may_fail(some_arg);
18+
} catch(e){
19+
if(Kernel.match({__struct__: 'ArgumentError'}, e)){
20+
IO.puts('Invalid argument given');
21+
}else{
22+
throw e;
23+
}
24+
}
25+
"""
26+
27+
assert_translation(ex_ast, js_code)
28+
end
29+
end

0 commit comments

Comments
 (0)