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
- #on_block(node) ⇒ Object
- #on_case(node) ⇒ Object (also: #on_rescue, #on_resbody, #on_ensure, #on_for, #on_when, #on_case_match, #on_in_pattern, #on_irange, #on_erange)
- #on_casgn(node) ⇒ Object
- #on_class(node) ⇒ Object
- #on_const(node) ⇒ Object
- #on_def(node) ⇒ Object
- #on_defs(node) ⇒ Object
- #on_if(node) ⇒ Object
- #on_numblock(node) ⇒ Object
- #on_op_asgn(node) ⇒ Object
- #on_send(node) ⇒ Object (also: #on_csend)
- #on_while(node) ⇒ Object (also: #on_until, #on_module, #on_sclass)
- #walk(node) ⇒ Object
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 |