Skip to content

Commit da3b97c

Browse files
committed
Getting closer to working receive
1 parent e19a922 commit da3b97c

File tree

16 files changed

+125
-94
lines changed

16 files changed

+125
-94
lines changed

lib/elixir_script/passes/output/js_module.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule ElixirScript.Output.JSModule do
1717
end
1818

1919
def start do
20-
start_process_call = Helpers.call_non_scheduled(
20+
start_process_call = Helpers.call(
2121
J.member_expression(
2222
Helpers.process_system(),
2323
J.identifier("spawn")

lib/elixir_script/passes/translate/clause.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ defmodule ElixirScript.Translate.Clause do
1818
body = body
1919
|> return_last_statement
2020

21-
ast = Helpers.call_non_scheduled(
21+
ast = Helpers.call(
2222
J.member_expression(
2323
Helpers.patterns(),
2424
J.identifier("clause")

lib/elixir_script/passes/translate/form.ex

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ defmodule ElixirScript.Translate.Form do
44
# Handles translation of all forms that are not functions or clauses
55

66
alias ESTree.Tools.Builder, as: J
7-
alias ElixirScript.Translate.Helpers
7+
alias ElixirScript.Translate.{Helpers, Clause}
88
alias ElixirScript.Translate.Forms.{Bitstring, Match, Try, For, Receive, Remote, Pattern, With}
9-
alias ElixirScript.Translate.Clause
109
require Logger
1110

1211
@js_reserved_words [
@@ -177,7 +176,7 @@ defmodule ElixirScript.Translate.Form do
177176
end
178177

179178
def compile({:case, _, [condition, [do: clauses]]}, state) do
180-
ast = Helpers.call_non_scheduled(
179+
ast = Helpers.call(
181180
J.member_expression(
182181
Helpers.special_forms(),
183182
J.identifier("_case")
@@ -214,7 +213,7 @@ defmodule ElixirScript.Translate.Form do
214213
J.identifier("cond")
215214
)
216215

217-
ast = Helpers.call_non_scheduled(
216+
ast = Helpers.call(
218217
cond_function,
219218
processed_clauses
220219
)

lib/elixir_script/passes/translate/forms/for.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ defmodule ElixirScript.Translate.Forms.For do
1515
fun = args.fun
1616

1717

18-
expression = Helpers.call_non_scheduled(
18+
expression = Helpers.call(
1919
JS.member_expression(
2020
Helpers.patterns(),
2121
JS.identifier("clause")
@@ -30,7 +30,7 @@ defmodule ElixirScript.Translate.Forms.For do
3030
[JS.identifier("Elixir")]
3131
)
3232

33-
ast = Helpers.call_non_scheduled(
33+
ast = Helpers.call(
3434
JS.member_expression(
3535
Helpers.special_forms(),
3636
JS.identifier("_for")
@@ -58,7 +58,7 @@ defmodule ElixirScript.Translate.Forms.For do
5858

5959
{patterns, params, module_state} = Pattern.compile([{:<<>>, [], bs_parts}], module_state)
6060

61-
gen = Helpers.call_non_scheduled(
61+
gen = Helpers.call(
6262
JS.member_expression(
6363
Helpers.patterns(),
6464
JS.identifier("bitstring_generator")
@@ -71,7 +71,7 @@ defmodule ElixirScript.Translate.Forms.For do
7171
({:<-, _, [identifier, enum]}, state) ->
7272
{patterns, params, module_state} = Pattern.compile([identifier], module_state)
7373

74-
gen = Helpers.call_non_scheduled(
74+
gen = Helpers.call(
7575
JS.member_expression(
7676
Helpers.patterns(),
7777
JS.identifier("list_generator")

lib/elixir_script/passes/translate/forms/js.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ defmodule ElixirScript.Translate.Forms.JS do
5555
end
5656

5757
def compile({{:., _, [ElixirScript.JS, :import]}, _, [term]}, state) do
58-
ast = Helpers.call_non_scheduled(
58+
ast = Helpers.call(
5959
J.identifier("import"),
6060
[Form.compile!(term, state)]
6161
)
@@ -64,7 +64,7 @@ defmodule ElixirScript.Translate.Forms.JS do
6464
end
6565

6666
def compile({{:., _, [ElixirScript.JS, :mutate]}, _, [object, map]}, state) do
67-
ast = Helpers.call_non_scheduled(
67+
ast = Helpers.call(
6868
J.member_expression(
6969
J.identifier("Object"),
7070
J.identifier("assign")
@@ -92,7 +92,7 @@ defmodule ElixirScript.Translate.Forms.JS do
9292
end
9393

9494
def compile({{:., _, [ElixirScript.JS, :map_to_object]}, _, [object]}, state) do
95-
ast = Helpers.call_non_scheduled(
95+
ast = Helpers.call(
9696
J.member_expression(
9797
Helpers.functions(),
9898
J.identifier("map_to_object")
@@ -106,7 +106,7 @@ defmodule ElixirScript.Translate.Forms.JS do
106106
end
107107

108108
def compile({{:., _, [ElixirScript.JS, :map_to_object]}, _, [object, options]}, state) do
109-
ast = Helpers.call_non_scheduled(
109+
ast = Helpers.call(
110110
J.member_expression(
111111
Helpers.functions(),
112112
J.identifier("map_to_object")

lib/elixir_script/passes/translate/forms/match.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ defmodule ElixirScript.Translate.Forms.Match do
1818

1919
{ patterns, params, state } = Pattern.compile([left], state)
2020

21-
array_pattern = Helpers.declare(params, Helpers.call_non_scheduled(
21+
array_pattern = Helpers.declare(params, Helpers.call(
2222
J.member_expression(
2323
Helpers.patterns(),
2424
J.identifier("match")
Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,48 @@
11
defmodule ElixirScript.Translate.Forms.Receive do
22
@moduledoc false
33
alias ESTree.Tools.Builder, as: J
4-
alias ElixirScript.Translate.Helpers
4+
alias ElixirScript.Translate.{Helpers, Form, Function, Clause}
55

66
@doc """
77
receive is not supported just yet, but we compile it
88
to a stub function for now
99
"""
1010
def compile(blocks, state) do
11-
_receive_block = Keyword.get(blocks, :do)
12-
_after_block = Keyword.get(blocks, :after, nil)
11+
receive_block = Keyword.get(blocks, :do)
12+
after_block = Keyword.get(blocks, :after, nil)
13+
14+
receive_block = Enum.map(receive_block, fn x -> Clause.compile(x, state) |> elem(0) end)
15+
|> List.flatten
16+
|> J.array_expression()
1317

1418
receive_function = J.member_expression(
1519
Helpers.special_forms(),
1620
J.identifier("receive")
1721
)
1822

23+
args = [receive_block] ++ process_after(after_block, state)
24+
1925
ast = Helpers.call(
2026
receive_function,
21-
[]
27+
args
2228
)
2329

2430
{ ast, state }
2531
end
32+
33+
defp process_after(nil, _) do
34+
[]
35+
end
36+
37+
defp process_after([{:->, _, [[timeout], body]}], state) do
38+
timeout = Form.compile!(timeout, state)
39+
{body, _state} = Function.compile_block(body, state)
40+
41+
function = Helpers.arrow_function(
42+
[],
43+
J.block_statement(List.wrap(body))
44+
)
45+
46+
[timeout, function]
47+
end
2648
end

lib/elixir_script/passes/translate/forms/try.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ defmodule ElixirScript.Translate.Forms.Try do
3939
JS.identifier(:null)
4040
end
4141

42-
js_ast = Helpers.call_non_scheduled(
42+
js_ast = Helpers.call(
4343
JS.member_expression(
4444
Helpers.special_forms(),
4545
JS.identifier("_try")
@@ -67,7 +67,7 @@ defmodule ElixirScript.Translate.Forms.Try do
6767
end)
6868

6969

70-
Helpers.call_non_scheduled(
70+
Helpers.call(
7171
JS.member_expression(
7272
Helpers.patterns(),
7373
JS.identifier("defmatchAsync")

lib/elixir_script/passes/translate/forms/with.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ defmodule ElixirScript.Translate.Forms.With do
3333

3434
expressions = result.expressions
3535

36-
js_ast = Helpers.call_non_scheduled(
36+
js_ast = Helpers.call(
3737
JS.member_expression(
3838
Helpers.special_forms(),
3939
JS.identifier("_with")

lib/elixir_script/passes/translate/function.ex

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ defmodule ElixirScript.Translate.Function do
9292
clauses
9393
|> Enum.map(&compile_clause(&1, state))
9494
|> Enum.map(fn {patterns, _params, guards, body} ->
95-
match_or_default_call = Helpers.call_non_scheduled(
95+
match_or_default_call = Helpers.call(
9696
J.member_expression(
9797
Helpers.patterns(),
9898
J.identifier("match_or_default_async")
@@ -156,7 +156,10 @@ defmodule ElixirScript.Translate.Function do
156156
nil ->
157157
J.identifier("null")
158158
{:__block__, _, block_body} ->
159-
{list, _} = Enum.map_reduce(block_body, state, &Form.compile(&1, &2))
159+
{list, _} = Enum.map_reduce(block_body, state, fn(x, acc) ->
160+
{ast, acc} = Form.compile(x, acc)
161+
{[pause(), ast], acc}
162+
end)
160163
List.flatten(list)
161164
_ ->
162165
Form.compile!(block, state)
@@ -165,6 +168,16 @@ defmodule ElixirScript.Translate.Function do
165168
{ast, state}
166169
end
167170

171+
defp pause() do
172+
Helpers.call(
173+
J.member_expression(
174+
Helpers.process_system,
175+
J.identifier("pause")
176+
),
177+
[]
178+
)
179+
end
180+
168181
defp update_last_call(clause_body, %{function: {name, _}, anonymous_fn: anonymous?}) do
169182
last_item = List.last(clause_body)
170183
function_name = ElixirScript.Translate.Identifier.make_function_name(name)

0 commit comments

Comments
 (0)