/
processor.rb
291 lines (235 loc) · 8.46 KB
/
processor.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
# frozen_string_literal: true
module Parser
module AST
##
# @api public
#
class Processor < ::AST::Processor
def process_regular_node(node)
node.updated(nil, process_all(node))
end
alias on_dstr process_regular_node
alias on_dsym process_regular_node
alias on_regexp process_regular_node
alias on_xstr process_regular_node
alias on_splat process_regular_node
alias on_kwsplat process_regular_node
alias on_array process_regular_node
alias on_pair process_regular_node
alias on_hash process_regular_node
alias on_irange process_regular_node
alias on_erange process_regular_node
def on_var(node)
node
end
# @private
def process_variable_node(node)
on_var(node)
end
alias on_lvar process_variable_node
alias on_ivar process_variable_node
alias on_gvar process_variable_node
alias on_cvar process_variable_node
alias on_back_ref process_variable_node
alias on_nth_ref process_variable_node
def on_vasgn(node)
name, value_node = *node
if !value_node.nil?
node.updated(nil, [
name, process(value_node)
])
else
node
end
end
# @private
def process_var_asgn_node(node)
on_vasgn(node)
end
alias on_lvasgn process_var_asgn_node
alias on_ivasgn process_var_asgn_node
alias on_gvasgn process_var_asgn_node
alias on_cvasgn process_var_asgn_node
alias on_and_asgn process_regular_node
alias on_or_asgn process_regular_node
def on_op_asgn(node)
var_node, method_name, value_node = *node
node.updated(nil, [
process(var_node), method_name, process(value_node)
])
end
alias on_mlhs process_regular_node
alias on_masgn process_regular_node
alias on_rasgn process_regular_node
alias on_mrasgn process_regular_node
def on_const(node)
scope_node, name = *node
node.updated(nil, [
process(scope_node), name
])
end
def on_casgn(node)
scope_node, name, value_node = *node
if !value_node.nil?
node.updated(nil, [
process(scope_node), name, process(value_node)
])
else
node.updated(nil, [
process(scope_node), name
])
end
end
alias on_args process_regular_node
def on_argument(node)
arg_name, value_node = *node
if !value_node.nil?
node.updated(nil, [
arg_name, process(value_node)
])
else
node
end
end
# @private
def process_argument_node(node)
on_argument(node)
end
alias on_arg process_argument_node
alias on_optarg process_argument_node
alias on_restarg process_argument_node
alias on_blockarg process_argument_node
alias on_shadowarg process_argument_node
alias on_kwarg process_argument_node
alias on_kwoptarg process_argument_node
alias on_kwrestarg process_argument_node
alias on_forward_arg process_argument_node
def on_procarg0(node)
if node.children[0].is_a?(Symbol)
# This branch gets executed when the builder
# is not configured to emit and 'arg' inside 'procarg0', i.e. when
# Parser::Builders::Default.emit_arg_inside_procarg0
# is set to false.
#
# If this flag is set to true this branch is unreachable.
# s(:procarg0, :a)
on_argument(node)
else
# s(:procarg0, s(:arg, :a), s(:arg, :b))
process_regular_node(node)
end
end
alias on_arg_expr process_regular_node
alias on_restarg_expr process_regular_node
alias on_blockarg_expr process_regular_node
alias on_block_pass process_regular_node
alias on_module process_regular_node
alias on_class process_regular_node
alias on_sclass process_regular_node
def on_def(node)
name, args_node, body_node = *node
node.updated(nil, [
name,
process(args_node), process(body_node)
])
end
alias on_def_e on_def
def on_defs(node)
definee_node, name, args_node, body_node = *node
node.updated(nil, [
process(definee_node), name,
process(args_node), process(body_node)
])
end
alias on_defs_e on_defs
alias on_undef process_regular_node
alias on_alias process_regular_node
def on_send(node)
receiver_node, method_name, *arg_nodes = *node
receiver_node = process(receiver_node) if receiver_node
node.updated(nil, [
receiver_node, method_name, *process_all(arg_nodes)
])
end
alias on_csend on_send
alias on_index process_regular_node
alias on_indexasgn process_regular_node
alias on_block process_regular_node
alias on_lambda process_regular_node
def on_numblock(node)
method_call, max_numparam, body = *node
node.updated(nil, [
process(method_call), max_numparam, process(body)
])
end
alias on_while process_regular_node
alias on_while_post process_regular_node
alias on_until process_regular_node
alias on_until_post process_regular_node
alias on_for process_regular_node
alias on_return process_regular_node
alias on_break process_regular_node
alias on_next process_regular_node
alias on_redo process_regular_node
alias on_retry process_regular_node
alias on_super process_regular_node
alias on_yield process_regular_node
alias on_defined? process_regular_node
alias on_not process_regular_node
alias on_and process_regular_node
alias on_or process_regular_node
alias on_if process_regular_node
alias on_when process_regular_node
alias on_case process_regular_node
alias on_iflipflop process_regular_node
alias on_eflipflop process_regular_node
alias on_match_current_line process_regular_node
alias on_match_with_lvasgn process_regular_node
alias on_resbody process_regular_node
alias on_rescue process_regular_node
alias on_ensure process_regular_node
alias on_begin process_regular_node
alias on_kwbegin process_regular_node
alias on_preexe process_regular_node
alias on_postexe process_regular_node
alias on_case_match process_regular_node
alias on_in_match process_regular_node
alias on_in_pattern process_regular_node
alias on_if_guard process_regular_node
alias on_unless_guard process_regular_node
alias on_match_var process_variable_node
alias on_match_rest process_regular_node
alias on_pin process_regular_node
alias on_match_alt process_regular_node
alias on_match_as process_regular_node
alias on_array_pattern process_regular_node
alias on_array_pattern_with_tail process_regular_node
alias on_hash_pattern process_regular_node
alias on_const_pattern process_regular_node
# @private
def process_variable_node(node)
warn 'Parser::AST::Processor#process_variable_node is deprecated as a' \
' public API and will be removed. Please use ' \
'Parser::AST::Processor#on_var instead.'
on_var(node)
end
# @private
def process_var_asgn_node(node)
warn 'Parser::AST::Processor#process_var_asgn_node is deprecated as a' \
' public API and will be removed. Please use ' \
'Parser::AST::Processor#on_vasgn instead.'
on_vasgn(node)
end
# @private
def process_argument_node(node)
warn 'Parser::AST::Processor#process_argument_node is deprecated as a' \
' public API and will be removed. Please use ' \
'Parser::AST::Processor#on_argument instead.'
on_argument(node)
end
def on_empty_else(node)
node
end
end
end
end