tenderlove-rkelly 0.0.0.20080909095845

Sign up to get free protection for your applications and to get access to all the features.
Files changed (196) hide show
  1. data/CHANGELOG.txt +7 -0
  2. data/Manifest.txt +197 -0
  3. data/README.txt +49 -0
  4. data/Rakefile +85 -0
  5. data/lib/parser.y +870 -0
  6. data/lib/rkelly.rb +8 -0
  7. data/lib/rkelly/constants.rb +3 -0
  8. data/lib/rkelly/js.rb +14 -0
  9. data/lib/rkelly/js/array.rb +15 -0
  10. data/lib/rkelly/js/base.rb +91 -0
  11. data/lib/rkelly/js/boolean.rb +21 -0
  12. data/lib/rkelly/js/function.rb +39 -0
  13. data/lib/rkelly/js/function_prototype.rb +15 -0
  14. data/lib/rkelly/js/global_object.rb +52 -0
  15. data/lib/rkelly/js/math.rb +10 -0
  16. data/lib/rkelly/js/nan.rb +18 -0
  17. data/lib/rkelly/js/number.rb +22 -0
  18. data/lib/rkelly/js/object.rb +30 -0
  19. data/lib/rkelly/js/object_prototype.rb +14 -0
  20. data/lib/rkelly/js/property.rb +20 -0
  21. data/lib/rkelly/js/scope.rb +6 -0
  22. data/lib/rkelly/js/string.rb +21 -0
  23. data/lib/rkelly/lexeme.rb +18 -0
  24. data/lib/rkelly/nodes.rb +5 -0
  25. data/lib/rkelly/nodes/binary_node.rb +18 -0
  26. data/lib/rkelly/nodes/bracket_accessor_node.rb +11 -0
  27. data/lib/rkelly/nodes/case_clause_node.rb +11 -0
  28. data/lib/rkelly/nodes/comma_node.rb +11 -0
  29. data/lib/rkelly/nodes/conditional_node.rb +11 -0
  30. data/lib/rkelly/nodes/dot_accessor_node.rb +11 -0
  31. data/lib/rkelly/nodes/for_in_node.rb +12 -0
  32. data/lib/rkelly/nodes/for_node.rb +13 -0
  33. data/lib/rkelly/nodes/function_call_node.rb +16 -0
  34. data/lib/rkelly/nodes/function_decl_node.rb +6 -0
  35. data/lib/rkelly/nodes/function_expr_node.rb +12 -0
  36. data/lib/rkelly/nodes/if_node.rb +12 -0
  37. data/lib/rkelly/nodes/label_node.rb +11 -0
  38. data/lib/rkelly/nodes/new_expr_node.rb +11 -0
  39. data/lib/rkelly/nodes/node.rb +80 -0
  40. data/lib/rkelly/nodes/not_strict_equal_node.rb +6 -0
  41. data/lib/rkelly/nodes/op_equal_node.rb +16 -0
  42. data/lib/rkelly/nodes/postfix_node.rb +11 -0
  43. data/lib/rkelly/nodes/prefix_node.rb +6 -0
  44. data/lib/rkelly/nodes/property_node.rb +13 -0
  45. data/lib/rkelly/nodes/resolve_node.rb +19 -0
  46. data/lib/rkelly/nodes/strict_equal_node.rb +6 -0
  47. data/lib/rkelly/nodes/try_node.rb +13 -0
  48. data/lib/rkelly/nodes/var_decl_node.rb +15 -0
  49. data/lib/rkelly/parser.rb +98 -0
  50. data/lib/rkelly/runtime.rb +36 -0
  51. data/lib/rkelly/runtime/ruby_function.rb +13 -0
  52. data/lib/rkelly/runtime/scope_chain.rb +57 -0
  53. data/lib/rkelly/token.rb +15 -0
  54. data/lib/rkelly/tokenizer.rb +122 -0
  55. data/lib/rkelly/visitable.rb +16 -0
  56. data/lib/rkelly/visitors.rb +4 -0
  57. data/lib/rkelly/visitors/dot_visitor.rb +228 -0
  58. data/lib/rkelly/visitors/ecma_visitor.rb +314 -0
  59. data/lib/rkelly/visitors/enumerable_visitor.rb +18 -0
  60. data/lib/rkelly/visitors/evaluation_visitor.rb +419 -0
  61. data/lib/rkelly/visitors/function_visitor.rb +46 -0
  62. data/lib/rkelly/visitors/pointcut_visitor.rb +18 -0
  63. data/lib/rkelly/visitors/sexp_visitor.rb +374 -0
  64. data/lib/rkelly/visitors/visitor.rb +136 -0
  65. data/test/ecma_script_test_case.rb +21 -0
  66. data/test/execute_test_case.rb +16 -0
  67. data/test/execution_contexts/test_10_1_3-1.rb +32 -0
  68. data/test/expressions/test_11_3_1.rb +64 -0
  69. data/test/expressions/test_11_3_2.rb +64 -0
  70. data/test/expressions/test_11_4_2.rb +13 -0
  71. data/test/expressions/test_11_4_3.rb +52 -0
  72. data/test/expressions/test_11_4_4.rb +68 -0
  73. data/test/expressions/test_11_4_5.rb +69 -0
  74. data/test/expressions/test_11_4_6.rb +88 -0
  75. data/test/expressions/test_11_4_8.rb +28 -0
  76. data/test/expressions/test_11_4_9.rb +103 -0
  77. data/test/expressions/test_11_5_1.rb +51 -0
  78. data/test/expressions/test_11_5_2.rb +80 -0
  79. data/test/expressions/test_11_5_3.rb +88 -0
  80. data/test/expressions/test_11_6_1-1.rb +19 -0
  81. data/test/expressions/test_11_9_1.rb +19 -0
  82. data/test/function/test_15_3_1_1-1.rb +34 -0
  83. data/test/global_object/test_15_1_1_1.rb +29 -0
  84. data/test/global_object/test_15_1_1_2.rb +17 -0
  85. data/test/global_object/test_15_1_1_3.rb +9 -0
  86. data/test/helper.rb +5 -0
  87. data/test/node_test_case.rb +11 -0
  88. data/test/object/test_15_2_1_1.rb +257 -0
  89. data/test/object/test_15_2_1_2.rb +21 -0
  90. data/test/object/test_15_2_2_1.rb +52 -0
  91. data/test/statements/test_12_5-1.rb +27 -0
  92. data/test/test_add_node.rb +8 -0
  93. data/test/test_arguments_node.rb +8 -0
  94. data/test/test_array_node.rb +9 -0
  95. data/test/test_assign_expr_node.rb +8 -0
  96. data/test/test_automatic_semicolon_insertion.rb +137 -0
  97. data/test/test_bit_and_node.rb +8 -0
  98. data/test/test_bit_or_node.rb +8 -0
  99. data/test/test_bit_x_or_node.rb +8 -0
  100. data/test/test_bitwise_not_node.rb +8 -0
  101. data/test/test_block_node.rb +14 -0
  102. data/test/test_bracket_accessor_node.rb +16 -0
  103. data/test/test_break_node.rb +11 -0
  104. data/test/test_case_block_node.rb +11 -0
  105. data/test/test_case_clause_node.rb +15 -0
  106. data/test/test_comma_node.rb +13 -0
  107. data/test/test_comments.rb +44 -0
  108. data/test/test_conditional_node.rb +17 -0
  109. data/test/test_const_statement_node.rb +14 -0
  110. data/test/test_continue_node.rb +11 -0
  111. data/test/test_delete_node.rb +8 -0
  112. data/test/test_divide_node.rb +8 -0
  113. data/test/test_do_while_node.rb +13 -0
  114. data/test/test_dot_accessor_node.rb +9 -0
  115. data/test/test_ecma_visitor.rb +192 -0
  116. data/test/test_element_node.rb +8 -0
  117. data/test/test_empty_statement_node.rb +8 -0
  118. data/test/test_equal_node.rb +8 -0
  119. data/test/test_evaluation_visitor.rb +66 -0
  120. data/test/test_expression_statement_node.rb +10 -0
  121. data/test/test_false_node.rb +8 -0
  122. data/test/test_for_in_node.rb +17 -0
  123. data/test/test_for_node.rb +24 -0
  124. data/test/test_function_body_node.rb +8 -0
  125. data/test/test_function_call_node.rb +10 -0
  126. data/test/test_function_decl_node.rb +16 -0
  127. data/test/test_function_expr_node.rb +16 -0
  128. data/test/test_function_visitor.rb +26 -0
  129. data/test/test_getter_property_node.rb +10 -0
  130. data/test/test_global_object.rb +49 -0
  131. data/test/test_greater_node.rb +8 -0
  132. data/test/test_greater_or_equal_node.rb +8 -0
  133. data/test/test_if_node.rb +17 -0
  134. data/test/test_in_node.rb +8 -0
  135. data/test/test_instance_of_node.rb +8 -0
  136. data/test/test_label_node.rb +13 -0
  137. data/test/test_left_shift_node.rb +8 -0
  138. data/test/test_less_node.rb +8 -0
  139. data/test/test_less_or_equal_node.rb +8 -0
  140. data/test/test_line_number.rb +23 -0
  141. data/test/test_logical_and_node.rb +8 -0
  142. data/test/test_logical_not_node.rb +8 -0
  143. data/test/test_logical_or_node.rb +8 -0
  144. data/test/test_modulus_node.rb +8 -0
  145. data/test/test_multiply_node.rb +8 -0
  146. data/test/test_new_expr_node.rb +9 -0
  147. data/test/test_not_equal_node.rb +8 -0
  148. data/test/test_not_strict_equal_node.rb +8 -0
  149. data/test/test_null_node.rb +8 -0
  150. data/test/test_number_node.rb +8 -0
  151. data/test/test_object_literal_node.rb +9 -0
  152. data/test/test_op_and_equal_node.rb +10 -0
  153. data/test/test_op_divide_equal_node.rb +10 -0
  154. data/test/test_op_equal_node.rb +10 -0
  155. data/test/test_op_l_shift_equal_node.rb +10 -0
  156. data/test/test_op_minus_equal_node.rb +10 -0
  157. data/test/test_op_mod_equal_node.rb +10 -0
  158. data/test/test_op_multiply_equal_node.rb +10 -0
  159. data/test/test_op_or_equal_node.rb +10 -0
  160. data/test/test_op_plus_equal_node.rb +10 -0
  161. data/test/test_op_r_shift_equal_node.rb +10 -0
  162. data/test/test_op_u_r_shift_equal_node.rb +10 -0
  163. data/test/test_op_x_or_equal_node.rb +10 -0
  164. data/test/test_parameter_node.rb +8 -0
  165. data/test/test_parser.rb +1355 -0
  166. data/test/test_pointcut_visitor.rb +34 -0
  167. data/test/test_postfix_node.rb +8 -0
  168. data/test/test_prefix_node.rb +8 -0
  169. data/test/test_property_node.rb +8 -0
  170. data/test/test_regexp_node.rb +8 -0
  171. data/test/test_resolve_node.rb +22 -0
  172. data/test/test_return_node.rb +11 -0
  173. data/test/test_right_shift_node.rb +8 -0
  174. data/test/test_runtime.rb +12 -0
  175. data/test/test_scope_chain.rb +50 -0
  176. data/test/test_setter_property_node.rb +10 -0
  177. data/test/test_source_elements.rb +9 -0
  178. data/test/test_strict_equal_node.rb +8 -0
  179. data/test/test_string_node.rb +8 -0
  180. data/test/test_subtract_node.rb +8 -0
  181. data/test/test_switch_node.rb +12 -0
  182. data/test/test_this_node.rb +8 -0
  183. data/test/test_throw_node.rb +7 -0
  184. data/test/test_tokenizer.rb +143 -0
  185. data/test/test_true_node.rb +8 -0
  186. data/test/test_try_node.rb +59 -0
  187. data/test/test_type_of_node.rb +8 -0
  188. data/test/test_unary_minus_node.rb +8 -0
  189. data/test/test_unary_plus_node.rb +8 -0
  190. data/test/test_unsigned_right_shift_node.rb +8 -0
  191. data/test/test_var_decl_node.rb +21 -0
  192. data/test/test_var_statement_node.rb +14 -0
  193. data/test/test_void_node.rb +8 -0
  194. data/test/test_while_node.rb +15 -0
  195. data/test/test_with_node.rb +8 -0
  196. metadata +385 -0
