rubocop-ast 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe900ddbeb79b1f5bc64a232c83261e6c947d95639886ecc727a14e928521d87
4
- data.tar.gz: d35cd600bbe5b2653e34c3726a7bd860130088dc30d21a4e3838fd1cc05f88db
3
+ metadata.gz: d9e5dc8ddfc947af0653c81c0579c18eba59551567d977dc3bf0a4ca4ea92d59
4
+ data.tar.gz: 4110b86811007a0a28e52c090f45b34449a0e3a6ede4cec97463052c1fb3a8a2
5
5
  SHA512:
6
- metadata.gz: bf280eb45f3b9e6554202cbfd57edb386a5736881251d9492190f29b5c539ac1ad3bf95f39c449cddcda318968e4f09019b70cbc703d3d59044721e5576dee5b
7
- data.tar.gz: 85344e01afb0f05836e63c50f7031249fffa2fd5bbf4e8fc8a09f16a05eecaeb339b65b15acc677340621c71955fc295408b7fbabbc24e8d365839700ec515a3
6
+ metadata.gz: 827480d8986177910eee3a5d7bebafd9eb169818d755d79c16f9d4a3f89ebcd486494f35f07fbf3e0f6ffcc2a82da74a86b0475504c79b4fb1de3b3ad732a78f
7
+ data.tar.gz: 6daa124ee67a95fbc6e91cf5cc0a1179e9aad6718fd8a3f9d54b48c5209b45ede07875e1becbdae84ee2106458bb23538fc144a8aefcc35e922204fcb4c30619
@@ -58,6 +58,11 @@ module RuboCop
58
58
  def receiver
59
59
  children[-4]
60
60
  end
61
+
62
+ # @return [Boolean] if the definition is without an `end` or not.
63
+ def endless?
64
+ !loc.end
65
+ end
61
66
  end
62
67
  end
63
68
  end
@@ -43,7 +43,7 @@ module RuboCop
43
43
 
44
44
  # Result of a NodePattern run against a particular AST
45
45
  # Consider constructor is private
46
- Result = Struct.new(:colorizer, :trace, :returned, :ruby_ast) do # rubocop:disable Metrics/BlockLength
46
+ Result = Struct.new(:colorizer, :trace, :returned, :ruby_ast) do
47
47
  # @return [String] a Rainbow colorized version of ruby
48
48
  def colorize(color_scheme = COLOR_SCHEME)
49
49
  map = color_map(color_scheme)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # DO NOT MODIFY!!!!
4
- # This file is automatically generated by Racc 1.5.0
4
+ # This file is automatically generated by Racc 1.4.16
5
5
  # from Racc grammar file "".
6
6
  #
7
7
 
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Metrics/ModuleLength
4
3
  module RuboCop
5
4
  module AST
6
5
  # Provides methods for traversing an AST.
@@ -8,198 +7,175 @@ module RuboCop
8
7
  # Override methods to perform custom processing. Remember to call `super`
9
8
  # if you want to recursively process descendant nodes.
10
9
  module Traversal
10
+ # Only for debugging.
11
+ # @api private
12
+ class DebugError < RuntimeError
13
+ end
14
+
15
+ TYPE_TO_METHOD = Hash.new { |h, type| h[type] = :"on_#{type}" }
16
+
11
17
  def walk(node)
12
18
  return if node.nil?
13
19
 
14
- send(:"on_#{node.type}", node)
20
+ send(TYPE_TO_METHOD[node.type], node)
15
21
  nil
16
22
  end
17
23
 
