Module: RuboCop::AST::Traversal

Defined in:
lib/rubocop/ast/traversal.rb

Overview

Provides methods for traversing an AST. Does not transform an AST; for that, use Parser::AST::Processor. Override methods to perform custom processing. Remember to call ‘super` if you want to recursively process descendant nodes.

Constant Summary collapse

NO_CHILD_NODES =
%i[true false nil int float complex
rational str sym regopt self lvar
ivar cvar gvar nth_ref back_ref cbase
arg restarg blockarg shadowarg
kwrestarg zsuper lambda redo retry
forward_args forwarded_args
match_var match_nil_pattern empty_else].freeze
ONE_CHILD_NODE =
%i[splat kwsplat block_pass not break next
preexe postexe match_current_line defined?
arg_expr pin match_rest if_guard unless_guard
match_with_trailing_comma].freeze
MANY_CHILD_NODES =
%i[dstr dsym xstr regexp array hash pair
mlhs masgn or_asgn and_asgn
undef alias args super yield or and
while_post until_post iflipflop eflipflop
match_with_lvasgn begin kwbegin return
in_match match_alt
match_as array_pattern array_pattern_with_tail
hash_pattern const_pattern].freeze
SECOND_CHILD_ONLY =
%i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
kwoptarg].freeze

Instance Method Summary collapse

Instance Method Details

#on_block(node) ⇒ Object



164
165
166
167
168
169
170
171
172
# File 'lib/rubocop/ast/traversal.rb', line 164

def on_block(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child) # can be send, zsuper...
  on_args(children[1])
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_case(node) ⇒ Object Also known as: on_rescue, on_resbody, on_ensure, on_for, on_when, on_case_match, on_in_pattern, on_irange, on_erange



174
175
176
177
178
179
# File 'lib/rubocop/ast/traversal.rb', line 174

def on_case(node)
  node.children.each do |child|
    send(:"on_#{child.type}", child) if child
  end
  nil
end

#on_casgn(node) ⇒ Object



80
81
82
83
84
85
86
87
88
# File 'lib/rubocop/ast/traversal.rb', line 80

def on_casgn(node)
  children = node.children
  if (child = children[0]) # always const???
    send(:"on_#{child.type}", child)
  end
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_class(node) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
# File 'lib/rubocop/ast/traversal.rb', line 90

def on_class(node)
  children = node.children
  child = children[0] # always const???
  send(:"on_#{child.type}", child)
  if (child = children[1])
    send(:"on_#{child.type}", child)
  end
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_const(node) ⇒ Object



74
75
76
77
78
# File 'lib/rubocop/ast/traversal.rb', line 74

def on_const(node)
  return unless (child = node.children[0])

  send(:"on_#{child.type}", child)
end

#on_def(node) ⇒ Object



102
103
104
105
106
107
108
# File 'lib/rubocop/ast/traversal.rb', line 102

def on_def(node)
  children = node.children
  on_args(children[1])
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_defs(node) ⇒ Object



129
130
131
132
133
134
135
136
137
# File 'lib/rubocop/ast/traversal.rb', line 129

def on_defs(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child)
  on_args(children[2])
  return unless (child = children[3])

  send(:"on_#{child.type}", child)
end

#on_if(node) ⇒ Object



139
140
141
142
143
144
145
146
147
148
149
# File 'lib/rubocop/ast/traversal.rb', line 139

def on_if(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child)
  if (child = children[1])
    send(:"on_#{child.type}", child)
  end
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_numblock(node) ⇒ Object



191
192
193
194
195
196
197
198
# File 'lib/rubocop/ast/traversal.rb', line 191

def on_numblock(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child)
  return unless (child = children[2])

  send(:"on_#{child.type}", child)
end

#on_op_asgn(node) ⇒ Object



121
122
123
124
125
126
127
# File 'lib/rubocop/ast/traversal.rb', line 121

def on_op_asgn(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child)
  child = children[2]
  send(:"on_#{child.type}", child)
end

#on_send(node) ⇒ Object Also known as: on_csend



110
111
112
113
114
115
116
117
# File 'lib/rubocop/ast/traversal.rb', line 110

def on_send(node)
  node.children.each_with_index do |child, i|
    next if i == 1

    send(:"on_#{child.type}", child) if child
  end
  nil
end

#on_while(node) ⇒ Object Also known as: on_until, on_module, on_sclass



151
152
153
154
155
156
157
158
# File 'lib/rubocop/ast/traversal.rb', line 151

def on_while(node)
  children = node.children
  child = children[0]
  send(:"on_#{child.type}", child)
  return unless (child = children[1])

  send(:"on_#{child.type}", child)
end

#walk(node) ⇒ Object



11
12
13
14
15
16
# File 'lib/rubocop/ast/traversal.rb', line 11

def walk(node)
  return if node.nil?

  send(:"on_#{node.type}", node)
  nil
end