rkelly-remix 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (205) hide show
  1. data/.gemtest +0 -0
  2. data/CHANGELOG.rdoc +9 -0
  3. data/Manifest.txt +203 -0
  4. data/README.rdoc +58 -0
  5. data/Rakefile +39 -0
  6. data/lib/parser.y +871 -0
  7. data/lib/rkelly/char_pos.rb +35 -0
  8. data/lib/rkelly/char_range.rb +31 -0
  9. data/lib/rkelly/constants.rb +3 -0
  10. data/lib/rkelly/generated_parser.rb +3217 -0
  11. data/lib/rkelly/js/array.rb +15 -0
  12. data/lib/rkelly/js/base.rb +91 -0
  13. data/lib/rkelly/js/boolean.rb +21 -0
  14. data/lib/rkelly/js/function.rb +39 -0
  15. data/lib/rkelly/js/function_prototype.rb +15 -0
  16. data/lib/rkelly/js/global_object.rb +52 -0
  17. data/lib/rkelly/js/math.rb +10 -0
  18. data/lib/rkelly/js/nan.rb +18 -0
  19. data/lib/rkelly/js/number.rb +22 -0
  20. data/lib/rkelly/js/object.rb +30 -0
  21. data/lib/rkelly/js/object_prototype.rb +14 -0
  22. data/lib/rkelly/js/property.rb +20 -0
  23. data/lib/rkelly/js/scope.rb +6 -0
  24. data/lib/rkelly/js/string.rb +21 -0
  25. data/lib/rkelly/js.rb +14 -0
  26. data/lib/rkelly/lexeme.rb +18 -0
  27. data/lib/rkelly/nodes/binary_node.rb +18 -0
  28. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  29. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  30. data/lib/rkelly/nodes/comma_node.rb +11 -0
  31. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  32. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  33. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  34. data/lib/rkelly/nodes/for_node.rb +13 -0
  35. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  36. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  37. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  38. data/lib/rkelly/nodes/if_node.rb +12 -0
  39. data/lib/rkelly/nodes/label_node.rb +11 -0
  40. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  41. data/lib/rkelly/nodes/node.rb +94 -0
  42. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  43. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  44. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  45. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  46. data/lib/rkelly/nodes/property_node.rb +13 -0
  47. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  48. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  49. data/lib/rkelly/nodes/try_node.rb +13 -0
  50. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  51. data/lib/rkelly/nodes.rb +25 -0
  52. data/lib/rkelly/parser.rb +89 -0
  53. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  54. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  55. data/lib/rkelly/runtime.rb +36 -0
  56. data/lib/rkelly/syntax_error.rb +4 -0
  57. data/lib/rkelly/token.rb +24 -0
  58. data/lib/rkelly/tokenizer.rb +193 -0
  59. data/lib/rkelly/visitable.rb +16 -0
  60. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  61. data/lib/rkelly/visitors/ecma_visitor.rb +322 -0
  62. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  63. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  64. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  65. data/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  66. data/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  67. data/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  68. data/lib/rkelly/visitors/visitor.rb +136 -0
  69. data/lib/rkelly/visitors.rb +4 -0
  70. data/lib/rkelly.rb +14 -0
  71. data/test/ecma_script_test_case.rb +21 -0
  72. data/test/execute_test_case.rb +16 -0
  73. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  74. data/test/expressions/test_11_3_1.rb +64 -0
  75. data/test/expressions/test_11_3_2.rb +64 -0
  76. data/test/expressions/test_11_4_2.rb +13 -0
  77. data/test/expressions/test_11_4_3.rb +52 -0
  78. data/test/expressions/test_11_4_4.rb +68 -0
  79. data/test/expressions/test_11_4_5.rb +69 -0
  80. data/test/expressions/test_11_4_6.rb +88 -0
  81. data/test/expressions/test_11_4_8.rb +28 -0
  82. data/test/expressions/test_11_4_9.rb +103 -0
  83. data/test/expressions/test_11_5_1.rb +51 -0
  84. data/test/expressions/test_11_5_2.rb +80 -0
  85. data/test/expressions/test_11_5_3.rb +88 -0
  86. data/test/expressions/test_11_6_1-1.rb +19 -0
  87. data/test/expressions/test_11_9_1.rb +19 -0
  88. data/test/function/test_15_3_1_1-1.rb +34 -0
  89. data/test/global_object/test_15_1_1_1.rb +29 -0
  90. data/test/global_object/test_15_1_1_2.rb +17 -0
  91. data/test/global_object/test_15_1_1_3.rb +9 -0
  92. data/test/helper.rb +5 -0
  93. data/test/node_test_case.rb +11 -0
  94. data/test/object/test_15_2_1_1.rb +257 -0
  95. data/test/object/test_15_2_1_2.rb +21 -0
  96. data/test/object/test_15_2_2_1.rb +52 -0
  97. data/test/statements/test_12_5-1.rb +27 -0
  98. data/test/test_add_node.rb +8 -0
  99. data/test/test_arguments_node.rb +8 -0
  100. data/test/test_array_node.rb +9 -0
  101. data/test/test_assign_expr_node.rb +8 -0
  102. data/test/test_automatic_semicolon_insertion.rb +137 -0
  103. data/test/test_bit_and_node.rb +8 -0
  104. data/test/test_bit_or_node.rb +8 -0
  105. data/test/test_bit_x_or_node.rb +8 -0
  106. data/test/test_bitwise_not_node.rb +8 -0
  107. data/test/test_block_node.rb +14 -0
  108. data/test/test_bracket_accessor_node.rb +16 -0
  109. data/test/test_break_node.rb +11 -0
  110. data/test/test_case_block_node.rb +11 -0
  111. data/test/test_case_clause_node.rb +15 -0
  112. data/test/test_char_pos.rb +39 -0
  113. data/test/test_char_range.rb +29 -0
  114. data/test/test_comma_node.rb +13 -0
  115. data/test/test_comments.rb +45 -0
  116. data/test/test_conditional_node.rb +17 -0
  117. data/test/test_const_statement_node.rb +14 -0
  118. data/test/test_continue_node.rb +11 -0
  119. data/test/test_delete_node.rb +8 -0
  120. data/test/test_divide_node.rb +8 -0
  121. data/test/test_do_while_node.rb +13 -0
  122. data/test/test_dot_accessor_node.rb +9 -0
  123. data/test/test_ecma_visitor.rb +210 -0
  124. data/test/test_element_node.rb +8 -0
  125. data/test/test_empty_statement_node.rb +8 -0
  126. data/test/test_equal_node.rb +8 -0
  127. data/test/test_evaluation_visitor.rb +66 -0
  128. data/test/test_expression_statement_node.rb +10 -0
  129. data/test/test_false_node.rb +8 -0
  130. data/test/test_for_in_node.rb +17 -0
  131. data/test/test_for_node.rb +24 -0
  132. data/test/test_function_body_node.rb +8 -0
  133. data/test/test_function_call_node.rb +10 -0
  134. data/test/test_function_decl_node.rb +16 -0
  135. data/test/test_function_expr_node.rb +16 -0
  136. data/test/test_function_visitor.rb +26 -0
  137. data/test/test_getter_property_node.rb +10 -0
  138. data/test/test_global_object.rb +49 -0
  139. data/test/test_greater_node.rb +8 -0
  140. data/test/test_greater_or_equal_node.rb +8 -0
  141. data/test/test_if_node.rb +17 -0
  142. data/test/test_in_node.rb +8 -0
  143. data/test/test_instance_of_node.rb +8 -0
  144. data/test/test_label_node.rb +13 -0
  145. data/test/test_left_shift_node.rb +8 -0
  146. data/test/test_less_node.rb +8 -0
  147. data/test/test_less_or_equal_node.rb +8 -0
  148. data/test/test_line_number.rb +81 -0
  149. data/test/test_logical_and_node.rb +8 -0
  150. data/test/test_logical_not_node.rb +8 -0
  151. data/test/test_logical_or_node.rb +8 -0
  152. data/test/test_modulus_node.rb +8 -0
  153. data/test/test_multiply_node.rb +8 -0
  154. data/test/test_new_expr_node.rb +9 -0
  155. data/test/test_not_equal_node.rb +8 -0
  156. data/test/test_not_strict_equal_node.rb +8 -0
  157. data/test/test_null_node.rb +8 -0
  158. data/test/test_number_node.rb +8 -0
  159. data/test/test_object_literal_node.rb +9 -0
  160. data/test/test_op_and_equal_node.rb +10 -0
  161. data/test/test_op_divide_equal_node.rb +10 -0
  162. data/test/test_op_equal_node.rb +10 -0
  163. data/test/test_op_l_shift_equal_node.rb +10 -0
  164. data/test/test_op_minus_equal_node.rb +10 -0
  165. data/test/test_op_mod_equal_node.rb +10 -0
  166. data/test/test_op_multiply_equal_node.rb +10 -0
  167. data/test/test_op_or_equal_node.rb +10 -0
  168. data/test/test_op_plus_equal_node.rb +10 -0
  169. data/test/test_op_r_shift_equal_node.rb +10 -0
  170. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  171. data/test/test_op_x_or_equal_node.rb +10 -0
  172. data/test/test_parameter_node.rb +8 -0
  173. data/test/test_parser.rb +1361 -0
  174. data/test/test_pointcut_visitor.rb +34 -0
  175. data/test/test_postfix_node.rb +8 -0
  176. data/test/test_prefix_node.rb +8 -0
  177. data/test/test_property_node.rb +8 -0
  178. data/test/test_regexp_node.rb +8 -0
  179. data/test/test_resolve_node.rb +22 -0
  180. data/test/test_return_node.rb +11 -0
  181. data/test/test_right_shift_node.rb +8 -0
  182. data/test/test_rkelly.rb +19 -0
  183. data/test/test_runtime.rb +12 -0
  184. data/test/test_scope_chain.rb +50 -0
  185. data/test/test_setter_property_node.rb +10 -0
  186. data/test/test_source_elements.rb +9 -0
  187. data/test/test_strict_equal_node.rb +8 -0
  188. data/test/test_string_node.rb +8 -0
  189. data/test/test_subtract_node.rb +8 -0
  190. data/test/test_switch_node.rb +12 -0
  191. data/test/test_this_node.rb +8 -0
  192. data/test/test_throw_node.rb +7 -0
  193. data/test/test_tokenizer.rb +209 -0
  194. data/test/test_true_node.rb +8 -0
  195. data/test/test_try_node.rb +59 -0
  196. data/test/test_type_of_node.rb +8 -0
  197. data/test/test_unary_minus_node.rb +8 -0
  198. data/test/test_unary_plus_node.rb +8 -0
  199. data/test/test_unsigned_right_shift_node.rb +8 -0
  200. data/test/test_var_decl_node.rb +21 -0
  201. data/test/test_var_statement_node.rb +14 -0
  202. data/test/test_void_node.rb +8 -0
  203. data/test/test_while_node.rb +15 -0
  204. data/test/test_with_node.rb +8 -0
  205. metadata +432 -0