18
- NO_CHILD_NODES = %i[true false nil int float complex
19
- rational str sym regopt self lvar
20
- ivar cvar gvar nth_ref back_ref cbase
21
- arg restarg blockarg shadowarg
22
- kwrestarg zsuper redo retry
23
- forward_args forwarded_args
24
- match_var match_nil_pattern empty_else
25
- forward_arg lambda procarg0 __ENCODING__].freeze
26
- ONE_CHILD_NODE = %i[splat kwsplat block_pass not break next
27
- preexe postexe match_current_line defined?
28
- arg_expr pin match_rest if_guard unless_guard
29
- match_with_trailing_comma].freeze
30
- MANY_CHILD_NODES = %i[dstr dsym xstr regexp array hash pair
31
- mlhs masgn or_asgn and_asgn rasgn mrasgn
32
- undef alias args super yield or and
33
- while_post until_post iflipflop eflipflop
34
- match_with_lvasgn begin kwbegin return
35
- in_match match_alt
36
- match_as array_pattern array_pattern_with_tail
37
- hash_pattern const_pattern find_pattern
38
- index indexasgn].freeze
39
- SECOND_CHILD_ONLY = %i[lvasgn ivasgn cvasgn gvasgn optarg kwarg
40
- kwoptarg].freeze
41
- private_constant :NO_CHILD_NODES, :ONE_CHILD_NODE, :MANY_CHILD_NODES, :SECOND_CHILD_ONLY
42
-
43
- NO_CHILD_NODES.each do |type|
44
- module_eval("def on_#{type}(node); end", __FILE__, __LINE__)
45
- end
46
-
47
- ONE_CHILD_NODE.each do |type|
48
- module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
49
- def on_#{type}(node)
50
- if (child = node.children[0])
51
- send(:"on_\#{child.type}", child)
24
+ # @api private
25
+ module CallbackCompiler
26
+ SEND = 'send(TYPE_TO_METHOD[child.type], child)'
27
+ assign_code = 'child = node.children[%<index>i]'
28
+ code = "#{assign_code}\n#{SEND}"
29
+ TEMPLATE = {
30
+ skip: '',
31
+ always: code,
32
+ nil?: "#{code} if child"
33
+ }.freeze
34
+
35
+ def def_callback(type, *signature,
36
+ arity: signature.size..signature.size,
37
+ arity_check: ENV['RUBOCOP_DEBUG'] && self.arity_check(arity),
38
+ body: self.body(signature, arity_check))
39
+ type, *aliases = type
40
+ lineno = caller_locations(1, 1).first.lineno
41
+ module_eval(<<~RUBY, __FILE__, lineno) # rubocop:disable Style/EvalWithLocation
42
+ def on_#{type}(node)
43
+ #{body}
44
+ nil
52
45
  end
46
+ RUBY
47
+ aliases.each do |m|
48
+ alias_method "on_#{m}", "on_#{type}"
53
49
  end
54
- RUBY
55
- end
56
-
57
- MANY_CHILD_NODES.each do |type|
58
- module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
59
- def on_#{type}(node)
60
- node.children.each { |child| send(:"on_\#{child.type}", child) }
61
- nil
62
- end
63
- RUBY
64
- end
50
+ end
65
51
 
66
- SECOND_CHILD_ONLY.each do |type|
67
- # Guard clause is for nodes nested within mlhs
68
- module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
69
- def on_#{type}(node)
70
- if (child = node.children[1])
71
- send(:"on_\#{child.type}", child)
52
+ def body(signature, prelude)
53
+ signature
54
+ .map.with_index do |arg, i|
55
+ TEMPLATE[arg].gsub('%<index>i', i.to_s)
72
56
  end
73
- end
74
- RUBY
75
- end
76
-
77
- def on_const(node)
78
- return unless (child = node.children[0])
79
-
80
- send(:"on_#{child.type}", child)
81
- end
82
-
83
- def on_casgn(node)
84
- children = node.children
85
- if (child = children[0]) # always const???
86
- send(:"on_#{child.type}", child)
57
+ .unshift(prelude)
58
+ .join("\n")
87
59
  end
88
- return unless (child = children[2])
89
-
90
- send(:"on_#{child.type}", child)
91
- end
92
60
 
