Skip to content

Commit 71f29b6

Browse files
committed
Added more tests, updated dependencies, fixed spec errors
1 parent d93bbd2 commit 71f29b6

File tree

9 files changed

+155
-59
lines changed

9 files changed

+155
-59
lines changed

lib/es_tree.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,6 @@ defmodule ESTree do
1818
:"|=" | :"^=" | :"&="
1919

2020
@type update_operator :: :++ | :--
21+
22+
@type operator :: unary_operator | binary_operator | logical_operator | assignment_operator | update_operator
2123
end

lib/es_tree/expression.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ defmodule ESTree.Expression do
1010
ESTree.AssignmentExpression.t |
1111
ESTree.UpdateExpression.t |
1212
ESTree.LogicalExpression.t |
13-
ESTree.ConditionalExpression.t |
1413
ESTree.NewExpression.t |
1514
ESTree.CallExpression.t |
1615
ESTree.MemberExpression.t |

lib/es_tree/statement.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ defmodule ESTree.Statement do
1717
ESTree.ForInStatement.t |
1818
ESTree.ForOfStatement.t |
1919
ESTree.DebuggerStatement.t |
20+
ESTree.ConditionalStatement.t |
2021
ESTree.Declaration.t
2122
end

lib/es_tree/tools/builder.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ defmodule ESTree.Tools.Builder do
205205

