Skip to content

Commit 38009cf

Browse files
committed
Fixed protocol errors found when testing
1 parent a2fad90 commit 38009cf

5 files changed

Lines changed: 62 additions & 27 deletions

File tree

lib/elixir_script.ex

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,6 @@ defmodule ElixirScript do
195195

196196
result = result ++ defimpls
197197

198-
IO.inspect(result)
199-
200198
result = Enum.map(result, fn
201199
{ path, code } ->
202200
case compiler_opts.include_path do

lib/elixir_script/translator/protocol.ex

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ defmodule ElixirScript.Translator.Protocol do
99
alias ElixirScript.ModuleSystems
1010

1111
@doc """
12-
Takes a protocol and turns them into modules
12+
Takes a protocol and turns it into a module
1313
"""
1414
def make(name, functions, env) do
1515
{ body, _ } = Module.translate_body( {:__block__, [], [] }, env)
@@ -48,10 +48,13 @@ defmodule ElixirScript.Translator.Protocol do
4848
declaration = JS.variable_declaration([declarator], :const)
4949

5050
implementations = JS.for_of_statement(
51-
JS.object_pattern([
52-
JS.assignment_property(JS.identifier("Type")),
53-
JS.assignment_property(JS.identifier("Implementation"))
54-
]),
51+
JS.variable_declaration([JS.variable_declarator(
52+
JS.object_pattern([
53+
JS.assignment_property(JS.identifier("Type")),
54+
JS.assignment_property(JS.identifier("Implementation"))
55+
]),
56+
nil
57+
)], :let),
5558
JS.identifier("Implementations"),
5659
JS.call_expression(
5760
JS.member_expression(
@@ -86,6 +89,10 @@ defmodule ElixirScript.Translator.Protocol do
8689
end)
8790
end
8891

92+
@doc """
93+
Makes the protocol implementation module for the given implementation name.
94+
This is used to consolidate all of the protocol implementations.
95+
"""
8996
def make_defimpl(name, implementations \\ []) do
9097
imports = Module.make_std_lib_import()
9198

lib/elixir_script/translator/state.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ defmodule ElixirScript.Translator.State do
7575

7676
def add_protocol_impl(protocol, type, impl) do
7777
Agent.update(__MODULE__, fn state ->
78-
protocol_name = Atom.to_string(protocol)
78+
protocol_name = Atom.to_string(do_get_module_name(protocol, state))
7979
type_name = Atom.to_string(Utils.quoted_to_name(type))
8080
module_name = String.to_atom(protocol_name <> ".DefImpl." <> type_name)
8181

priv/Elixir.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/translator/protocol_test.exs

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,32 +25,62 @@ defmodule ElixirScript.Translator.Protocol.Test do
2525
end
2626

2727
js_code = """
28-
import Elixir$ElixirScript$Kernel from './Elixir.ElixirScript.Kernel';
28+
import Elixir$ElixirScript$Kernel from './Elixir.ElixirScript.Kernel';
29+
import Implementations from './Elixir.Blank.Defimpl';
2930
const Elixir$Blank = Elixir.Core.Functions.defprotocol({
30-
blank__qmark__: function(){}
31+
blank__qmark__: function() {
32+
33+
}
3134
});
32-
Elixir.Core.Functions.defimpl(Elixir$Blank, Array,{
33-
blank__qmark__: Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([Object.freeze([])],function() {
34-
return true;
35-
}),Elixir.Core.Patterns.make_case([Elixir.Core.Patterns.wildcard()],function() {
36-
return false;
37-
}))
38-
})
39-
Elixir.Core.Functions.defimpl(Elixir$Blank,Symbol,{
40-
blank__qmark__: Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([false],function() {
35+
for(let {Type,Implementation} of Implementations) Elixir.Core.Functions.defimpl(Elixir$Blank,Type,Implementation)
36+
export default Elixir$Blank;
37+
38+
import Elixir$ElixirScript$Kernel from './Elixir.ElixirScript.Kernel';
39+
const blank__qmark__ = Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([false],function() {
4140
return true;
4241
}),Elixir.Core.Patterns.make_case([null],function() {
4342
return true;
4443
}),Elixir.Core.Patterns.make_case([Elixir.Core.Patterns.wildcard()],function() {
4544
return false;
46-
}))
47-
})
48-
Elixir.Core.Functions.defimpl(Elixir$Blank, Elixir.Core.Integer, {
49-
blank__qmark__: Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([Elixir.Core.Patterns.variable()],function(number) {
45+
}));
46+
export default {
47+
'Type': Symbol, 'Implementation': {
48+
blank__qmark__
49+
}
50+
};
51+
52+
import Elixir$ElixirScript$Kernel from './Elixir.ElixirScript.Kernel';
53+
const blank__qmark__ = Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([Elixir.Core.Patterns.variable()],function(number) {
5054
return false;
51-
}))
52-
})
53-
export default Elixir$Blank;
55+
}));
56+
export default {
57+
'Type': Elixir.Core.Integer, 'Implementation': {
58+
blank__qmark__
59+
}
60+
};
61+
62+
import Elixir$ElixirScript$Kernel from './Elixir.ElixirScript.Kernel';
63+
const blank__qmark__ = Elixir.Core.Patterns.defmatch(Elixir.Core.Patterns.make_case([Object.freeze([])],function() {
64+
return true;
65+
}),Elixir.Core.Patterns.make_case([Elixir.Core.Patterns.wildcard()],function() {
66+
return false;
67+
}));
68+
export default {
69+
'Type': Array, 'Implementation': {
70+
blank__qmark__
71+
}
72+
};
73+
74+
75+
76+
let impls = [];
77+
import Elixir$Blank$DefImpl$Elixir$Atom from './Elixir.Blank.DefImpl.Elixir.Atom';
78+
impls.push(Elixir$Blank$DefImpl$Elixir$Atom)
79+
import Elixir$Blank$DefImpl$Elixir$Integer from './Elixir.Blank.DefImpl.Elixir.Integer';
80+
impls.push(Elixir$Blank$DefImpl$Elixir$Integer)
81+
import Elixir$Blank$DefImpl$Elixir$List from './Elixir.Blank.DefImpl.Elixir.List';
82+
impls.push(Elixir$Blank$DefImpl$Elixir$List)
83+
export default impls;
5484
"""
5585

5686
assert_translation(ex_ast, js_code)

0 commit comments

Comments
 (0)