Module: RuboCop::AST::Traversal

Included in:
Cop::Commissioner
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].freeze
ONE_CHILD_NODE =
%i[splat kwsplat block_pass not break next
preexe postexe match_current_line defined?
arg_expr].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].freeze
SECOND_CHILD_ONLY =
%i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
kwoptarg].freeze

Instance Method Summary collapse

Instance Method Details

#on_block(node) ⇒ Object



157
158
159
160
161
162
163
164
165
# File 'lib/rubocop/ast/traversal.rb', line 157

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_irange, on_erange



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

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

#on_casgn(node) ⇒ Object



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

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



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

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



67
68
69
70
71
# File 'lib/rubocop/ast/traversal.rb', line 67

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

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

#on_def(node) ⇒ Object



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

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



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

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



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

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_op_asgn(node) ⇒ Object



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

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



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

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



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

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



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

def walk(node)
  return if node.nil?

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