@@ -0,0 +1,1361 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class ParserTest < Test::Unit::TestCase
4
+ def setup
5
+ @parser = RKelly::Parser.new
6
+ end
7
+
8
+ def test_birthday!
9
+ assert_raises(RKelly::SyntaxError) do
10
+ RKelly::Parser.new.parse "Happy birthday, tenderlove!"
11
+ end
12
+ end
13
+
14
+ def test_array_access
15
+ assert_sexp(
16
+ [
17
+ [:var,
18
+ [[:var_decl, :a,
19
+ [:assign, [:bracket_access, [:resolve, "foo"], [:lit, 10]]],
20
+ ]]
21
+ ]
22
+ ],
23
+ @parser.parse('var a = foo[10];'))
24
+ end
25
+
26
+ def test_function_expr_anon_no_args
27
+ assert_sexp(
28
+ [[:var,
29
+ [[:var_decl, :foo, [:assign,
30
+ [:func_expr, "function", [], [:func_body, []]]
31
+ ]]]
32
+ ]],
33
+ @parser.parse("var foo = function() { }"))
34
+ end
35
+
36
+ def test_function_body_expr_anon_no_args
37
+ assert_sexp(
38
+ [[:var,
39
+ [[:var_decl, :foo, [:assign,
40
+ [:func_expr, "function", [],
41
+ [:func_body,
42
+ [[:var, [[:var_decl, :a, [:assign, [:lit, 10]]]]]]
43
+ ]
44
+ ]
45
+ ]]]
46
+ ]],
47
+ @parser.parse("var foo = function() { var a = 10; }"))
48
+ end
49
+
50
+ def test_function_expr_anon_single_arg
51
+ assert_sexp(
52
+ [[:var,
53
+ [[:var_decl, :foo, [:assign,
54
+ [:func_expr, "function", [[:param, "a"]], [:func_body, []]]
55
+ ]]]
56
+ ]],
57
+ @parser.parse("var foo = function(a) { }"))
58
+ end
59
+
60
+ def test_function_expr_anon
61
+ assert_sexp(
62
+ [[:var,
63
+ [[:var_decl, :foo, [:assign,
64
+ [:func_expr, "function", [[:param, "a"], [:param, 'b']], [:func_body, []]]
65
+ ]]]
66
+ ]],
67
+ @parser.parse("var foo = function(a,b) { }"))
68
+ end
69
+
70
+ def test_function_expr_no_args
71
+ assert_sexp(
72
+ [[:var,
73
+ [[:var_decl, :foo, [:assign,
74
+ [:func_expr, 'aaron', [], [:func_body, []]]
75
+ ]]]
76
+ ]],
77
+ @parser.parse("var foo = function aaron() { }"))
78
+ end
79
+
80
+ def test_function_expr_with_args
81
+ assert_sexp(
82
+ [[:var,
83
+ [[:var_decl, :foo, [:assign,
84
+ [:func_expr, 'aaron', [[:param, 'a'], [:param, 'b']], [:func_body, []]]
85
+ ]]]
86
+ ]],
87
+ @parser.parse("var foo = function aaron(a, b) { }"))
88
+ end
89
+
90
+ def test_labelled_statement
91
+ assert_sexp([[:label, :foo, [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]],
92
+ @parser.parse('foo: var x = 10;'))
93
+ assert_sexp([[:label, :foo, [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]],
94
+ @parser.parse('foo: var x = 10'))
95
+ end
96
+
97
+ def test_throw_statement
98
+ assert_sexp([[:throw, [:lit, 10]]], @parser.parse('throw 10;'))
99
+ assert_sexp([[:throw, [:lit, 10]]], @parser.parse('throw 10'))
100
+ end
101
+
102
+ def test_object_literal
103
+ assert_sexp(
104
+ [[:var,
105
+ [[:var_decl, :foo, [:assign,
106
+ [:object, [[:property, :bar, [:lit, 10]]]]
107
+ ]]]
108
+ ]],
109
+ @parser.parse('var foo = { bar: 10 }'))
110
+ assert_sexp(
111
+ [[:var,
112
+ [[:var_decl, :foo, [:assign,
113
+ [:object, []]
114
+ ]]]
115
+ ]],
116
+ @parser.parse('var foo = { }'))
117
+ assert_sexp(
118
+ [[:var,
119
+ [[:var_decl, :foo, [:assign,
120
+ [:object, [[:property, '"bar"'.to_sym, [:lit, 10]]]]
121
+ ]]]
122
+ ]],
123
+ @parser.parse('var foo = { "bar": 10 }'))
124
+ assert_sexp(
125
+ [[:var,
126
+ [[:var_decl, :foo, [:assign,
127
+ [:object, [[:property, :"5", [:lit, 10]]]]
128
+ ]]]
129
+ ]],
130
+ @parser.parse('var foo = { 5: 10 }'))
131
+ end
132
+
133
+ def test_object_literal_getter
134
+ assert_sexp(
135
+ [[:var,
136
+ [[:var_decl, :foo, [:assign,
137
+ [:object, [[:getter, :a, [:func_expr, nil, [], [:func_body, []]]]]]
138
+ ]]]
139
+ ]],
140
+ @parser.parse('var foo = { get a() { } }'))
141
+ end
142
+
143
+ def test_object_literal_setter
144
+ assert_sexp(
145
+ [[:var,
146
+ [[:var_decl, :foo, [:assign,
147
+ [:object, [[:setter, :a,
148
+ [:func_expr, nil, [[:param, 'foo']], [:func_body, []]]
149
+ ]]]
150
+ ]]]
151
+ ]],
152
+ @parser.parse('var foo = { set a(foo) { } }'))
153
+ end
154
+
155
+ def test_object_literal_multi
156
+ assert_sexp(
157
+ [[:var,
158
+ [[:var_decl, :foo, [:assign,
159
+ [:object, [
160
+ [:property, :bar, [:lit, 10]],
161
+ [:property, :baz, [:lit, 1]]
162
+ ]]
163
+ ]]]
164
+ ]],
165
+ @parser.parse('var foo = { bar: 10, baz: 1 }'))
166
+ assert_sexp(
167
+ [[:var,
168
+ [[:var_decl, :foo, [:assign,
169
+ [:object, [
170
+ [:property, :bar, [:lit, 10]],
171
+ [:property, :baz, [:lit, 1]]
172
+ ]]
173
+ ]]]
174
+ ]],
175
+ @parser.parse('var foo = { bar: 10, baz: 1, }'))
176
+ end
177
+
178
+ def test_this
179
+ assert_sexp(
180
+ [[:var, [[:var_decl, :foo, [:assign, [:this]]]]]],
181
+ @parser.parse('var foo = this;')
182
+ )
183
+ end
184
+
185
+ def test_array_literal
186
+ assert_sexp(
187
+ [[:var, [[:var_decl, :foo, [:assign,
188
+ [:array, [[:element, [:lit, 1]]]]
189
+ ]]]]],
190
+ @parser.parse('var foo = [1];')
191
+ )
192
+ assert_sexp(
193
+ [[:var, [[:var_decl, :foo, [:assign,
194
+ [:array, [
195
+ nil,
196
+ nil,
197
+ [:element, [:lit, 1]]
198
+ ]]
199
+ ]]]]],
200
+ @parser.parse('var foo = [,,1];')
201
+ )
202
+ assert_sexp(
203
+ [[:var, [[:var_decl, :foo, [:assign,
204
+ [:array, [
205
+ [:element, [:lit, 1]],
206
+ nil,
207
+ nil,
208
+ [:element, [:lit, 2]]
209
+ ]]
210
+ ]]]]],
211
+ @parser.parse('var foo = [1,,,2];')
212
+ )
213
+ assert_sexp(
214
+ [[:var, [[:var_decl, :foo, [:assign,
215
+ [:array, [
216
+ [:element, [:lit, 1]],
217
+ nil,
218
+ nil,
219
+ ]]
220
+ ]]]]],
221
+ @parser.parse('var foo = [1,,,];')
222
+ )
223
+ assert_sexp(
224
+ [[:var, [[:var_decl, :foo, [:assign,
225
+ [:array, [
226
+ ]]
227
+ ]]]]],
228
+ @parser.parse('var foo = [];')
229
+ )
230
+ assert_sexp(
231
+ [[:var, [[:var_decl, :foo, [:assign,
232
+ [:array, [
233
+ nil, nil
234
+ ]]
235
+ ]]]]],
236
+ @parser.parse('var foo = [,,];')
237
+ )
238
+ end
239
+
240
+ def test_primary_expr_paren
241
+ assert_sexp(
242
+ [[:var,
243
+ [[:var_decl, :a, [:assign, [:lit, 10]]]]
244
+ ]],
245
+ @parser.parse('var a = (10);'))
246
+ end
247
+
248
+ def test_expression_statement
249
+ assert_sexp(
250
+ [[:expression, [:dot_access, [:resolve, "foo"], "bar"]]],
251
+ @parser.parse('foo.bar;')
252
+ )
253
+ assert_sexp(
254
+ [[:expression, [:dot_access, [:resolve, "foo"], "bar"]]],
255
+ @parser.parse('foo.bar')
256
+ )
257
+ end
258
+
259
+ def test_expr_comma
260
+ assert_sexp([[:expression, [:comma,
261
+ [:op_equal, [:resolve, 'i'], [:lit, 10]],
262
+ [:op_equal, [:resolve, 'j'], [:lit, 11]]]]],
263
+ @parser.parse('i = 10, j = 11;')
264
+ )
265
+ end
266
+
267
+ def test_op_plus_equal
268
+ assert_sexp([[:expression, [:op_plus_equal, [:resolve, 'i'], [:lit, 10]]]],
269
+ @parser.parse('i += 10'))
270
+ end
271
+
272
+ def test_op_minus_equal
273
+ assert_sexp([[:expression, [:op_minus_equal, [:resolve, 'i'], [:lit, 10]]]],
274
+ @parser.parse('i -= 10'))
275
+ end
276
+
277
+ def test_op_multiply_equal
278
+ assert_sexp([[:expression, [:op_multiply_equal, [:resolve, 'i'], [:lit, 10]]]],
279
+ @parser.parse('i *= 10'))
280
+ end
281
+
282
+ def test_op_divide_equal
283
+ assert_sexp([[:expression, [:op_divide_equal, [:resolve, 'i'], [:lit, 10]]]],
284
+ @parser.parse('i /= 10'))
285
+ end
286
+
287
+ def test_op_lshift_equal
288
+ assert_sexp([[:expression, [:op_lshift_equal, [:resolve, 'i'], [:lit, 10]]]],
289
+ @parser.parse('i <<= 10'))
290
+ end
291
+
292
+ def test_op_rshift_equal
293
+ assert_sexp([[:expression, [:op_rshift_equal, [:resolve, 'i'], [:lit, 10]]]],
294
+ @parser.parse('i >>= 10'))
295
+ end
296
+
297
+ def test_op_urshift_equal
298
+ assert_sexp([[:expression, [:op_urshift_equal, [:resolve, 'i'], [:lit, 10]]]],
299
+ @parser.parse('i >>>= 10'))
300
+ end
301
+
302
+ def test_op_and_equal
303
+ assert_sexp([[:expression, [:op_and_equal, [:resolve, 'i'], [:lit, 10]]]],
304
+ @parser.parse('i &= 10'))
305
+ end
306
+
307
+ def test_op_xor_equal
308
+ assert_sexp([[:expression, [:op_xor_equal, [:resolve, 'i'], [:lit, 10]]]],
309
+ @parser.parse('i ^= 10'))
310
+ end
311
+
312
+ def test_op_or_equal
313
+ assert_sexp([[:expression, [:op_or_equal, [:resolve, 'i'], [:lit, 10]]]],
314
+ @parser.parse('i |= 10'))
315
+ end
316
+
317
+ def test_op_mod_equal
318
+ assert_sexp([[:expression, [:op_mod_equal, [:resolve, 'i'], [:lit, 10]]]],
319
+ @parser.parse('i %= 10'))
320
+ end
321
+
322
+ def test_bracket_access_no_bf
323
+ assert_sexp(
324
+ [[:expression,
325
+ [:bracket_access, [:resolve, "foo"], [:lit, 10]],
326
+ ]],
327
+ @parser.parse('foo[10];'))
328
+ end
329
+
330
+ def test_new_member_expr_no_bf
331
+ assert_sexp(
332
+ [[:expression,
333
+ [:new_expr, [:resolve, "foo"], [:args, []]],
334
+ ]],
335
+ @parser.parse('new foo();'))
336
+ end
337
+
338
+ def test_resolve_function_call
339
+ assert_sexp([[:var,
340
+ [[:var_decl,
341
+ :x,
342
+ [:assign, [:function_call, [:resolve, "bar"], [:args, []]]]
343
+ ]]
344
+ ]],
345
+ @parser.parse('var x = bar();'))
346
+ assert_sexp([[:var,
347
+ [[:var_decl,
348
+ :x,
349
+ [:assign, [:function_call, [:resolve, "bar"], [:args, [[:lit, 10]]]]]
350
+ ]]
351
+ ]],
352
+ @parser.parse('var x = bar(10);'))
353
+ assert_sexp([[:var,
354
+ [[:var_decl,
355
+ :x,
356
+ [:assign, [:function_call, [:resolve, "bar"], [:args, [
357
+ [:resolve, 'a'],
358
+ [:lit, 10]
359
+ ]]]]
360
+ ]]
361
+ ]],
362
+ @parser.parse('var x = bar(a,10);'))
363
+ end
364
+
365
+ def test_function_no_bf
366
+ assert_sexp([[:expression,
367
+ [:function_call, [:resolve, "bar"], [:args, []]]
368
+ ]],
369
+ @parser.parse('bar();'))
370
+ end
371
+
372
+ def test_function_on_function_no_bf
373
+ assert_sexp([[:expression,
374
+ [:function_call,
375
+ [:function_call, [:resolve, "bar"], [:args, []]],
376
+ [:args, []]
377
+ ]
378
+ ]],
379
+ @parser.parse('bar()();'))
380
+ end
381
+
382
+ def test_bracket_on_function_no_bf
383
+ assert_sexp([[:expression,
384
+ [:bracket_access,
385
+ [:function_call, [:resolve, "bar"], [:args, []]],
386
+ [:lit, 1],
387
+ ]
388
+ ]],
389
+ @parser.parse('bar()[1];'))
390
+ end
391
+
392
+ def test_dot_on_function_no_bf
393
+ assert_sexp([[:expression,
394
+ [:dot_access,
395
+ [:function_call, [:resolve, "bar"], [:args, []]],
396
+ 'baz',
397
+ ]
398
+ ]],
399
+ @parser.parse('bar().baz;'))
400
+ end
401
+
402
+ def test_new_expr_no_bf
403
+ assert_sexp([[:expression, [:new_expr, [:resolve, 'foo'], [:args, []]]]],
404
+ @parser.parse('new foo;'))
405
+ end
406
+
407
+ def test_new_expr
408
+ assert_sexp([[:var, [[:var_decl, :a, [:assign, [:new_expr, [:resolve, 'foo'], [:args, []]]]]]]],
409
+ @parser.parse('var a = new foo;'))
410
+ end
411
+
412
+ def test_postfix_expr
413
+ assert_sexp([[:var,
414
+ [[:var_decl,
415
+ :x,
416
+ [:assign, [:postfix, [:lit, 10], '++']]]]]],
417
+ @parser.parse('var x = 10++;'))
418
+ assert_sexp([[:var,
419
+ [[:var_decl,
420
+ :x,
421
+ [:assign, [:postfix, [:lit, 10], '--']]]]]],
422
+ @parser.parse('var x = 10--;'))
423
+ end
424
+
425
+ def test_postfix_expr_no_bf
426
+ assert_sexp([[:expression,
427
+ [:postfix, [:lit, 10], '++']]],
428
+ @parser.parse('10++;'))
429
+ assert_sexp([[:expression,
430
+ [:postfix, [:lit, 10], '--']]],
431
+ @parser.parse('10--;'))
432
+ end
433
+
434
+ def test_unary_delete
435
+ assert_sexp([[:expression, [:delete, [:resolve, 'foo']]]],
436
+ @parser.parse('delete foo;'))
437
+ end
438
+
439
+ def test_unary_void
440
+ assert_sexp([[:expression, [:void, [:resolve, 'foo']]]],
441
+ @parser.parse('void foo;'))
442
+ end
443
+
444
+ def test_unary_typeof
445
+ assert_sexp([[:expression, [:typeof, [:resolve, 'foo']]]],
446
+ @parser.parse('typeof foo;'))
447
+ end
448
+
449
+ def test_unary_prefix
450
+ assert_sexp([[:expression, [:prefix, [:lit, 10], '++']]],
451
+ @parser.parse('++10;'))
452
+ assert_sexp([[:expression, [:prefix, [:lit, 10], '--']]],
453
+ @parser.parse('--10;'))
454
+ end
455
+
456
+ def test_unary_plus
457
+ assert_sexp([[:expression, [:u_plus, [:lit, 10]]]],
458
+ @parser.parse('+10;'))
459
+ end
460
+
461
+ def test_unary_minus
462
+ assert_sexp([[:expression, [:u_minus, [:lit, 10]]]],
463
+ @parser.parse('-10;'))
464
+ end
465
+
466
+ def test_unary_bitwise_not
467
+ assert_sexp([[:expression, [:bitwise_not, [:lit, 10]]]],
468
+ @parser.parse('~10;'))
469
+ end
470
+
471
+ def test_unary_logical_not
472
+ assert_sexp([[:expression, [:not, [:lit, 10]]]],
473
+ @parser.parse('!10;'))
474
+ end
475
+
476
+ def test_multiply
477
+ assert_sexp([[:var,
478
+ [[:var_decl,
479
+ :x,
480
+ [:assign, [:multiply, [:lit, 5], [:lit, 10]]]
481
+ ]]
482
+ ]],
483
+ @parser.parse('var x = 5 * 10;'))
484
+ end
485
+
486
+ def test_multiply_no_bf
487
+ assert_sexp([[:expression, [:multiply, [:lit, 5], [:lit, 10]] ]],
488
+ @parser.parse('5 * 10;'))
489
+ end
490
+
491
+ def test_divide
492
+ assert_sexp([[:var,
493
+ [[:var_decl,
494
+ :x,
495
+ [:assign, [:divide, [:lit, 5], [:lit, 10]]]
496
+ ]]
497
+ ]],
498
+ @parser.parse('var x = 5 / 10;'))
499
+ end
500
+
501
+ def test_divide_no_bf
502
+ assert_sexp([[:expression, [:divide, [:lit, 5], [:lit, 10]] ]],
503
+ @parser.parse('5 / 10;'))
504
+ end
505
+
506
+ def test_modulus
507
+ assert_sexp([[:var,
508
+ [[:var_decl,
509
+ :x,
510
+ [:assign, [:modulus, [:lit, 5], [:lit, 10]]]
511
+ ]]
512
+ ]],
513
+ @parser.parse('var x = 5 % 10;'))
514
+ end
515
+
516
+ def test_modulus_no_bf
517
+ assert_sexp([[:expression, [:modulus, [:lit, 5], [:lit, 10]] ]],
518
+ @parser.parse('5 % 10;'))
519
+ end
520
+
521
+ def test_add
522
+ assert_sexp([[:var,
523
+ [[:var_decl,
524
+ :x,
525
+ [:assign, [:add, [:lit, 5], [:lit, 10]]]
526
+ ]]
527
+ ]],
528
+ @parser.parse('var x = 5 + 10;'))
529
+ end
530
+
531
+ def test_add_no_bf
532
+ assert_sexp([[:expression, [:add, [:lit, 5], [:lit, 10]] ]],
533
+ @parser.parse('5 + 10;'))
534
+ end
535
+
536
+ def test_subtract
537
+ assert_sexp([[:var,
538
+ [[:var_decl,
539
+ :x,
540
+ [:assign, [:subtract, [:lit, 5], [:lit, 10]]]
541
+ ]]
542
+ ]],
543
+ @parser.parse('var x = 5 - 10;'))
544
+ end
545
+
546
+ def test_subtract_no_bf
547
+ assert_sexp([[:expression, [:subtract, [:lit, 5], [:lit, 10]] ]],
548
+ @parser.parse('5 - 10;'))
549
+ end
550
+
551
+ def test_lshift
552
+ assert_sexp([[:var,
553
+ [[:var_decl,
554
+ :x,
555
+ [:assign, [:lshift, [:lit, 5], [:lit, 10]]]
556
+ ]]
557
+ ]],
558
+ @parser.parse('var x = 5 << 10;'))
559
+ end
560
+
561
+ def test_lshift_no_bf
562
+ assert_sexp([[:expression, [:lshift, [:lit, 5], [:lit, 10]] ]],
563
+ @parser.parse('5 << 10;'))
564
+ end
565
+
566
+ def test_rshift
567
+ assert_sexp([[:var,
568
+ [[:var_decl,
569
+ :x,
570
+ [:assign, [:rshift, [:lit, 5], [:lit, 10]]]
571
+ ]]
572
+ ]],
573
+ @parser.parse('var x = 5 >> 10;'))
574
+ end
575
+
576
+ def test_rshift_no_bf
577
+ assert_sexp([[:expression, [:rshift, [:lit, 5], [:lit, 10]] ]],
578
+ @parser.parse('5 >> 10;'))
579
+ end
580
+
581
+ def test_urshift
582
+ assert_sexp([[:var,
583
+ [[:var_decl,
584
+ :x,
585
+ [:assign, [:urshift, [:lit, 5], [:lit, 10]]]
586
+ ]]
587
+ ]],
588
+ @parser.parse('var x = 5 >>> 10;'))
589
+ end
590
+
591
+ def test_urshift_no_bf
592
+ assert_sexp([[:expression, [:urshift, [:lit, 5], [:lit, 10]] ]],
593
+ @parser.parse('5 >>> 10;'))
594
+ end
595
+
596
+ def test_less
597
+ assert_sexp([[:var,
598
+ [[:var_decl,
599
+ :x,
600
+ [:assign, [:less, [:lit, 5], [:lit, 10]]]
601
+ ]]
602
+ ]],
603
+ @parser.parse('var x = 5 < 10;'))
604
+ end
605
+
606
+ def test_less_no_bf
607
+ assert_sexp([[:expression, [:less, [:lit, 5], [:lit, 10]] ]],
608
+ @parser.parse('5 < 10;'))
609
+ end
610
+
611
+ def test_less_no_in
612
+ assert_sexp(
613
+ for_loop_sexp([:less, [:resolve, 'foo'], [:lit, 10]]),
614
+ @parser.parse('for(foo < 10; foo < 10; foo++) { var x = 10; }')
615
+ )
616
+ end
617
+
618
+ def test_greater
619
+ assert_sexp([[:var,
620
+ [[:var_decl,
621
+ :x,
622
+ [:assign, [:greater, [:lit, 5], [:lit, 10]]]
623
+ ]]
624
+ ]],
625
+ @parser.parse('var x = 5 > 10;'))
626
+ end
627
+
628
+ def test_greater_no_bf
629
+ assert_sexp([[:expression, [:greater, [:lit, 5], [:lit, 10]] ]],
630
+ @parser.parse('5 > 10;'))
631
+ end
632
+
633
+ def test_greater_no_in
634
+ assert_sexp(
635
+ for_loop_sexp([:greater, [:resolve, 'foo'], [:lit, 10]]),
636
+ @parser.parse('for(foo > 10; foo < 10; foo++) { var x = 10; }')
637
+ )
638
+ end
639
+
640
+ def test_less_or_equal
641
+ assert_sexp([[:var,
642
+ [[:var_decl,
643
+ :x,
644
+ [:assign, [:less_or_equal, [:lit, 5], [:lit, 10]]]
645
+ ]]
646
+ ]],
647
+ @parser.parse('var x = 5 <= 10;'))
648
+ end
649
+
650
+ def test_less_or_equal_no_bf
651
+ assert_sexp([[:expression, [:less_or_equal, [:lit, 5], [:lit, 10]] ]],
652
+ @parser.parse('5 <= 10;'))
653
+ end
654
+
655
+ def test_less_or_equal_no_in
656
+ assert_sexp(
657
+ for_loop_sexp([:less_or_equal, [:resolve, 'foo'], [:lit, 10]]),
658
+ @parser.parse('for(foo <= 10; foo < 10; foo++) { var x = 10; }')
659
+ )
660
+ end
661
+
662
+ def test_greater_or_equal
663
+ assert_sexp([[:var,
664
+ [[:var_decl,
665
+ :x,
666
+ [:assign, [:greater_or_equal, [:lit, 5], [:lit, 10]]]
667
+ ]]
668
+ ]],
669
+ @parser.parse('var x = 5 >= 10;'))
670
+ end
671
+
672
+ def test_greater_or_equal_no_bf
673
+ assert_sexp([[:expression, [:greater_or_equal, [:lit, 5], [:lit, 10]] ]],
674
+ @parser.parse('5 >= 10;'))
675
+ end
676
+
677
+ def test_greater_or_equal_no_in
678
+ assert_sexp(
679
+ for_loop_sexp([:greater_or_equal, [:resolve, 'foo'], [:lit, 10]]),
680
+ @parser.parse('for(foo >= 10; foo < 10; foo++) { var x = 10; }')
681
+ )
682
+ end
683
+
684
+ def test_instance_of
685
+ assert_sexp([[:var,
686
+ [[:var_decl,
687
+ :x,
688
+ [:assign, [:instance_of, [:lit, 5], [:lit, 10]]]
689
+ ]]
690
+ ]],
691
+ @parser.parse('var x = 5 instanceof 10;'))
692
+ end
693
+
694
+ def test_instanceof_no_bf
695
+ assert_sexp([[:expression, [:instance_of, [:lit, 5], [:lit, 10]] ]],
696
+ @parser.parse('5 instanceof 10;'))
697
+ end
698
+
699
+ def test_instanceof_no_in
700
+ assert_sexp(for_loop_sexp([:instance_of, [:resolve, 'foo'], [:lit, 10]]),
701
+ @parser.parse('for(foo instanceof 10; foo < 10; foo++) { var x = 10; }'))
702
+ end
703
+
704
+ def test_equal_equal
705
+ assert_sexp([[:var,
706
+ [[:var_decl,
707
+ :x,
708
+ [:assign, [:equal, [:lit, 5], [:lit, 10]]]
709
+ ]]
710
+ ]],
711
+ @parser.parse('var x = 5 == 10;'))
712
+ end
713
+
714
+ def test_equal_equal_no_bf
715
+ assert_sexp([[:expression, [:equal, [:lit, 5], [:lit, 10]] ]],
716
+ @parser.parse('5 == 10;'))
717
+ end
718
+
719
+ def test_equal_equal_no_in
720
+ assert_sexp(
721
+ for_loop_sexp([:equal, [:resolve, 'foo'], [:lit, 10]]),
722
+ @parser.parse('for(foo == 10; foo < 10; foo++) { var x = 10; }')
723
+ )
724
+ end
725
+
726
+ def test_not_equal
727
+ assert_sexp([[:var,
728
+ [[:var_decl,
729
+ :x,
730
+ [:assign, [:not_equal, [:lit, 5], [:lit, 10]]]
731
+ ]]
732
+ ]],
733
+ @parser.parse('var x = 5 != 10;'))
734
+ end
735
+
736
+ def test_not_equal_no_bf
737
+ assert_sexp([[:expression, [:not_equal, [:lit, 5], [:lit, 10]] ]],
738
+ @parser.parse('5 != 10;'))
739
+ end
740
+
741
+ def test_not_equal_no_in
742
+ assert_sexp(
743
+ for_loop_sexp([:not_equal, [:resolve, 'foo'], [:lit, 10]]),
744
+ @parser.parse('for(foo != 10; foo < 10; foo++) { var x = 10; }')
745
+ )
746
+ end
747
+
748
+ def test_strict_equal
749
+ assert_sexp([[:var,
750
+ [[:var_decl,
751
+ :x,
752
+ [:assign, [:strict_equal, [:lit, 5], [:lit, 10]]]
753
+ ]]
754
+ ]],
755
+ @parser.parse('var x = 5 === 10;'))
756
+ end
757
+
758
+ def test_strict_equal_no_bf
759
+ assert_sexp([[:expression, [:strict_equal, [:lit, 5], [:lit, 10]] ]],
760
+ @parser.parse('5 === 10;'))
761
+ end
762
+
763
+ def test_strict_equal_no_in
764
+ assert_sexp(
765
+ for_loop_sexp([:strict_equal, [:resolve, 'foo'], [:lit, 10]]),
766
+ @parser.parse('for(foo === 10; foo < 10; foo++) { var x = 10; }')
767
+ )
768
+ end
769
+
770
+ def test_not_strict_equal
771
+ assert_sexp([[:var,
772
+ [[:var_decl,
773
+ :x,
774
+ [:assign, [:not_strict_equal, [:lit, 5], [:lit, 10]]]
775
+ ]]
776
+ ]],
777
+ @parser.parse('var x = 5 !== 10;'))
778
+ end
779
+
780
+ def test_not_strict_equal_no_bf
781
+ assert_sexp([[:expression, [:not_strict_equal, [:lit, 5], [:lit, 10]] ]],
782
+ @parser.parse('5 !== 10;'))
783
+ end
784
+
785
+ def test_not_strict_equal_no_in
786
+ assert_sexp(
787
+ for_loop_sexp([:not_strict_equal, [:resolve, 'foo'], [:lit, 10]]),
788
+ @parser.parse('for(foo !== 10; foo < 10; foo++) { var x = 10; }')
789
+ )
790
+ end
791
+
792
+ def test_bit_and
793
+ assert_sexp([[:var,
794
+ [[:var_decl,
795
+ :x,
796
+ [:assign, [:bit_and, [:lit, 5], [:lit, 10]]]
797
+ ]]
798
+ ]],
799
+ @parser.parse('var x = 5 & 10;'))
800
+ end
801
+
802
+ def test_bit_and_no_bf
803
+ assert_sexp([[:expression, [:bit_and, [:lit, 5], [:lit, 10]] ]],
804
+ @parser.parse('5 & 10;'))
805
+ end
806
+
807
+ def test_bit_and_no_in
808
+ assert_sexp(
809
+ for_loop_sexp([:bit_and, [:resolve, 'foo'], [:lit, 10]]),
810
+ @parser.parse('for(foo & 10; foo < 10; foo++) { var x = 10; }')
811
+ )
812
+ end
813
+
814
+ def test_bit_xor
815
+ assert_sexp([[:var,
816
+ [[:var_decl,
817
+ :x,
818
+ [:assign, [:bit_xor, [:lit, 5], [:lit, 10]]]
819
+ ]]
820
+ ]],
821
+ @parser.parse('var x = 5 ^ 10;'))
822
+ end
823
+
824
+ def test_bit_xor_no_bf
825
+ assert_sexp([[:expression, [:bit_xor, [:lit, 5], [:lit, 10]] ]],
826
+ @parser.parse('5 ^ 10;'))
827
+ end
828
+
829
+ def test_bit_xor_no_in
830
+ assert_sexp(
831
+ for_loop_sexp([:bit_xor, [:resolve, 'foo'], [:lit, 10]]),
832
+ @parser.parse('for(foo ^ 10; foo < 10; foo++) { var x = 10; }')
833
+ )
834
+ end
835
+
836
+ def test_bit_or
837
+ assert_sexp([[:var,
838
+ [[:var_decl,
839
+ :x,
840
+ [:assign, [:bit_or, [:lit, 5], [:lit, 10]]]
841
+ ]]
842
+ ]],
843
+ @parser.parse('var x = 5 | 10;'))
844
+ end
845
+
846
+ def test_bit_or_no_bf
847
+ assert_sexp([[:expression, [:bit_or, [:lit, 5], [:lit, 10]] ]],
848
+ @parser.parse('5 | 10;'))
849
+ end
850
+
851
+ def test_bit_or_no_in
852
+ assert_sexp(
853
+ for_loop_sexp([:bit_or, [:resolve, 'foo'], [:lit, 10]]),
854
+ @parser.parse('for(foo | 10; foo < 10; foo++) { var x = 10; }')
855
+ )
856
+ end
857
+
858
+ def test_and
859
+ assert_sexp([[:var,
860
+ [[:var_decl,
861
+ :x,
862
+ [:assign, [:and, [:lit, 5], [:lit, 10]]]
863
+ ]]
864
+ ]],
865
+ @parser.parse('var x = 5 && 10;'))
866
+ end
867
+
868
+ def test_and_no_bf
869
+ assert_sexp([[:expression, [:and, [:lit, 5], [:lit, 10]] ]],
870
+ @parser.parse('5 && 10;'))
871
+ end
872
+
873
+ def test_and_no_in
874
+ assert_sexp(
875
+ for_loop_sexp([:and, [:resolve, 'foo'], [:lit, 10]]),
876
+ @parser.parse('for(foo && 10; foo < 10; foo++) { var x = 10; }')
877
+ )
878
+ end
879
+
880
+ def test_or
881
+ assert_sexp([[:var,
882
+ [[:var_decl,
883
+ :x,
884
+ [:assign, [:or, [:lit, 5], [:lit, 10]]]
885
+ ]]
886
+ ]],
887
+ @parser.parse('var x = 5 || 10;'))
888
+ end
889
+
890
+ def test_or_no_bf
891
+ assert_sexp([[:expression, [:or, [:lit, 5], [:lit, 10]] ]],
892
+ @parser.parse('5 || 10;'))
893
+ end
894
+
895
+ def test_or_no_in
896
+ assert_sexp(
897
+ for_loop_sexp([:or, [:resolve, 'foo'], [:lit, 10]]),
898
+ @parser.parse('for(foo || 10; foo < 10; foo++) { var x = 10; }')
899
+ )
900
+ end
901
+
902
+ def test_conditional_expr
903
+ assert_sexp([
904
+ var_sexp('x', [:conditional, [:less, [:lit, 5], [:lit, 10]], [:lit, 20], [:lit, 30]])
905
+ ],
906
+ @parser.parse('var x = 5 < 10 ? 20 : 30;')
907
+ )
908
+ end
909
+
910
+ def test_conditional_expr_no_bf
911
+ assert_sexp([[:expression,
912
+ [:conditional, [:less, [:lit, 5], [:lit, 10]], [:lit, 20], [:lit, 30]]
913
+ ]],
914
+ @parser.parse('5 < 10 ? 20 : 30;')
915
+ )
916
+ end
917
+
918
+ def test_for_expr_comma
919
+ @parser.parse('for(y = 20, x = 10; foo < 10; foo++) {}')
920
+ assert_sexp(
921
+ for_loop_sexp([:comma,
922
+ [:op_equal, [:resolve, 'y'], [:lit, 20]],
923
+ [:op_equal, [:resolve, 'x'], [:lit, 10]]]
924
+ ),
925
+ @parser.parse('for(y = 20, x = 10; foo < 10; foo++) { var x = 10; }')
926
+ )
927
+ end
928
+
929
+ def test_conditional_expr_no_in
930
+ assert_sexp(
931
+ for_loop_sexp([:conditional, [:less, [:lit, 5], [:lit, 10]], [:lit, 20], [:lit, 30]]),
932
+ @parser.parse('for(5 < 10 ? 20 : 30; foo < 10; foo++) { var x = 10; }')
933
+ )
934
+ end
935
+
936
+ def test_block_node
937
+ assert_sexp([[:block, []]], @parser.parse('{ }'))
938
+ assert_sexp([[:block, [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]]],
939
+ @parser.parse('{ var foo = 10; }'))
940
+
941
+ assert_sexp([
942
+ [:block, [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]],
943
+ [:var, [[:var_decl, :bax, [:assign, [:lit, 20]]]]],
944
+ ],
945
+ @parser.parse('{ var foo = 10 } var bax = 20;'))
946
+ end
947
+
948
+ def test_if_no_else
949
+ assert_sexp([[:if,
950
+ [:and, [:lit, 5], [:lit, 10]],
951
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 20]]]]],
952
+ ]], @parser.parse('if(5 && 10) var foo = 20;'))
953
+ end
954
+
955
+ def test_if_else
956
+ assert_sexp([[:if,
957
+ [:and, [:lit, 5], [:lit, 10]],
958
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 20]]]]],
959
+ [:var, [[:var_decl, :bar, [:assign, [:lit, 5]]]]],
960
+ ]], @parser.parse(' if(5 && 10) var foo = 20; else var bar = 5; '))
961
+ end
962
+
963
+ def test_if_comma
964
+ assert_sexp(
965
+ [[:if,
966
+ [:comma,
967
+ [:op_equal, [:resolve, "i"], [:lit, 10]],
968
+ [:op_equal, [:resolve, "j"], [:lit, 11]]],
969
+ [:block, []]]],
970
+ @parser.parse('if(i = 10, j = 11) { }')
971
+ )
972
+ end
973
+
974
+ def test_in
975
+ assert_sexp([[:var,
976
+ [[:var_decl, :x, [:assign,
977
+ [:in, [:lit, 0], [:resolve, "foo"]]
978
+ ]]]
979
+ ]],
980
+ @parser.parse('var x = 0 in foo;'))
981
+ end
982
+
983
+ def test_in_no_bf
984
+ assert_sexp([[:expression, [:in, [:lit, 0], [:resolve, "foo"]]]],
985
+ @parser.parse('0 in foo;'))
986
+ end
987
+
988
+ def test_do_while
989
+ assert_sexp([[:do_while, [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]],
990
+ [:true]]],
991
+ @parser.parse('do var x = 10; while(true);'))
992
+ assert_sexp([[:do_while, [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]],
993
+ [:true]]],
994
+ @parser.parse('do var x = 10; while(true)'))
995
+ end
996
+
997
+ def test_while
998
+ assert_sexp([[:while,
999
+ [:true],
1000
+ [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]],
1001
+ ]],
1002
+ @parser.parse('while(true) var x = 10;'))
1003
+ end
1004
+
1005
+ def test_for_with_semi
1006
+ assert_sexp([[:for, nil, nil, nil,
1007
+ [:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]],
1008
+ ]], @parser.parse('for( ; ; ) var x = 10;'))
1009
+
1010
+ assert_sexp([[:for,
1011
+ [:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]],
1012
+ [:less, [:resolve, 'foo'], [:lit, 10]],
1013
+ [:postfix, [:resolve, 'foo'], '++'],
1014
+ [:block, [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]]]
1015
+ ], @parser.parse('for(var foo = 10; foo < 10; foo++) { var x = 10; }'))
1016
+ assert_sexp([[:for,
1017
+ [:op_equal, [:resolve, 'foo'], [:lit, 10]],
1018
+ [:less, [:resolve, 'foo'], [:lit, 10]],
1019
+ [:postfix, [:resolve, 'foo'], '++'],
1020
+ [:block, [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]]]
1021
+ ], @parser.parse('for(foo = 10; foo < 10; foo++) { var x = 10; }'))
1022
+
1023
+ assert_sexp(for_loop_sexp([:var, [[:var_decl, :x, [:assign, [:lit, 10]]],
1024
+ [:var_decl, :y, [:assign, [:lit, 20]]]]]),
1025
+ @parser.parse('for(var x = 10, y = 20; foo < 10; foo++) { var x = 10; }'))
1026
+
1027
+ assert_sexp(for_loop_sexp([:var, [[:var_decl, :foo, nil]]]),
1028
+ @parser.parse('for(var foo; foo < 10; foo++) { var x = 10; }'))
1029
+ end
1030
+
1031
+ def test_for_expr_in_expr
1032
+ assert_sexp(
1033
+ for_in_sexp([:resolve, 'foo'], [:resolve, 'bar']),
1034
+ @parser.parse('for(foo in bar) { var x = 10; }')
1035
+ )
1036
+ end
1037
+
1038
+ def test_for_var_ident_in_expr
1039
+ assert_sexp(
1040
+ for_in_sexp([:var_decl, :foo, nil], [:resolve, 'bar']),
1041
+ @parser.parse('for(var foo in bar) { var x = 10; }')
1042
+ )
1043
+ end
1044
+
1045
+ def test_for_var_ident_init_in_expr
1046
+ assert_sexp(
1047
+ for_in_sexp([:var_decl, :foo, [:assign,[:lit, 10]]], [:resolve, 'bar']),
1048
+ @parser.parse('for(var foo = 10 in bar) { var x = 10; }')
1049
+ )
1050
+ end
1051
+
1052
+ def test_try_finally
1053
+ assert_sexp([[ :try,
1054
+ [:block,
1055
+ [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]
1056
+ ],
1057
+ nil,
1058
+ nil,
1059
+ [:block,
1060
+ [[:var, [[:var_decl, :x, [:assign, [:lit, 20]]]]]]
1061
+ ]
1062
+ ]],
1063
+ @parser.parse('try { var x = 10; } finally { var x = 20; }'))
1064
+ end
1065
+
1066
+ def test_try_catch
1067
+ assert_sexp([[ :try,
1068
+ [:block,
1069
+ [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]
1070
+ ],
1071
+ 'a',
1072
+ [:block,
1073
+ [[:var, [[:var_decl, :x, [:assign, [:lit, 20]]]]]]
1074
+ ],
1075
+ nil,
1076
+ ]],
1077
+ @parser.parse('try { var x = 10; } catch(a) { var x = 20; }'))
1078
+ end
1079
+
1080
+ def test_try_catch_finally
1081
+ assert_sexp([[ :try,
1082
+ [:block,
1083
+ [[:var, [[:var_decl, :baz, [:assign, [:lit, 69]]]]]]
1084
+ ],
1085
+ 'a',
1086
+ [:block,
1087
+ [[:var, [[:var_decl, :bar, [:assign, [:lit, 20]]]]]]
1088
+ ],
1089
+ [:block,
1090
+ [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]]
1091
+ ]
1092
+ ]],
1093
+ @parser.parse('try { var baz = 69; } catch(a) { var bar = 20; } finally { var foo = 10; }'))
1094
+ end
1095
+
1096
+ def test_with
1097
+ assert_sexp([[:with, [:resolve, 'o'], [:expression, [:resolve, 'x']]]],
1098
+ @parser.parse('with (o) x;')
1099
+ )
1100
+ end
1101
+
1102
+ def test_switch_no_case
1103
+ assert_sexp([[:switch, [:resolve, 'o'], [:case_block, []]]],
1104
+ @parser.parse('switch(o) { }')
1105
+ )
1106
+ end
1107
+
1108
+ def test_switch_case_no_statement
1109
+ assert_sexp([[:switch, [:resolve, 'o'], [:case_block, [[:case, [:resolve, 'j'], []]]]]],
1110
+ @parser.parse('switch(o) { case j: }')
1111
+ )
1112
+ end
1113
+
1114
+ def test_switch_case
1115
+ assert_sexp([[:switch, [:resolve, 'o'],
1116
+ [:case_block,
1117
+ [[:case, [:resolve, 'j'], [[:expression, [:resolve, 'foo']]]]]
1118
+ ]
1119
+ ]],
1120
+ @parser.parse('switch(o) { case j: foo; }')
1121
+ )
1122
+ end
1123
+
1124
+ def test_switch_case_case
1125
+ assert_sexp([[:switch, [:resolve, 'o'],
1126
+ [:case_block,[
1127
+ [:case, [:resolve, 'j'], [[:expression, [:resolve, 'foo']]]],
1128
+ [:case, [:resolve, 'k'], [[:expression, [:resolve, 'bar']]]],
1129
+ ]]
1130
+ ]],
1131
+ @parser.parse('switch(o) { case j: foo; case k: bar; }')
1132
+ )
1133
+ end
1134
+
1135
+ def test_switch_default
1136
+ assert_sexp([[:switch, [:resolve, 'o'],
1137
+ [:case_block,[
1138
+ [:case, nil, [[:expression, [:resolve, 'bar']]]],
1139
+ ]]
1140
+ ]],
1141
+ @parser.parse('switch(o) { default: bar; }')
1142
+ )
1143
+ end
1144
+
1145
+ def test_switch_default_no_expr
1146
+ assert_sexp([[:switch, [:resolve, 'o'],
1147
+ [:case_block,[
1148
+ [:case, nil, []],
1149
+ ]]
1150
+ ]],
1151
+ @parser.parse('switch(o) { default: }')
1152
+ )
1153
+ end
1154
+
1155
+ def test_function_call_on_function
1156
+ assert_sexp([[:var,
1157
+ [[:var_decl,
1158
+ :x,
1159
+ [:assign, [:function_call,
1160
+ [:function_call, [:resolve, "bar"], [:args, []]],
1161
+ [:args, []]]]
1162
+ ]]
1163
+ ]],
1164
+ @parser.parse('var x = bar()();'))
1165
+ end
1166
+
1167
+ def test_bracket_on_function
1168
+ assert_sexp([[:var,
1169
+ [[:var_decl,
1170
+ :x,
1171
+ [:assign, [:bracket_access,
1172
+ [:function_call, [:resolve, "bar"], [:args, []]],
1173
+ [:lit, 1]
1174
+ ]]
1175
+ ]]
1176
+ ]],
1177
+ @parser.parse('var x = bar()[1];'))
1178
+ end
1179
+
1180
+ def test_dot_on_function
1181
+ assert_sexp([[:var,
1182
+ [[:var_decl,
1183
+ :x,
1184
+ [:assign, [:dot_access,
1185
+ [:function_call, [:resolve, "bar"], [:args, []]],
1186
+ 'baz'
1187
+ ]]
1188
+ ]]
1189
+ ]],
1190
+ @parser.parse('var x = bar().baz;'))
1191
+ end
1192
+
1193
+ def test_dot_access
1194
+ assert_sexp(
1195
+ [[:var,
1196
+ [[:var_decl, :a, [:assign, [:dot_access, [:resolve, "foo"], "bar"]]]]
1197
+ ]],
1198
+ @parser.parse('var a = foo.bar;'))
1199
+ end
1200
+
1201
+ def test_new_member_expr
1202
+ assert_sexp(
1203
+ [[:var,
1204
+ [[:var_decl, :a,
1205
+ [:assign, [:new_expr, [:resolve, "foo"], [:args, []]]]
1206
+ ]]
1207
+ ]],
1208
+ @parser.parse('var a = new foo();'))
1209
+ end
1210
+
1211
+ def test_empty_statement
1212
+ assert_sexp(
1213
+ [
1214
+ [:const, [[:const_decl, :foo, [:assign, [:lit, 10]]]]],
1215
+ [:empty]
1216
+ ],
1217
+ @parser.parse('const foo = 10; ;')
1218
+ )
1219
+ end
1220
+
1221
+ def test_debugger_statement
1222
+ assert_sexp(
1223
+ [ [:empty] ],
1224
+ @parser.parse('debugger;')
1225
+ )
1226
+ assert_sexp(
1227
+ [ [:empty] ],
1228
+ @parser.parse('debugger')
1229
+ )
1230
+ end
1231
+
1232
+ def test_function_decl
1233
+ assert_sexp([[:func_decl, 'foo', [], [:func_body, []]]],
1234
+ @parser.parse('function foo() { }'))
1235
+ end
1236
+
1237
+ def test_function_decl_params
1238
+ assert_sexp([[:func_decl, 'foo', [[:param, 'a']], [:func_body, []]]],
1239
+ @parser.parse('function foo(a) { }'))
1240
+ end
1241
+
1242
+ def test_const_statement
1243
+ assert_sexp(
1244
+ [[:const, [[:const_decl, :foo, [:assign, [:lit, 10]]]]]],
1245
+ @parser.parse('const foo = 10;')
1246
+ )
1247
+ end
1248
+
1249
+ def test_const_decl_list
1250
+ assert_sexp(
1251
+ [[:const,
1252
+ [
1253
+ [:const_decl, :foo, [:assign, [:lit, 10]]],
1254
+ [:const_decl, :bar, [:assign, [:lit, 1]]],
1255
+ ]]],
1256
+ @parser.parse('const foo = 10, bar = 1;')
1257
+ )
1258
+ end
1259
+
1260
+ def test_const_decl_no_init
1261
+ assert_sexp(
1262
+ [[:const, [[:const_decl, :foo, nil]]]],
1263
+ @parser.parse('const foo;')
1264
+ )
1265
+ end
1266
+
1267
+ def test_const_statement_error
1268
+ assert_sexp(
1269
+ [[:const, [[:const_decl, :foo, [:assign, [:lit, 10]]]]]],
1270
+ @parser.parse('const foo = 10')
1271
+ )
1272
+ end
1273
+
1274
+ def test_variable_statement
1275
+ assert_sexp(
1276
+ [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]],
1277
+ @parser.parse('var foo = 10;')
1278
+ )
1279
+ end
1280
+
1281
+ def test_variable_declaration_no_init
1282
+ assert_sexp(
1283
+ [[:var, [[:var_decl, :foo, nil]]]],
1284
+ @parser.parse('var foo;')
1285
+ )
1286
+ end
1287
+
1288
+ def test_variable_declaration_nil_init
1289
+ assert_sexp(
1290
+ [[:var, [[:var_decl, :foo, [:assign, [:nil]]]]]],
1291
+ @parser.parse('var foo = null;')
1292
+ )
1293
+ end
1294
+
1295
+ def test_variable_statement_no_semi
1296
+ assert_sexp(
1297
+ [[:var, [[:var_decl, :foo, [:assign, [:lit, 10]]]]]],
1298
+ @parser.parse('var foo = 10')
1299
+ )
1300
+ end
1301
+
1302
+ def test_return_statement
1303
+ assert_sexp(
1304
+ [[:return]],
1305
+ @parser.parse('return;')
1306
+ )
1307
+ assert_sexp(
1308
+ [[:return]],
1309
+ @parser.parse('return')
1310
+ )
1311
+ assert_sexp(
1312
+ [[:return, [:lit, 10]]],
1313
+ @parser.parse('return 10;')
1314
+ )
1315
+ assert_sexp(
1316
+ [[:return, [:lit, 10]]],
1317
+ @parser.parse('return 10')
1318
+ )
1319
+ end
1320
+
1321
+ def test_break_statement
1322
+ assert_sexp([[:break]], @parser.parse('break;'))
1323
+ assert_sexp([[:break]], @parser.parse('break'))
1324
+ assert_sexp([[:break, 'foo']], @parser.parse('break foo;'))
1325
+ assert_sexp([[:break, 'foo']], @parser.parse('break foo'))
1326
+ end
1327
+
1328
+ def test_continue_statement
1329
+ assert_sexp([[:continue]], @parser.parse('continue;'))
1330
+ assert_sexp([[:continue]], @parser.parse('continue'))
1331
+ assert_sexp([[:continue, 'foo']], @parser.parse('continue foo;'))
1332
+ assert_sexp([[:continue, 'foo']], @parser.parse('continue foo'))
1333
+ end
1334
+
1335
+ def test_variable_declaration_list
1336
+ assert_sexp(
1337
+ [[:var,
1338
+ [
1339
+ [:var_decl, :foo, [:assign, [:lit, 10]]],
1340
+ [:var_decl, :bar, [:assign, [:lit, 1]]],
1341
+ ]]],
1342
+ @parser.parse('var foo = 10, bar = 1;')
1343
+ )
1344
+ end
1345
+
1346
+ def assert_sexp(expected, node)
1347
+ assert_equal(expected, node.to_sexp)
1348
+ end
1349
+
1350
+ def var_sexp(variable_name, val = [:lit, 10])
1351
+ [:var, [[:var_decl, variable_name.to_sym, [:assign, val]]]]
1352
+ end
1353
+
1354
+ def for_in_sexp(variable, list)
1355
+ [[:for_in, variable, list, [:block, [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]]]]
1356
+ end
1357
+
1358
+ def for_loop_sexp(init, test = [:less, [:resolve, 'foo'], [:lit, 10]], exec = [:postfix, [:resolve, 'foo'], '++'])
1359
+ [[:for, init, test, exec, [:block, [[:var, [[:var_decl, :x, [:assign, [:lit, 10]]]]]]]]]
1360
+ end
1361
+ end