modulr 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. data/LICENSE +22 -0
  2. data/README.markdown +62 -0
  3. data/Rakefile +55 -0
  4. data/VERSION +1 -0
  5. data/assets/modulr.js +58 -0
  6. data/bin/modulrize +39 -0
  7. data/example/foo/bar.js +1 -0
  8. data/example/foo/foo.js +3 -0
  9. data/example/increment.js +6 -0
  10. data/example/inspect.js +3 -0
  11. data/example/math.js +7 -0
  12. data/example/program.js +9 -0
  13. data/lib/modulr/collector.rb +60 -0
  14. data/lib/modulr/js_module.rb +88 -0
  15. data/lib/modulr/version.rb +6 -0
  16. data/lib/modulr.rb +21 -0
  17. data/vendor/rkelly/CHANGELOG.rdoc +13 -0
  18. data/vendor/rkelly/Manifest.txt +198 -0
  19. data/vendor/rkelly/README.rdoc +58 -0
  20. data/vendor/rkelly/Rakefile +39 -0
  21. data/vendor/rkelly/lib/parser.y +870 -0
  22. data/vendor/rkelly/lib/rkelly/constants.rb +3 -0
  23. data/vendor/rkelly/lib/rkelly/generated_parser.rb +3237 -0
  24. data/vendor/rkelly/lib/rkelly/js/array.rb +15 -0
  25. data/vendor/rkelly/lib/rkelly/js/base.rb +91 -0
  26. data/vendor/rkelly/lib/rkelly/js/boolean.rb +21 -0
  27. data/vendor/rkelly/lib/rkelly/js/function.rb +39 -0
  28. data/vendor/rkelly/lib/rkelly/js/function_prototype.rb +15 -0
  29. data/vendor/rkelly/lib/rkelly/js/global_object.rb +52 -0
  30. data/vendor/rkelly/lib/rkelly/js/math.rb +10 -0
  31. data/vendor/rkelly/lib/rkelly/js/nan.rb +18 -0
  32. data/vendor/rkelly/lib/rkelly/js/number.rb +22 -0
  33. data/vendor/rkelly/lib/rkelly/js/object.rb +30 -0
  34. data/vendor/rkelly/lib/rkelly/js/object_prototype.rb +14 -0
  35. data/vendor/rkelly/lib/rkelly/js/property.rb +20 -0
  36. data/vendor/rkelly/lib/rkelly/js/scope.rb +6 -0
  37. data/vendor/rkelly/lib/rkelly/js/string.rb +21 -0
  38. data/vendor/rkelly/lib/rkelly/js.rb +14 -0
  39. data/vendor/rkelly/lib/rkelly/lexeme.rb +18 -0
  40. data/vendor/rkelly/lib/rkelly/nodes/binary_node.rb +18 -0
  41. data/vendor/rkelly/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  42. data/vendor/rkelly/lib/rkelly/nodes/case_clause_node.rb +11 -0
  43. data/vendor/rkelly/lib/rkelly/nodes/comma_node.rb +11 -0
  44. data/vendor/rkelly/lib/rkelly/nodes/conditional_node.rb +11 -0
  45. data/vendor/rkelly/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  46. data/vendor/rkelly/lib/rkelly/nodes/for_in_node.rb +12 -0
  47. data/vendor/rkelly/lib/rkelly/nodes/for_node.rb +13 -0
  48. data/vendor/rkelly/lib/rkelly/nodes/function_call_node.rb +16 -0
  49. data/vendor/rkelly/lib/rkelly/nodes/function_decl_node.rb +6 -0
  50. data/vendor/rkelly/lib/rkelly/nodes/function_expr_node.rb +12 -0
  51. data/vendor/rkelly/lib/rkelly/nodes/if_node.rb +12 -0
  52. data/vendor/rkelly/lib/rkelly/nodes/label_node.rb +11 -0
  53. data/vendor/rkelly/lib/rkelly/nodes/new_expr_node.rb +11 -0
  54. data/vendor/rkelly/lib/rkelly/nodes/node.rb +88 -0
  55. data/vendor/rkelly/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  56. data/vendor/rkelly/lib/rkelly/nodes/op_equal_node.rb +16 -0
  57. data/vendor/rkelly/lib/rkelly/nodes/postfix_node.rb +11 -0
  58. data/vendor/rkelly/lib/rkelly/nodes/prefix_node.rb +6 -0
  59. data/vendor/rkelly/lib/rkelly/nodes/property_node.rb +13 -0
  60. data/vendor/rkelly/lib/rkelly/nodes/resolve_node.rb +19 -0
  61. data/vendor/rkelly/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  62. data/vendor/rkelly/lib/rkelly/nodes/try_node.rb +13 -0
  63. data/vendor/rkelly/lib/rkelly/nodes/var_decl_node.rb +15 -0
  64. data/vendor/rkelly/lib/rkelly/nodes.rb +25 -0
  65. data/vendor/rkelly/lib/rkelly/parser.rb +104 -0
  66. data/vendor/rkelly/lib/rkelly/runtime/ruby_function.rb +13 -0
  67. data/vendor/rkelly/lib/rkelly/runtime/scope_chain.rb +57 -0
  68. data/vendor/rkelly/lib/rkelly/runtime.rb +36 -0
  69. data/vendor/rkelly/lib/rkelly/syntax_error.rb +4 -0
  70. data/vendor/rkelly/lib/rkelly/token.rb +15 -0
  71. data/vendor/rkelly/lib/rkelly/tokenizer.rb +122 -0
  72. data/vendor/rkelly/lib/rkelly/visitable.rb +16 -0
  73. data/vendor/rkelly/lib/rkelly/visitors/dot_visitor.rb +228 -0
  74. data/vendor/rkelly/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  75. data/vendor/rkelly/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  76. data/vendor/rkelly/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  77. data/vendor/rkelly/lib/rkelly/visitors/function_visitor.rb +46 -0
  78. data/vendor/rkelly/lib/rkelly/visitors/pointcut_visitor.rb +31 -0
  79. data/vendor/rkelly/lib/rkelly/visitors/real_sexp_visitor.rb +16 -0
  80. data/vendor/rkelly/lib/rkelly/visitors/sexp_visitor.rb +373 -0
  81. data/vendor/rkelly/lib/rkelly/visitors/visitor.rb +136 -0
  82. data/vendor/rkelly/lib/rkelly/visitors.rb +4 -0
  83. data/vendor/rkelly/lib/rkelly.rb +14 -0
  84. data/vendor/rkelly/rkelly.gemspec +34 -0
  85. data/vendor/rkelly/test/ecma_script_test_case.rb +21 -0
  86. data/vendor/rkelly/test/execute_test_case.rb +16 -0
  87. data/vendor/rkelly/test/execution_contexts/test_10_1_3-1.rb +32 -0
  88. data/vendor/rkelly/test/expressions/test_11_3_1.rb +64 -0
  89. data/vendor/rkelly/test/expressions/test_11_3_2.rb +64 -0
  90. data/vendor/rkelly/test/expressions/test_11_4_2.rb +13 -0
  91. data/vendor/rkelly/test/expressions/test_11_4_3.rb +52 -0
  92. data/vendor/rkelly/test/expressions/test_11_4_4.rb +68 -0
  93. data/vendor/rkelly/test/expressions/test_11_4_5.rb +69 -0
  94. data/vendor/rkelly/test/expressions/test_11_4_6.rb +88 -0
  95. data/vendor/rkelly/test/expressions/test_11_4_8.rb +28 -0
  96. data/vendor/rkelly/test/expressions/test_11_4_9.rb +103 -0
  97. data/vendor/rkelly/test/expressions/test_11_5_1.rb +51 -0
  98. data/vendor/rkelly/test/expressions/test_11_5_2.rb +80 -0
  99. data/vendor/rkelly/test/expressions/test_11_5_3.rb +88 -0
  100. data/vendor/rkelly/test/expressions/test_11_6_1-1.rb +19 -0
  101. data/vendor/rkelly/test/expressions/test_11_9_1.rb +19 -0
  102. data/vendor/rkelly/test/function/test_15_3_1_1-1.rb +34 -0
  103. data/vendor/rkelly/test/global_object/test_15_1_1_1.rb +29 -0
  104. data/vendor/rkelly/test/global_object/test_15_1_1_2.rb +17 -0
  105. data/vendor/rkelly/test/global_object/test_15_1_1_3.rb +9 -0
  106. data/vendor/rkelly/test/helper.rb +5 -0
  107. data/vendor/rkelly/test/node_test_case.rb +11 -0
  108. data/vendor/rkelly/test/object/test_15_2_1_1.rb +257 -0
  109. data/vendor/rkelly/test/object/test_15_2_1_2.rb +21 -0
  110. data/vendor/rkelly/test/object/test_15_2_2_1.rb +52 -0
  111. data/vendor/rkelly/test/statements/test_12_5-1.rb +27 -0
  112. data/vendor/rkelly/test/test_add_node.rb +8 -0
  113. data/vendor/rkelly/test/test_arguments_node.rb +8 -0
  114. data/vendor/rkelly/test/test_array_node.rb +9 -0
  115. data/vendor/rkelly/test/test_assign_expr_node.rb +8 -0
  116. data/vendor/rkelly/test/test_automatic_semicolon_insertion.rb +137 -0
  117. data/vendor/rkelly/test/test_bit_and_node.rb +8 -0
  118. data/vendor/rkelly/test/test_bit_or_node.rb +8 -0
  119. data/vendor/rkelly/test/test_bit_x_or_node.rb +8 -0
  120. data/vendor/rkelly/test/test_bitwise_not_node.rb +8 -0
  121. data/vendor/rkelly/test/test_block_node.rb +14 -0
  122. data/vendor/rkelly/test/test_bracket_accessor_node.rb +16 -0
  123. data/vendor/rkelly/test/test_break_node.rb +11 -0
  124. data/vendor/rkelly/test/test_case_block_node.rb +11 -0
  125. data/vendor/rkelly/test/test_case_clause_node.rb +15 -0
  126. data/vendor/rkelly/test/test_comma_node.rb +13 -0
  127. data/vendor/rkelly/test/test_comments.rb +44 -0
  128. data/vendor/rkelly/test/test_conditional_node.rb +17 -0
  129. data/vendor/rkelly/test/test_const_statement_node.rb +14 -0
  130. data/vendor/rkelly/test/test_continue_node.rb +11 -0
  131. data/vendor/rkelly/test/test_delete_node.rb +8 -0
  132. data/vendor/rkelly/test/test_divide_node.rb +8 -0
  133. data/vendor/rkelly/test/test_do_while_node.rb +13 -0
  134. data/vendor/rkelly/test/test_dot_accessor_node.rb +9 -0
  135. data/vendor/rkelly/test/test_ecma_visitor.rb +192 -0
  136. data/vendor/rkelly/test/test_element_node.rb +8 -0
  137. data/vendor/rkelly/test/test_empty_statement_node.rb +8 -0
  138. data/vendor/rkelly/test/test_equal_node.rb +8 -0
  139. data/vendor/rkelly/test/test_evaluation_visitor.rb +66 -0
  140. data/vendor/rkelly/test/test_expression_statement_node.rb +10 -0
  141. data/vendor/rkelly/test/test_false_node.rb +8 -0
  142. data/vendor/rkelly/test/test_for_in_node.rb +17 -0
  143. data/vendor/rkelly/test/test_for_node.rb +24 -0
  144. data/vendor/rkelly/test/test_function_body_node.rb +8 -0
  145. data/vendor/rkelly/test/test_function_call_node.rb +10 -0
  146. data/vendor/rkelly/test/test_function_decl_node.rb +16 -0
  147. data/vendor/rkelly/test/test_function_expr_node.rb +16 -0
  148. data/vendor/rkelly/test/test_function_visitor.rb +26 -0
  149. data/vendor/rkelly/test/test_getter_property_node.rb +10 -0
  150. data/vendor/rkelly/test/test_global_object.rb +49 -0
  151. data/vendor/rkelly/test/test_greater_node.rb +8 -0
  152. data/vendor/rkelly/test/test_greater_or_equal_node.rb +8 -0
  153. data/vendor/rkelly/test/test_if_node.rb +17 -0
  154. data/vendor/rkelly/test/test_in_node.rb +8 -0
  155. data/vendor/rkelly/test/test_instance_of_node.rb +8 -0
  156. data/vendor/rkelly/test/test_label_node.rb +13 -0
  157. data/vendor/rkelly/test/test_left_shift_node.rb +8 -0
  158. data/vendor/rkelly/test/test_less_node.rb +8 -0
  159. data/vendor/rkelly/test/test_less_or_equal_node.rb +8 -0
  160. data/vendor/rkelly/test/test_line_number.rb +23 -0
  161. data/vendor/rkelly/test/test_logical_and_node.rb +8 -0
  162. data/vendor/rkelly/test/test_logical_not_node.rb +8 -0
  163. data/vendor/rkelly/test/test_logical_or_node.rb +8 -0
  164. data/vendor/rkelly/test/test_modulus_node.rb +8 -0
  165. data/vendor/rkelly/test/test_multiply_node.rb +8 -0
  166. data/vendor/rkelly/test/test_new_expr_node.rb +9 -0
  167. data/vendor/rkelly/test/test_not_equal_node.rb +8 -0
  168. data/vendor/rkelly/test/test_not_strict_equal_node.rb +8 -0
  169. data/vendor/rkelly/test/test_null_node.rb +8 -0
  170. data/vendor/rkelly/test/test_number_node.rb +8 -0
  171. data/vendor/rkelly/test/test_object_literal_node.rb +9 -0
  172. data/vendor/rkelly/test/test_op_and_equal_node.rb +10 -0
  173. data/vendor/rkelly/test/test_op_divide_equal_node.rb +10 -0
  174. data/vendor/rkelly/test/test_op_equal_node.rb +10 -0
  175. data/vendor/rkelly/test/test_op_l_shift_equal_node.rb +10 -0
  176. data/vendor/rkelly/test/test_op_minus_equal_node.rb +10 -0
  177. data/vendor/rkelly/test/test_op_mod_equal_node.rb +10 -0
  178. data/vendor/rkelly/test/test_op_multiply_equal_node.rb +10 -0
  179. data/vendor/rkelly/test/test_op_or_equal_node.rb +10 -0
  180. data/vendor/rkelly/test/test_op_plus_equal_node.rb +10 -0
  181. data/vendor/rkelly/test/test_op_r_shift_equal_node.rb +10 -0
  182. data/vendor/rkelly/test/test_op_u_r_shift_equal_node.rb +10 -0
  183. data/vendor/rkelly/test/test_op_x_or_equal_node.rb +10 -0
  184. data/vendor/rkelly/test/test_parameter_node.rb +8 -0
  185. data/vendor/rkelly/test/test_parser.rb +1361 -0
  186. data/vendor/rkelly/test/test_pointcut_visitor.rb +34 -0
  187. data/vendor/rkelly/test/test_postfix_node.rb +8 -0
  188. data/vendor/rkelly/test/test_prefix_node.rb +8 -0
  189. data/vendor/rkelly/test/test_property_node.rb +8 -0
  190. data/vendor/rkelly/test/test_regexp_node.rb +8 -0
  191. data/vendor/rkelly/test/test_resolve_node.rb +22 -0
  192. data/vendor/rkelly/test/test_return_node.rb +11 -0
  193. data/vendor/rkelly/test/test_right_shift_node.rb +8 -0
  194. data/vendor/rkelly/test/test_rkelly.rb +19 -0
  195. data/vendor/rkelly/test/test_runtime.rb +12 -0
  196. data/vendor/rkelly/test/test_scope_chain.rb +50 -0
  197. data/vendor/rkelly/test/test_setter_property_node.rb +10 -0
  198. data/vendor/rkelly/test/test_source_elements.rb +9 -0
  199. data/vendor/rkelly/test/test_strict_equal_node.rb +8 -0
  200. data/vendor/rkelly/test/test_string_node.rb +8 -0
  201. data/vendor/rkelly/test/test_subtract_node.rb +8 -0
  202. data/vendor/rkelly/test/test_switch_node.rb +12 -0
  203. data/vendor/rkelly/test/test_this_node.rb +8 -0
  204. data/vendor/rkelly/test/test_throw_node.rb +7 -0
  205. data/vendor/rkelly/test/test_tokenizer.rb +148 -0
  206. data/vendor/rkelly/test/test_true_node.rb +8 -0
  207. data/vendor/rkelly/test/test_try_node.rb +59 -0
  208. data/vendor/rkelly/test/test_type_of_node.rb +8 -0
  209. data/vendor/rkelly/test/test_unary_minus_node.rb +8 -0
  210. data/vendor/rkelly/test/test_unary_plus_node.rb +8 -0
  211. data/vendor/rkelly/test/test_unsigned_right_shift_node.rb +8 -0
  212. data/vendor/rkelly/test/test_var_decl_node.rb +21 -0
  213. data/vendor/rkelly/test/test_var_statement_node.rb +14 -0
  214. data/vendor/rkelly/test/test_void_node.rb +8 -0
  215. data/vendor/rkelly/test/test_while_node.rb +15 -0
  216. data/vendor/rkelly/test/test_with_node.rb +8 -0
  217. metadata +271 -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