@@ -0,0 +1,46 @@
1
+ module RKelly
2
+ module Visitors
3
+ class FunctionVisitor < Visitor
4
+ attr_reader :scope_chain
5
+ def initialize(scope)
6
+ super()
7
+ @scope_chain = scope
8
+ end
9
+
10
+ def visit_SourceElementsNode(o)
11
+ o.value.each { |x| x.accept(self) }
12
+ end
13
+
14
+ def visit_FunctionDeclNode(o)
15
+ if o.value
16
+ scope_chain[o.value].value = RKelly::JS::Function.new(o.function_body, o.arguments)
17
+ end
18
+ end
19
+
20
+ %w{
21
+ AddNode ArgumentsNode ArrayNode AssignExprNode BitAndNode BitOrNode
22
+ BitXOrNode BitwiseNotNode BlockNode BracketAccessorNode BreakNode
23
+ CaseBlockNode CaseClauseNode CommaNode ConditionalNode
24
+ ConstStatementNode ContinueNode DeleteNode DivideNode
25
+ DoWhileNode DotAccessorNode ElementNode EmptyStatementNode EqualNode
26
+ ExpressionStatementNode FalseNode ForInNode ForNode FunctionBodyNode
27
+ FunctionExprNode GetterPropertyNode GreaterNode GreaterOrEqualNode
28
+ IfNode InNode InstanceOfNode LabelNode LeftShiftNode LessNode
29
+ LessOrEqualNode LogicalAndNode LogicalNotNode LogicalOrNode ModulusNode
30
+ MultiplyNode NewExprNode NotEqualNode NotStrictEqualNode NullNode
31
+ NumberNode ObjectLiteralNode OpAndEqualNode OpDivideEqualNode
32
+ OpEqualNode OpLShiftEqualNode OpMinusEqualNode OpModEqualNode
33
+ OpMultiplyEqualNode OpOrEqualNode OpPlusEqualNode OpRShiftEqualNode
34
+ OpURShiftEqualNode OpXOrEqualNode ParameterNode PostfixNode PrefixNode
35
+ PropertyNode RegexpNode ResolveNode ReturnNode RightShiftNode
36
+ SetterPropertyNode StrictEqualNode StringNode
37
+ SubtractNode SwitchNode ThisNode ThrowNode TrueNode TryNode TypeOfNode
38
+ UnaryMinusNode UnaryPlusNode UnsignedRightShiftNode VarDeclNode
39
+ VarStatementNode VoidNode WhileNode WithNode
40
+ }.each do |type|
41
+ define_method(:"visit_#{type}") do |o|
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,18 @@
1
+ module RKelly
2
+ module Visitors
3
+ class PointcutVisitor < Visitor
4
+ attr_reader :matches
5
+ def initialize(pattern)
6
+ @pattern = pattern
7
+ @matches = []
8
+ end
9
+
10
+ ALL_NODES.each do |type|
11
+ define_method(:"visit_#{type}Node") do |o|
12
+ @matches << o if @pattern === o
13
+ super
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,374 @@
1
+ module RKelly
2
+ module Visitors
3
+ class SexpVisitor < Visitor
4
+ def visit_NumberNode(o)
5
+ [:lit, o.value]
6
+ end
7
+
8
+ def visit_RegexpNode(o)
9
+ [:lit, o.value]
10
+ end
11
+
12
+ def visit_AssignExprNode(o)
13
+ [:assign, super]
14
+ end
15
+
16
+ def visit_VarDeclNode(o)
17
+ [ o.constant? ? :const_decl : :var_decl,
18
+ o.name.to_sym, o.value ? super(o) : nil]
19
+ end
20
+
21
+ def visit_VarStatementNode(o)
22
+ [:var, super]
23
+ end
24
+
25
+ def visit_PostfixNode(o)
26
+ [:postfix, super, o.value]
27
+ end
28
+
29
+ def visit_PrefixNode(o)
30
+ [:prefix, super, o.value]
31
+ end
32
+
33
+ def visit_DeleteNode(o)
34
+ [:delete, super]
35
+ end
36
+
37
+ def visit_VoidNode(o)
38
+ [:void, super]
39
+ end
40
+
41
+ def visit_TypeOfNode(o)
42
+ [:typeof, super]
43
+ end
44
+
45
+ def visit_UnaryPlusNode(o)
46
+ [:u_plus, super]
47
+ end
48
+
49
+ def visit_UnaryMinusNode(o)
50
+ [:u_minus, super]
51
+ end
52
+
53
+ def visit_BitwiseNotNode(o)
54
+ [:bitwise_not, super]
55
+ end
56
+
57
+ def visit_LogicalNotNode(o)
58
+ [:not, super]
59
+ end
60
+
61
+ def visit_ConstStatementNode(o)
62
+ [:const, super]
63
+ end
64
+
65
+ def visit_MultiplyNode(o)
66
+ [:multiply, *super]
67
+ end
68
+
69
+ def visit_DivideNode(o)
70
+ [:divide, *super]
71
+ end
72
+
73
+ def visit_ModulusNode(o)
74
+ [:modulus, *super]
75
+ end
76
+
77
+ def visit_AddNode(o)
78
+ [:add, *super]
79
+ end
80
+
81
+ def visit_LeftShiftNode(o)
82
+ [:lshift, *super]
83
+ end
84
+
85
+ def visit_RightShiftNode(o)
86
+ [:rshift, *super]
87
+ end
88
+
89
+ def visit_UnsignedRightShiftNode(o)
90
+ [:urshift, *super]
91
+ end
92
+
93
+ def visit_SubtractNode(o)
94
+ [:subtract, *super]
95
+ end
96
+
97
+ def visit_LessNode(o)
98
+ [:less, *super]
99
+ end
100
+
101
+ def visit_GreaterNode(o)
102
+ [:greater, *super]
103
+ end
104
+
105
+ def visit_LessOrEqualNode(o)
106
+ [:less_or_equal, *super]
107
+ end
108
+
109
+ def visit_GreaterOrEqualNode(o)
110
+ [:greater_or_equal, *super]
111
+ end
112
+
113
+ def visit_InstanceOfNode(o)
114
+ [:instance_of, *super]
115
+ end
116
+
117
+ def visit_EqualNode(o)
118
+ [:equal, *super]
119
+ end
120
+
121
+ def visit_NotEqualNode(o)
122
+ [:not_equal, *super]
123
+ end
124
+
125
+ def visit_StrictEqualNode(o)
126
+ [:strict_equal, *super]
127
+ end
128
+
129
+ def visit_NotStrictEqualNode(o)
130
+ [:not_strict_equal, *super]
131
+ end
132
+
133
+ def visit_BitAndNode(o)
134
+ [:bit_and, *super]
135
+ end
136
+
137
+ def visit_BitOrNode(o)
138
+ [:bit_or, *super]
139
+ end
140
+
141
+ def visit_BitXOrNode(o)
142
+ [:bit_xor, *super]
143
+ end
144
+
145
+ def visit_LogicalAndNode(o)
146
+ [:and, *super]
147
+ end
148
+
149
+ def visit_LogicalOrNode(o)
150
+ [:or, *super]
151
+ end
152
+
153
+ def visit_InNode(o)
154
+ [:in, *super]
155
+ end
156
+
157
+ def visit_DoWhileNode(o)
158
+ [:do_while, *super]
159
+ end
160
+
161
+ def visit_WhileNode(o)
162
+ [:while, *super]
163
+ end
164
+
165
+ def visit_WithNode(o)
166
+ [:with, *super]
167
+ end
168
+
169
+ def visit_CaseClauseNode(o)
170
+ [:case, *super]
171
+ end
172
+
173
+ def visit_CaseBlockNode(o)
174
+ [:case_block, super]
175
+ end
176
+
177
+ def visit_SwitchNode(o)
178
+ [:switch, *super]
179
+ end
180
+
181
+ def visit_ForNode(o)
182
+ [ :for, *super]
183
+ end
184
+
185
+ def visit_BlockNode(o)
186
+ [:block, super]
187
+ end
188
+
189
+ def visit_IfNode(o)
190
+ [:if, *super].compact
191
+ end
192
+
193
+ def visit_ConditionalNode(o)
194
+ [:conditional, *super]
195
+ end
196
+
197
+ def visit_ForInNode(o)
198
+ [ :for_in, *super]
199
+ end
200
+
201
+ def visit_TryNode(o)
202
+ [ :try, *super]
203
+ end
204
+
205
+ def visit_EmptyStatementNode(o)
206
+ [:empty]
207
+ end
208
+
209
+ def visit_FunctionBodyNode(o)
210
+ [:func_body, super]
211
+ end
212
+
213
+ def visit_ResolveNode(o)
214
+ [:resolve, o.value]
215
+ end
216
+
217
+ def visit_BracketAccessorNode(o)
218
+ [:bracket_access, *super]
219
+ end
220
+
221
+ def visit_NewExprNode(o)
222
+ [:new_expr, *super]
223
+ end
224
+
225
+ def visit_ParameterNode(o)
226
+ [:param, o.value]
227
+ end
228
+
229
+ def visit_BreakNode(o)
230
+ [:break, o.value].compact
231
+ end
232
+
233
+ def visit_ContinueNode(o)
234
+ [:continue, o.value].compact
235
+ end
236
+
237
+ def visit_LabelNode(o)
238
+ [:label, o.name, super]
239
+ end
240
+
241
+ def visit_ThrowNode(o)
242
+ [:throw, super]
243
+ end
244
+
245
+ def visit_ObjectLiteralNode(o)
246
+ [:object, super]
247
+ end
248
+
249
+ def visit_PropertyNode(o)
250
+ [ :property, o.name, super ]
251
+ end
252
+
253
+ def visit_GetterPropertyNode(o)
254
+ [ :getter, o.name, super ]
255
+ end
256
+
257
+ def visit_SetterPropertyNode(o)
258
+ [ :setter, o.name, super ]
259
+ end
260
+
261
+ def visit_ElementNode(o)
262
+ [:element, super ]
263
+ end
264
+
265
+ def visit_ExpressionStatementNode(o)
266
+ [:expression, super ]
267
+ end
268
+
269
+ def visit_OpEqualNode(o)
270
+ [:op_equal, *super ]
271
+ end
272
+
273
+ def visit_OpPlusEqualNode(o)
274
+ [:op_plus_equal, *super ]
275
+ end
276
+
277
+ def visit_OpMinusEqualNode(o)
278
+ [:op_minus_equal, *super ]
279
+ end
280
+
281
+ def visit_OpMultiplyEqualNode(o)
282
+ [:op_multiply_equal, *super ]
283
+ end
284
+
285
+ def visit_OpDivideEqualNode(o)
286
+ [:op_divide_equal, *super]
287
+ end
288
+
289
+ def visit_OpLShiftEqualNode(o)
290
+ [:op_lshift_equal, *super ]
291
+ end
292
+
293
+ def visit_OpRShiftEqualNode(o)
294
+ [:op_rshift_equal, *super ]
295
+ end
296
+
297
+ def visit_OpURShiftEqualNode(o)
298
+ [:op_urshift_equal, *super ]
299
+ end
300
+
301
+ def visit_OpAndEqualNode(o)
302
+ [:op_and_equal, *super ]
303
+ end
304
+
305
+ def visit_OpXOrEqualNode(o)
306
+ [:op_xor_equal, *super ]
307
+ end
308
+
309
+ def visit_OpOrEqualNode(o)
310
+ [:op_or_equal, *super ]
311
+ end
312
+
313
+ def visit_OpModEqualNode(o)
314
+ [:op_mod_equal, *super]
315
+ end
316
+
317
+ def visit_CommaNode(o)
318
+ [:comma, *super]
319
+ end
320
+
321
+ def visit_FunctionCallNode(o)
322
+ [:function_call, *super]
323
+ end
324
+
325
+ def visit_ArrayNode(o)
326
+ [:array, super]
327
+ end
328
+
329
+ def visit_ThisNode(o)
330
+ [:this]
331
+ end
332
+
333
+ def visit_ReturnNode(o)
334
+ o.value ? [:return, super] : [:return]
335
+ end
336
+
337
+ def visit_FunctionExprNode(o)
338
+ [ :func_expr, *super]
339
+ end
340
+
341
+ def visit_FunctionDeclNode(o)
342
+ [ :func_decl, *super]
343
+ end
344
+
345
+ def visit_ArgumentsNode(o)
346
+ [:args, super]
347
+ end
348
+
349
+ def visit_DotAccessorNode(o)
350
+ [:dot_access,
351
+ super,
352
+ o.accessor
353
+ ]
354
+ end
355
+
356
+ def visit_NullNode(o)
357
+ [:nil]
358
+ end
359
+
360
+ def visit_StringNode(o)
361
+ [:str, o.value]
362
+ end
363
+
364
+ def visit_FalseNode(o)
365
+ [:false]
366
+ end
367
+
368
+ def visit_TrueNode(o)
369
+ [:true]
370
+ end
371
+
372
+ end
373
+ end
374
+ end
@@ -0,0 +1,136 @@
1
+ module RKelly
2
+ module Visitors
3
+ class Visitor
4
+ TERMINAL_NODES = %w{
5
+ Break Continue EmptyStatement False Null Number Parameter Regexp Resolve
6
+ String This True
7
+ }
8
+ SINGLE_VALUE_NODES = %w{
9
+ AssignExpr BitwiseNot Block Delete Element ExpressionStatement
10
+ FunctionBody LogicalNot Return Throw TypeOf UnaryMinus UnaryPlus Void
11
+ }
12
+ BINARY_NODES = %w{
13
+ Add BitAnd BitOr BitXOr CaseClause Comma Divide DoWhile Equal Greater
14
+ GreaterOrEqual In InstanceOf LeftShift Less LessOrEqual LogicalAnd
15
+ LogicalOr Modulus Multiply NotEqual NotStrictEqual OpAndEqual
16
+ OpDivideEqual OpEqual OpLShiftEqual OpMinusEqual OpModEqual
17
+ OpMultiplyEqual OpOrEqual OpPlusEqual OpRShiftEqual OpURShiftEqual
18
+ OpXOrEqual RightShift StrictEqual Subtract Switch UnsignedRightShift
19
+ While With
20
+ }
21
+ ARRAY_VALUE_NODES = %w{
22
+ Arguments Array CaseBlock ConstStatement ObjectLiteral SourceElements
23
+ VarStatement
24
+ }
25
+ NAME_VALUE_NODES = %w{
26
+ Label Property GetterProperty SetterProperty VarDecl
27
+ }
28
+ PREFIX_POSTFIX_NODES = %w{ Postfix Prefix }
29
+ CONDITIONAL_NODES = %w{ If Conditional }
30
+ FUNC_CALL_NODES = %w{ NewExpr FunctionCall }
31
+ FUNC_DECL_NODES = %w{ FunctionExpr FunctionDecl }
32
+ ALL_NODES = %w{ For ForIn Try BracketAccessor DotAcessor } +
33
+ TERMINAL_NODES + SINGLE_VALUE_NODES + BINARY_NODES + ARRAY_VALUE_NODES +
34
+ NAME_VALUE_NODES + PREFIX_POSTFIX_NODES + CONDITIONAL_NODES +
35
+ FUNC_CALL_NODES + FUNC_DECL_NODES
36
+
37
+ def accept(target)
38
+ target.accept(self)
39
+ end
40
+
41
+ TERMINAL_NODES.each do |type|
42
+ define_method(:"visit_#{type}Node") { |o| }
43
+ end
44
+
45
+ BINARY_NODES.each do |type|
46
+ define_method(:"visit_#{type}Node") do |o|
47
+ [o.left && o.left.accept(self), o.value && o.value.accept(self)]
48
+ end
49
+ end
50
+
51
+ ARRAY_VALUE_NODES.each do |type|
52
+ define_method(:"visit_#{type}Node") do |o|
53
+ o.value && o.value.map { |v| v ? v.accept(self) : nil }
54
+ end
55
+ end
56
+
57
+ NAME_VALUE_NODES.each do |type|
58
+ define_method(:"visit_#{type}Node") do |o|
59
+ return o.value ? o.value.accept(self) : nil
60
+ end
61
+ end
62
+
63
+ SINGLE_VALUE_NODES.each do |type|
64
+ define_method(:"visit_#{type}Node") do |o|
65
+ o.value.accept(self) if o.value
66
+ end
67
+ end
68
+
69
+ PREFIX_POSTFIX_NODES.each do |type|
70
+ define_method(:"visit_#{type}Node") do |o|
71
+ o.operand.accept(self)
72
+ end
73
+ end
74
+
75
+ CONDITIONAL_NODES.each do |type|
76
+ define_method(:"visit_#{type}Node") do |o|
77
+ [ o.conditions.accept(self),
78
+ o.value.accept(self),
79
+ o.else ? o.else.accept(self) : nil
80
+ ]
81
+ end
82
+ end
83
+ FUNC_CALL_NODES.each do |type|
84
+ define_method(:"visit_#{type}Node") do |o|
85
+ [o.value.accept(self), o.arguments.accept(self)]
86
+ end
87
+ end
88
+ FUNC_DECL_NODES.each do |type|
89
+ define_method(:"visit_#{type}Node") do |o|
90
+ [
91
+ o.value ? o.value : nil,
92
+ o.arguments.map { |x| x.accept(self) },
93
+ o.function_body.accept(self)
94
+ ]
95
+ end
96
+ end
97
+
98
+ def visit_ForNode(o)
99
+ [
100
+ o.init ? o.init.accept(self) : nil,
101
+ o.test ? o.test.accept(self) : nil,
102
+ o.counter ? o.counter.accept(self) : nil,
103
+ o.value.accept(self)
104
+ ]
105
+ end
106
+
107
+ def visit_ForInNode(o)
108
+ [
109
+ o.left.accept(self),
110
+ o.right.accept(self),
111
+ o.value.accept(self)
112
+ ]
113
+ end
114
+
115
+ def visit_TryNode(o)
116
+ [
117
+ o.value.accept(self),
118
+ o.catch_var ? o.catch_var : nil,
119
+ o.catch_block ? o.catch_block.accept(self) : nil,
120
+ o.finally_block ? o.finally_block.accept(self) : nil
121
+ ]
122
+ end
123
+
124
+ def visit_BracketAccessorNode(o)
125
+ [
126
+ o.value.accept(self),
127
+ o.accessor.accept(self)
128
+ ]
129
+ end
130
+
131
+ def visit_DotAccessorNode(o)
132
+ o.value.accept(self)
133
+ end
134
+ end
135
+ end
136
+ end