206206
@spec export_declaration(
207207
ESTree.Declaration.t,
208-
[ESTree.ExportSpecifier.t | ESTree.ExportBatchSpecifier.t],
208+
[ESTree.ExportSpecifier.t],
209209
boolean,
210210
ESTree.Identifier.t | nil,
211211
ESTree.SourceLocation.t | nil
@@ -217,7 +217,7 @@ defmodule ESTree.Tools.Builder do
217217
end
218218

219219
@spec export_default_declaration(
220-
ESTree.Declaration.t | ESTree.Expression.t,
220+
ESTree.Declaration.t | ESTree.Expression.t | nil,
221221
ESTree.SourceLocation.t | nil
222222
) :: ESTree.ExportDefaultDeclaration.t
223223
def export_default_declaration(declaration \\ nil, loc \\ nil) do
@@ -526,7 +526,7 @@ defmodule ESTree.Tools.Builder do
526526
boolean,
527527
ESTree.SourceLocation.t | nil
528528
) :: ESTree.Property.t
529-
def property(key, value, kind \\ :init, method \\ false, shorthand \\ false, computed \\false, loc \\ nil) do
529+
def property(key, value, kind \\ :init, shorthand \\ false, method \\ false, computed \\false, loc \\ nil) do
530530
%ESTree.Property{
531531
key: key, value: value,
532532
kind: kind, shorthand: shorthand, method: method,

lib/es_tree/tools/generator.ex

Lines changed: 26 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,20 @@ defmodule ESTree.Tools.Generator do
44
it to JavaScript code
55
"""
66

7-
@unary_operators [:-, :+ , :! , :"~" , :typeof , :void , :delete]
8-
9-
@binary_operators [:== , :!= , :=== , :!== , :< , :<= , :> , :>= ,
10-
:"<<" , :">>" , :>>> , :+ , :- , :* , :/ , :% , :| ,
11-
:^ , :& , :in , :instanceof]
12-
13-
@logical_operators [:|| , :&&]
14-
15-
@assignment_operators [:= , :"+=" , :"-=" , :"*=" , :"/=" ,
16-
:"%=" , :"<<=" , :">>=" , :">>>=" ,
17-
:"|=" , :"^=" , :"&="]
18-
19-
@update_operators [:++, :--]
7+
@operators [
8+
:-, :+ , :! , :"~" , :typeof , :void , :delete,
9+
:== , :!= , :=== , :!== , :< , :<= , :> , :>= ,
10+
:"<<" , :">>" , :>>> , :+ , :- , :* , :/ , :% , :| ,
11+
:^ , :& , :in , :instanceof, :|| , :&&, := , :"+=" ,
12+
:"-=" , :"*=" , :"/=" , :"%=" , :"<<=" , :">>=" ,
13+
:">>>=" , :"|=" , :"^=" , :"&=", :++, :--
14+
]
2015

2116
@indent " "
2217

23-
@spec generate(ESTree.unary_operator | ESTree.binary_operator | ESTree.logical_operator | ESTree.assignment_operator | ESTree.update_operator | ESTree.Node.t) :: binary
24-
def generate(unary_operator) when unary_operator in @unary_operators do
25-
to_string(unary_operator)
26-
end
27-
28-
def generate(binary_operator) when binary_operator in @binary_operators do
29-
to_string(binary_operator)
30-
end
31-
32-
def generate(logical_operator) when logical_operator in @logical_operators do
33-
to_string(logical_operator)
34-
end
35-
36-
def generate(assignment_operator) when assignment_operator in @assignment_operators do
37-
to_string(assignment_operator)
38-
end
39-
40-
def generate(update_operator) when update_operator in @update_operators do
41-
to_string(update_operator)
42-
end
43-
44-
def generate(nil) do
45-
""
18+
@spec generate(ESTree.operator | ESTree.Node.t) :: binary
19+
def generate(operator) when operator in @operators do
20+
to_string(operator)
4621
end
4722

4823
def generate(%ESTree.Identifier{name: name}) do
@@ -85,11 +60,7 @@ defmodule ESTree.Tools.Generator do
8560
end
8661

8762
def generate(%ESTree.FunctionDeclaration{} = ast) do
88-
generator = if ast.generator do
89-
"*"
90-
else
91-
""
92-
end
63+
generator = if ast.generator, do: "*", else: ""
9364

9465
params = params_and_defaults(ast.params, ast.defaults)
9566
id = generate(ast.id)
@@ -98,11 +69,7 @@ defmodule ESTree.Tools.Generator do
9869
end
9970

10071
def generate(%ESTree.FunctionExpression{} = ast) do
101-
generator = if ast.generator do
102-
"*"
103-
else
104-
""
105-
end
72+
generator = if ast.generator, do: "*", else: ""
10673
params = params_and_defaults(ast.params, ast.defaults)
10774

10875
"function#{generator}(#{params})#{generate(ast.body)}"
@@ -195,7 +162,7 @@ defmodule ESTree.Tools.Generator do
195162
def generate(%ESTree.TryStatement{block: block, handler: handler, finalizer: finalizer}) do
196163
"try#{generate(block)}#{generate(handler)}finally#{generate(finalizer)}"
197164
end
198-
165+
199166
def generate(%ESTree.WhileStatement{test: test, body: body}) do
200167
"while(#{generate(test)}) #{generate(body)}"
201168
end
@@ -252,15 +219,23 @@ defmodule ESTree.Tools.Generator do
252219
end
253220

254221
def generate(%ESTree.ArrayExpression{elements: nil}) do
255-
""
222+
"[]"
256223
end
257224

258225
def generate(%ESTree.ArrayExpression{elements: elements}) do
259-
"[" <> Enum.map_join(elements, ",", &generate(&1)) <> "]"
226+
"[" <> Enum.map_join(elements, ", ", &generate(&1)) <> "]"
260227
end
261228

229+
def generate(%ESTree.ObjectExpression{properties: nil}) do
230+
"{}"
231+
end
232+
233+
def generate(%ESTree.ObjectExpression{properties: []}) do
234+
"{}"
235+
end
236+
262237
def generate(%ESTree.ObjectExpression{properties: properties}) do
263-
"{" <> Enum.map_join(properties, ",", &generate(&1)) <> "}"
238+
"{" <> Enum.map_join(properties, ", ", &generate(&1)) <> "}"
264239
end
265240

266241
def generate(%ESTree.Property{key: key, value: value, kind: :init, shorthand: false, method: false, computed: false}) do
@@ -596,7 +571,7 @@ defmodule ESTree.Tools.Generator do
596571
"import #{specifiers} from #{source};"
597572
end
598573

599-
def generate(%ESTree.ImportDeclaration{specifiers: specifiers, source: source} = ast) do
574+
def generate(%ESTree.ImportDeclaration{specifiers: specifiers, source: source}) do
600575
specifiers = Enum.map_join(specifiers, ",", &generate(&1))
601576
source = generate(source)
602577

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule ESTree.Mixfile do
1919
[
2020
{:earmark, "~> 0.1", only: :dev},
2121
{:ex_doc, "~> 0.7", only: :dev},
22-
{:dialyze, "~> 0.1.3", only: :dev},
22+
{:dialyze, "~> 0.2", only: :dev},
2323
{:shouldi, only: :test}
2424
]
2525
end

mix.lock

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
%{"dialyze": {:hex, :dialyze, "0.1.3"},
2-
"earmark": {:hex, :earmark, "0.1.13"},
3-
"ex_doc": {:hex, :ex_doc, "0.7.1"},
1+
%{"dialyze": {:hex, :dialyze, "0.2.0"},
2+
"earmark": {:hex, :earmark, "0.1.17"},
3+
"ex_doc": {:hex, :ex_doc, "0.7.3"},
44
"shouldi": {:hex, :shouldi, "0.2.3"}}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
defmodule ESTree.Tools.Generator.ArrayExpression.Test do
2+
use ShouldI
3+
alias ESTree.Tools.Builder
4+
alias ESTree.Tools.Generator
5+
6+
should "convert array when elements is nil" do
7+
ast = Builder.array_expression(nil)
8+
assert Generator.generate(ast) == "[]"
9+
end
10+
11+
should "convert array when elements is empty" do
12+
ast = Builder.array_expression([])
13+
assert Generator.generate(ast) == "[]"
14+
end
15+
16+
should "convert array when elements contains one element" do
17+
ast = Builder.array_expression([
18+
Builder.literal(1)
19+
])
20+
assert Generator.generate(ast) == "[1]"
21+
end
22+
23+
should "convert array when elements contains multiple elements" do
24+
ast = Builder.array_expression([
25+
Builder.literal(1),
26+
Builder.identifier(:a)
27+
])
28+
assert Generator.generate(ast) == "[1, a]"
29+
end
30+
31+
end
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
defmodule ESTree.Tools.Generator.ObjectExpression.Test do
2+
use ShouldI
3+
alias ESTree.Tools.Builder
4+
alias ESTree.Tools.Generator
5+
6+
should "convert object when properties is nil" do
7+
ast = Builder.object_expression(nil)
8+
assert Generator.generate(ast) == "{}"
9+
end
10+
11+
should "convert object when properties is empty" do
12+
ast = Builder.object_expression([])
13+
assert Generator.generate(ast) == "{}"
14+
end
15+
16+
should "convert object when properties contains one property" do
17+
ast = Builder.object_expression([
18+
Builder.property(
19+
Builder.identifier(:key),
20+
Builder.identifier(:value)
21+
)
22+
])
23+
assert Generator.generate(ast) == "{key: value}"
24+
end
25+
26+
should "convert object when properties contains multiple properties" do
27+
ast = Builder.object_expression([
28+
Builder.property(
29+
Builder.identifier(:key),
30+
Builder.identifier(:value)
31+
),
32+
Builder.property(
33+
Builder.identifier(:key1),
34+
Builder.identifier(:value1)
35+
)
36+
])
37+
assert Generator.generate(ast) == "{key: value, key1: value1}"
38+
end
39+
40+
41+
should "convert object when properties contains getters and setters" do
42+
ast = Builder.object_expression([
43+
Builder.property(
44+
Builder.identifier(:key),
45+
Builder.function_expression([],[], Builder.block_statement([])),
46+
:get
47+
),
48+
Builder.property(
49+
Builder.identifier(:key),
50+
Builder.function_expression([Builder.identifier(:p)],[], Builder.block_statement([])),
51+
:set
52+
),
53+
])
54+
assert Generator.generate(ast) == "{get key() {}, set key(p) {}}"
55+
end
56+
57+
should "convert object when properties contains getter and setter methods" do
58+
ast = Builder.object_expression([
59+
Builder.property(
60+
Builder.identifier(:key),
61+
Builder.function_expression([],[], Builder.block_statement([])),
62+
:get,
63+
false,
64+
true
65+
),
66+
Builder.property(
67+
Builder.identifier(:key),
68+
Builder.function_expression([Builder.identifier(:p)],[], Builder.block_statement([])),
69+
:set,
70+
false,
71+
true
72+
),
73+
])
74+
assert Generator.generate(ast) == "{key() {}, key(p) {}}"
75+
end
76+
77+
should "convert object when properties contains shorthand properties" do
78+
ast = Builder.object_expression([
79+
Builder.property(
80+
Builder.identifier(:key),
81+
Builder.identifier(:key),
82+
:init,
83+
true)
84+
])
85+
assert Generator.generate(ast) == "{key}"
86+
end
87+
88+
end

0 commit comments

Comments
 (0)