File: processor.rb

package info (click to toggle)
ruby-whitequark-parser 3.3.10.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,852 kB
  • sloc: yacc: 40,706; ruby: 20,588; makefile: 12; sh: 8
file content (293 lines) | stat: -rw-r--r-- 8,871 bytes parent folder | download | duplicates (2)
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
292
293
# frozen_string_literal: true

module Parser
  module AST

    ##
    # @api public
    #
    class Processor
      include ::AST::Processor::Mixin

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

      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_forwarded_restarg   process_regular_node
      alias on_forwarded_kwrestarg 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

      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_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_match_pattern           process_regular_node
      alias on_match_pattern_p         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
      alias on_find_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