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 redo retry
forward_args forwarded_args
match_var match_nil_pattern empty_else
forward_arg lambda procarg0 __ENCODING__].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 rasgn mrasgn
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 find_pattern
index indexasgn].freeze
SECOND_CHILD_ONLY =
%i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
kwoptarg].freeze

Instance Method Summary collapse

Instance Method Details

#on_block(node) ⇒ Object


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

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


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

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

#on_casgn(node) ⇒ Object


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

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


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

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


76
77
78
79
80
# File 'lib/rubocop/ast/traversal.rb', line 76

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

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

#on_def(node) ⇒ Object


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

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


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

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


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

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


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

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


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

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


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

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


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

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