93
- def on_class(node)
94
- children = node.children
95
- child = children[0] # always const???
96
- send(:"on_#{child.type}", child)
97
- if (child = children[1])
98
- send(:"on_#{child.type}", child)
61
+ def arity_check(range)
62
+ <<~RUBY
63
+ n = node.children.size
64
+ raise DebugError, [
65
+ 'Expected #{range} children, got',
66
+ n, 'for', node.inspect
67
+ ].join(' ') unless (#{range}).cover?(node.children.size)
68
+ RUBY
99
69
  end
100
- return unless (child = children[2])
101
-
102
- send(:"on_#{child.type}", child)
103
- end
104
-
105
- def on_def(node)
106
- children = node.children
107
- on_args(children[1])
108
- return unless (child = children[2])
109
-
110
- send(:"on_#{child.type}", child)
111
70
  end
112
-
113
- def on_send(node)
71
+ private_constant :CallbackCompiler
72
+ extend CallbackCompiler
73
+ send_code = CallbackCompiler::SEND
74
+
75
+ ### arity == 0
76
+ no_children = %i[true false nil self cbase zsuper redo retry
77
+ forward_args forwarded_args match_nil_pattern
78
+ forward_arg lambda empty_else kwnilarg
79
+ __FILE__ __LINE__ __ENCODING__]
80
+
81
+ ### arity == 0..1
82
+ opt_symbol_child = %i[restarg kwrestarg]
83
+ opt_node_child = %i[splat kwsplat match_rest]
84
+
85
+ ### arity == 1
86
+ literal_child = %i[int float complex
87
+ rational str sym lvar
88
+ ivar cvar gvar nth_ref back_ref
89
+ arg blockarg shadowarg
90
+ kwarg match_var]
91
+
92
+ many_symbol_children = %i[regopt]
93
+
94
+ node_child = %i[block_pass not
95
+ match_current_line defined?
96
+ arg_expr pin if_guard unless_guard
97
+ match_with_trailing_comma]
98
+ node_or_nil_child = %i[preexe postexe]
99
+
100
+ NO_CHILD_NODES = (no_children + opt_symbol_child + literal_child).to_set.freeze
101
+ private_constant :NO_CHILD_NODES # Used by Commissioner
102
+
103
+ ### arity > 1
104
+ symbol_then_opt_node = %i[lvasgn ivasgn cvasgn gvasgn]
105
+ symbol_then_node_or_nil = %i[optarg kwoptarg]
106
+ node_then_opt_node = %i[while until module sclass]
107
+
108
+ ### variable arity
109
+ many_node_children = %i[dstr dsym xstr regexp array hash pair
110
+ mlhs masgn or_asgn and_asgn rasgn mrasgn
111
+ undef alias args super yield or and
112
+ while_post until_post iflipflop eflipflop
113
+ match_with_lvasgn begin kwbegin return
114
+ in_match match_alt break next
115
+ match_as array_pattern array_pattern_with_tail
116
+ hash_pattern const_pattern find_pattern
117
+ index indexasgn procarg0]
118
+ many_opt_node_children = %i[case rescue resbody ensure for when
119
+ case_match in_pattern irange erange]
120
+
121
+ ### Callbacks for above
122
+ def_callback no_children
123
+ def_callback opt_symbol_child, :skip, arity: 0..1
124
+ def_callback opt_node_child, :nil?, arity: 0..1
125
+
126
+ def_callback literal_child, :skip
127
+ def_callback node_child, :always
128
+ def_callback node_or_nil_child, :nil?
129
+
130
+ def_callback symbol_then_opt_node, :skip, :nil?, arity: 1..2
131
+ def_callback symbol_then_node_or_nil, :skip, :nil?
132
+ def_callback node_then_opt_node, :always, :nil?
133
+
134
+ def_callback many_symbol_children, :skip, arity_check: nil
135
+ def_callback many_node_children, body: <<~RUBY
136
+ node.children.each { |child| #{send_code} }
137
+ RUBY
138
+ def_callback many_opt_node_children,
139
+ body: <<~RUBY
140
+ node.children.each { |child| #{send_code} if child }
141
+ RUBY
142
+
143
+ ### Other particular cases
144
+ def_callback :const, :nil?, :skip
145
+ def_callback :casgn, :nil?, :skip, :nil?, arity: 2..3
146
+ def_callback :class, :always, :nil?, :nil?
147
+ def_callback :def, :skip, :always, :nil?
148
+ def_callback :op_asgn, :always, :skip, :always
149
+ def_callback :if, :always, :nil?, :nil?
150
+ def_callback :block, :always, :always, :nil?
151
+ def_callback :numblock, :always, :skip, :nil?
152
+ def_callback :defs, :always, :skip, :always, :nil?
153
+
154
+ def_callback %i[send csend], body: <<~RUBY
114
155
  node.children.each_with_index do |child, i|
115
156
  next if i == 1
116
157
 
117
- send(:"on_#{child.type}", child) if child
158
+ #{send_code} if child
118
159
  end
119
- nil
120
- end
121
-
122
- alias on_csend on_send
123
-
124
- def on_op_asgn(node)
125
- children = node.children
126
- child = children[0]
127
- send(:"on_#{child.type}", child)
128
- child = children[2]
129
- send(:"on_#{child.type}", child)
130
- end
131
-
132
- def on_defs(node)
133
- children = node.children
134
- child = children[0]
135
- send(:"on_#{child.type}", child)
136
- on_args(children[2])
137
- return unless (child = children[3])
138
-
139
- send(:"on_#{child.type}", child)
140
- end
141
-
142
- def on_if(node)
143
- children = node.children
144
- child = children[0]
145
- send(:"on_#{child.type}", child)
146
- if (child = children[1])
147
- send(:"on_#{child.type}", child)
148
- end
149
- return unless (child = children[2])
150
-
151
- send(:"on_#{child.type}", child)
152
- end
153
-
154
- def on_while(node)
155
- children = node.children
156
- child = children[0]
157
- send(:"on_#{child.type}", child)
158
- return unless (child = children[1])
159
-
160
- send(:"on_#{child.type}", child)
161
- end
162
-
163
- alias on_until on_while
164
- alias on_module on_while
165
- alias on_sclass on_while
166
-
167
- def on_block(node)
168
- children = node.children
169
- child = children[0]
170
- send(:"on_#{child.type}", child) # can be send, zsuper...
171
- on_args(children[1])
172
- return unless (child = children[2])
173
-
174
- send(:"on_#{child.type}", child)
175
- end
176
-
177
- def on_case(node)
160
+ RUBY
161
+
162
+ ### generic processing of any other node (forward compatibility)
163
+ defined = instance_methods(false)
164
+ .grep(/^on_/)
165
+ .map { |s| s.to_s[3..-1].to_sym } # :on_foo => :foo
166
+
167
+ to_define = ::Parser::Meta::NODE_TYPES.to_a
168
+ to_define -= defined
169
+ to_define -= %i[numargs ident] # transient
170
+ to_define -= %i[blockarg_expr restarg_expr] # obsolete
171
+ to_define -= %i[objc_kwarg objc_restarg objc_varargs] # mac_ruby
172
+ def_callback to_define, body: <<~RUBY
178
173
  node.children.each do |child|
179
- send(:"on_#{child.type}", child) if child
174
+ next unless child.class == Node
175
+ #{send_code}
180
176
  end
181
- nil
182
- end
183
-
184
- alias on_rescue on_case
185
- alias on_resbody on_case
186
- alias on_ensure on_case
187
- alias on_for on_case
188
- alias on_when on_case
189
- alias on_case_match on_case
190
- alias on_in_pattern on_case
191
- alias on_irange on_case
192
- alias on_erange on_case
193
-
194
- def on_numblock(node)
195
- children = node.children
196
- child = children[0]
197
- send(:"on_#{child.type}", child)
198
- return unless (child = children[2])
199
-
200
- send(:"on_#{child.type}", child)
201
- end
177
+ RUBY
178
+ MISSING = to_define if ENV['RUBOCOP_DEBUG']
202
179
  end
203
180
  end
204
181
  end
205
- # rubocop:enable Metrics/ModuleLength
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '0.7.1'
6
+ STRING = '0.8.0'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-ast
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-09-28 00:00:00.000000000 Z
13
+ date: 2020-10-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parser
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  requirements: []
168
- rubygems_version: 3.0.8
168
+ rubygems_version: 3.1.2
169
169
  signing_key:
170
170
  specification_version: 4
171
171
  summary: RuboCop tools to deal with Ruby code AST.