tenderlove-rkelly 0.0.0.20080909095845

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 (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