Skip to content

Commit 6fee69e

Browse files
committed
Fixed issues found while testing
1 parent 9bc5380 commit 6fee69e

7 files changed

Lines changed: 97 additions & 5 deletions

File tree

lib/elixir_script/prelude/string.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
defmodule ElixirScript.String do
2-
@moduledoc false
2+
@moduledoc false
33
import Kernel, except: [length: 1]
44

55
def to_atom(str) do
@@ -54,6 +54,20 @@ defmodule ElixirScript.String do
5454
str.split()
5555
end
5656

57+
def split(str, replace, options \\ []) do
58+
limit = Keyword.get(options, :parts, -1)
59+
trim = Keyword.get(options, :trim, false)
60+
split = str.split(replace, limit)
61+
62+
Enum.map(split, fn(x) ->
63+
if trim do
64+
x.trim()
65+
else
66+
x
67+
end
68+
end)
69+
end
70+
5771

5872
def next_grapheme(nil), do: nil
5973
def next_grapheme(""), do: nil

lib/elixir_script/translator.ex

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,34 @@ defmodule ElixirScript.Translator do
108108
Expression.make_unary_expression(:!, value, env)
109109
end
110110

111+
defp do_translate({:"~~~", _, [value]}, env) do
112+
Expression.make_unary_expression(:"~~~", value, env)
113+
end
114+
111115
defp do_translate({operator, _, [left, right]}, env) when operator in [:+, :-, :/, :*, :==, :!=, :&&, :||, :>, :<, :>=, :<=, :===, :!==, :"**"] do
112116
Expression.make_binary_expression(operator, left, right, env)
113117
end
114118

119+
defp do_translate({:&&&, _, [left, right]}, env) do
120+
Expression.make_binary_expression(:&, left, right, env)
121+
end
122+
123+
defp do_translate({:<<<, _, [left, right]}, env) do
124+
Expression.make_binary_expression(:<, left, right, env)
125+
end
126+
127+
defp do_translate({:>>>, _, [left, right]}, env) do
128+
Expression.make_binary_expression(:^, left, right, env)
129+
end
130+
131+
defp do_translate({:^^^, _, [left, right]}, env) do
132+
Expression.make_binary_expression(:^, left, right, env)
133+
end
134+
135+
defp do_translate({:|||, _, [left, right]}, env) do
136+
Expression.make_binary_expression(:|, left, right, env)
137+
end
138+
115139
defp do_translate({:and, _, [left, right]}, env) do
116140
Expression.make_binary_expression(:&&, left, right, env)
117141
end

lib/elixir_script/translator/kernel/special_forms/call.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ defmodule ElixirScript.Translator.Call do
7575
end
7676

7777
def make_function_call(module_name, function_name, params, env) do
78+
params = case params do
79+
atom when is_atom(atom) ->
80+
[]
81+
nil ->
82+
[]
83+
_ ->
84+
params
85+
end
86+
7887
the_name = get_module_name_for_function(module_name, env)
7988
{ make_call_expression(the_name, function_name, params, env), env }
8089
end

lib/elixir_script/translator/kernel/special_forms/fn.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ defmodule ElixirScript.Translator.Function do
112112
end
113113

114114
def make_function_clause(patterns, params, body, guard_body, is_generator?) do
115+
115116
arguments = case guard_body do
116117
nil ->
117118
[

lib/elixir_script/translator/kernel/special_forms/receive.ex

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ defmodule ElixirScript.Translator.Receive do
2121
)
2222
])
2323

24+
2425
{js, env}
2526
end
2627

@@ -47,7 +48,8 @@ defmodule ElixirScript.Translator.Receive do
4748
end
4849

4950
def call_processes_func(func_name, params) do
50-
JS.call_expression(
51+
JS.yield_expression(
52+
JS.call_expression(
5153
JS.member_expression(
5254
JS.member_expression(
5355
JS.identifier("Elixir"),
@@ -59,7 +61,8 @@ defmodule ElixirScript.Translator.Receive do
5961
JS.identifier(func_name)
6062
),
6163
params
62-
)
64+
)
65+
)
6366
end
6467

6568
end

test/translator/bitwise_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
defmodule ElixirScript.Translator.Bitwise.Test do
2+
use ExUnit.Case
3+
import ElixirScript.TestHelper
4+
5+
test "bitwise when imported" do
6+
ex_ast = quote do
7+
import Bitwise
8+
1 &&& 2
9+
end
10+
11+
js_code = "1 & 2"
12+
13+
assert_translation(ex_ast, js_code)
14+
end
15+
end

test/translator/kernel/receive_test.exs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule ElixirScript.Translator.Receive.Test do
1717
end
1818

1919
js_code = """
20-
Elixir.Core.processes.receive(function(message) {
20+
yield Elixir.Core.processes.receive(function(message) {
2121
return Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.clause([Symbol.for('ok')],function() {
2222
return value;
2323
}),Elixir.Core.Patterns.clause([Symbol.for('error')],function() {
@@ -47,7 +47,7 @@ defmodule ElixirScript.Translator.Receive.Test do
4747
end
4848

4949
js_code = """
50-
Elixir.Core.processes.receive(function(message) {
50+
yield Elixir.Core.processes.receive(function(message) {
5151
return Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.clause([Symbol.for('ok')],function() {
5252
return value;
5353
}),Elixir.Core.Patterns.clause([Symbol.for('error')],function() {
@@ -62,4 +62,30 @@ defmodule ElixirScript.Translator.Receive.Test do
6262

6363
assert_translation(ex_ast, js_code)
6464
end
65+
66+
test "translate receive" do
67+
ex_ast = quote do
68+
require JS
69+
70+
defgen await(counter) do
71+
receive do
72+
{:ping, sender} -> send sender, {:pong, self}
73+
end
74+
end
75+
end
76+
77+
js_code = """
78+
const await = Elixir.Core.Patterns.defmatchgen(Elixir.Core.Patterns.clause([Elixir.Core.Patterns.variable()], function*(counter) {
79+
return yield Elixir.Core.processes.receive(function(message) {
80+
return Elixir.Core.Patterns.defmatchgen(Elixir.Core.Patterns.clause([Elixir.Core.Patterns.type(Elixir.Core.Tuple, {
81+
values: [Symbol.for('ping'), Elixir.Core.Patterns.variable()]
82+
})], function*(sender) {
83+
return Elixir$ElixirScript$Kernel.send(sender, new Elixir.Core.Tuple(Symbol.for('pong'), Elixir$ElixirScript$Kernel.self()));
84+
})).call(this, message);
85+
});
86+
}));
87+
"""
88+
89+
assert_translation(ex_ast, js_code)
90+
end
6591
end

0 commit comments

Comments
 (0)