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 irange erange 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
- #on_block(node) ⇒ Object
- #on_case(node) ⇒ Object (also: #on_rescue, #on_resbody, #on_ensure, #on_for, #on_when)
- #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_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
148 149 150 151 152 153 154 155 |
# File 'lib/rubocop/ast/traversal.rb', line 148 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
157 158 159 160 161 162 |
# File 'lib/rubocop/ast/traversal.rb', line 157 def on_case(node) node.children.each do |child| send(:"on_#{child.type}", child) if child end nil end |
#on_casgn(node) ⇒ Object
71 72 73 74 75 76 77 78 |
# File 'lib/rubocop/ast/traversal.rb', line 71 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
80 81 82 83 84 85 86 87 88 89 |
# File 'lib/rubocop/ast/traversal.rb', line 80 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
66 67 68 69 |
# File 'lib/rubocop/ast/traversal.rb', line 66 def on_const(node) return unless (child = node.children[0]) send(:"on_#{child.type}", child) end |
#on_def(node) ⇒ Object
91 92 93 94 95 96 |
# File 'lib/rubocop/ast/traversal.rb', line 91 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
116 117 118 119 120 121 122 123 |
# File 'lib/rubocop/ast/traversal.rb', line 116 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
125 126 127 128 129 130 131 132 133 134 |
# File 'lib/rubocop/ast/traversal.rb', line 125 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
108 109 110 111 112 113 114 |
# File 'lib/rubocop/ast/traversal.rb', line 108 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
98 99 100 101 102 103 104 |
# File 'lib/rubocop/ast/traversal.rb', line 98 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
136 137 138 139 140 141 142 |
# File 'lib/rubocop/ast/traversal.rb', line 136 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 |
# File 'lib/rubocop/ast/traversal.rb', line 10 def walk(node) return if node.nil? send(:"on_#{node.type}", node) nil end |