rubocop-ast 1.4.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rubocop/ast.rb +2 -1
- data/lib/rubocop/ast/builder.rb +2 -1
- data/lib/rubocop/ast/node.rb +15 -0
- data/lib/rubocop/ast/node/case_match_node.rb +2 -2
- data/lib/rubocop/ast/node/dstr_node.rb +16 -0
- data/lib/rubocop/ast/node/in_pattern_node.rb +38 -0
- data/lib/rubocop/ast/node/mixin/descendence.rb +2 -6
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +27 -5
- data/lib/rubocop/ast/node/send_node.rb +1 -0
- data/lib/rubocop/ast/node_pattern.rb +1 -1
- data/lib/rubocop/ast/processed_source.rb +4 -1
- data/lib/rubocop/ast/version.rb +1 -1
- metadata +7 -6
- data/lib/rubocop/ast/ext/set.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25e84f96e233a9c966ad15efd834e109fea1c11d0998e2913ffd81310568d2b2
|
4
|
+
data.tar.gz: f6b8a033d2fd90518fb102f2cfaa27a5ef32bcfb892783ef79e2b9ad33ab4235
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 326d28041a4c30d64cac801ceec9677eea264c7a98754217ae27b026bf9779122803402cdddd8306881320e8ac185ce3ff708d4b6e2c869840622303b50b9ab1
|
7
|
+
data.tar.gz: 293b516ba03824c5c9fc56557943993688cf0796bd7ffe567434f7633ca71aa24aec8ebcac89284c3b7b9fb7d38302cf666b1e7b0bb844700d70bad8c65cc767
|
data/lib/rubocop/ast.rb
CHANGED
@@ -6,7 +6,6 @@ require 'set'
|
|
6
6
|
|
7
7
|
require_relative 'ast/ext/range'
|
8
8
|
require_relative 'ast/ext/range_min_max'
|
9
|
-
require_relative 'ast/ext/set'
|
10
9
|
require_relative 'ast/node_pattern/method_definer'
|
11
10
|
require_relative 'ast/node_pattern'
|
12
11
|
require_relative 'ast/node/mixin/descendence'
|
@@ -54,6 +53,7 @@ require_relative 'ast/node/forward_args_node'
|
|
54
53
|
require_relative 'ast/node/float_node'
|
55
54
|
require_relative 'ast/node/hash_node'
|
56
55
|
require_relative 'ast/node/if_node'
|
56
|
+
require_relative 'ast/node/in_pattern_node'
|
57
57
|
require_relative 'ast/node/index_node'
|
58
58
|
require_relative 'ast/node/indexasgn_node'
|
59
59
|
require_relative 'ast/node/int_node'
|
@@ -72,6 +72,7 @@ require_relative 'ast/node/return_node'
|
|
72
72
|
require_relative 'ast/node/self_class_node'
|
73
73
|
require_relative 'ast/node/send_node'
|
74
74
|
require_relative 'ast/node/str_node'
|
75
|
+
require_relative 'ast/node/dstr_node'
|
75
76
|
require_relative 'ast/node/super_node'
|
76
77
|
require_relative 'ast/node/symbol_node'
|
77
78
|
require_relative 'ast/node/until_node'
|
data/lib/rubocop/ast/builder.rb
CHANGED
@@ -42,12 +42,14 @@ module RuboCop
|
|
42
42
|
def: DefNode,
|
43
43
|
defined?: DefinedNode,
|
44
44
|
defs: DefNode,
|
45
|
+
dstr: DstrNode,
|
45
46
|
ensure: EnsureNode,
|
46
47
|
for: ForNode,
|
47
48
|
forward_args: ForwardArgsNode,
|
48
49
|
float: FloatNode,
|
49
50
|
hash: HashNode,
|
50
51
|
if: IfNode,
|
52
|
+
in_pattern: InPatternNode,
|
51
53
|
int: IntNode,
|
52
54
|
index: IndexNode,
|
53
55
|
indexasgn: IndexasgnNode,
|
@@ -68,7 +70,6 @@ module RuboCop
|
|
68
70
|
csend: SendNode,
|
69
71
|
send: SendNode,
|
70
72
|
str: StrNode,
|
71
|
-
dstr: StrNode,
|
72
73
|
xstr: StrNode,
|
73
74
|
sclass: SelfClassNode,
|
74
75
|
super: SuperNode,
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -272,10 +272,12 @@ module RuboCop
|
|
272
272
|
|
273
273
|
## Destructuring
|
274
274
|
|
275
|
+
# @!method receiver(node = self)
|
275
276
|
def_node_matcher :receiver, <<~PATTERN
|
276
277
|
{(send $_ ...) ({block numblock} (send $_ ...) ...)}
|
277
278
|
PATTERN
|
278
279
|
|
280
|
+
# @!method str_content(node = self)
|
279
281
|
def_node_matcher :str_content, '(str $_)'
|
280
282
|
|
281
283
|
def const_name
|
@@ -289,6 +291,7 @@ module RuboCop
|
|
289
291
|
end
|
290
292
|
end
|
291
293
|
|
294
|
+
# @!method defined_module0(node = self)
|
292
295
|
def_node_matcher :defined_module0, <<~PATTERN
|
293
296
|
{(class (const $_ $_) ...)
|
294
297
|
(module (const $_ $_) ...)
|
@@ -334,6 +337,7 @@ module RuboCop
|
|
334
337
|
end
|
335
338
|
|
336
339
|
# Some cops treat the shovel operator as a kind of assignment.
|
340
|
+
# @!method assignment_or_similar?(node = self)
|
337
341
|
def_node_matcher :assignment_or_similar?, <<~PATTERN
|
338
342
|
{assignment? (send _recv :<< ...)}
|
339
343
|
PATTERN
|
@@ -469,37 +473,47 @@ module RuboCop
|
|
469
473
|
node.match_guard_clause?
|
470
474
|
end
|
471
475
|
|
476
|
+
# @!method match_guard_clause?(node = self)
|
472
477
|
def_node_matcher :match_guard_clause?, <<~PATTERN
|
473
478
|
[${(send nil? {:raise :fail} ...) return break next} single_line?]
|
474
479
|
PATTERN
|
475
480
|
|
481
|
+
# @!method proc?(node = self)
|
476
482
|
def_node_matcher :proc?, <<~PATTERN
|
477
483
|
{(block (send nil? :proc) ...)
|
478
484
|
(block (send #global_const?(:Proc) :new) ...)
|
479
485
|
(send #global_const?(:Proc) :new)}
|
480
486
|
PATTERN
|
481
487
|
|
488
|
+
# @!method lambda?(node = self)
|
482
489
|
def_node_matcher :lambda?, '({block numblock} (send nil? :lambda) ...)'
|
490
|
+
|
491
|
+
# @!method lambda_or_proc?(node = self)
|
483
492
|
def_node_matcher :lambda_or_proc?, '{lambda? proc?}'
|
484
493
|
|
494
|
+
# @!method global_const?(node = self, name)
|
485
495
|
def_node_matcher :global_const?, '(const {nil? cbase} %1)'
|
486
496
|
|
497
|
+
# @!method class_constructor?(node = self)
|
487
498
|
def_node_matcher :class_constructor?, <<~PATTERN
|
488
499
|
{ (send #global_const?({:Class :Module :Struct}) :new ...)
|
489
500
|
(block (send #global_const?({:Class :Module :Struct}) :new ...) ...)}
|
490
501
|
PATTERN
|
491
502
|
|
492
503
|
# @deprecated Use `:class_constructor?`
|
504
|
+
# @!method struct_constructor?(node = self)
|
493
505
|
def_node_matcher :struct_constructor?, <<~PATTERN
|
494
506
|
(block (send #global_const?(:Struct) :new ...) _ $_)
|
495
507
|
PATTERN
|
496
508
|
|
509
|
+
# @!method class_definition?(node = self)
|
497
510
|
def_node_matcher :class_definition?, <<~PATTERN
|
498
511
|
{(class _ _ $_)
|
499
512
|
(sclass _ $_)
|
500
513
|
(block (send #global_const?({:Struct :Class}) :new ...) _ $_)}
|
501
514
|
PATTERN
|
502
515
|
|
516
|
+
# @!method module_definition?(node = self)
|
503
517
|
def_node_matcher :module_definition?, <<~PATTERN
|
504
518
|
{(module _ $_)
|
505
519
|
(block (send #global_const?(:Module) :new ...) _ $_)}
|
@@ -633,6 +647,7 @@ module RuboCop
|
|
633
647
|
end
|
634
648
|
end
|
635
649
|
|
650
|
+
# @!method new_class_or_module_block?(node = self)
|
636
651
|
def_node_matcher :new_class_or_module_block?, <<~PATTERN
|
637
652
|
^(casgn _ _ (block (send (const _ {:Class :Module}) :new) ...))
|
638
653
|
PATTERN
|
@@ -24,9 +24,9 @@ module RuboCop
|
|
24
24
|
self
|
25
25
|
end
|
26
26
|
|
27
|
-
# Returns an array of all the
|
27
|
+
# Returns an array of all the `in` pattern branches in the `case` statement.
|
28
28
|
#
|
29
|
-
# @return [Array<
|
29
|
+
# @return [Array<InPatternNode>] an array of `in_pattern` nodes
|
30
30
|
def in_pattern_branches
|
31
31
|
node_parts[1...-1]
|
32
32
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `dstr` nodes. This will be used
|
6
|
+
# in place of a plain node when the builder constructs the AST, making
|
7
|
+
# its methods available to all `dstr` nodes within RuboCop.
|
8
|
+
class DstrNode < StrNode
|
9
|
+
def value
|
10
|
+
child_nodes.map do |child|
|
11
|
+
child.respond_to?(:value) ? child.value : child.source
|
12
|
+
end.join
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `in` nodes. This will be used in place of a plain
|
6
|
+
# node when the builder constructs the AST, making its methods available
|
7
|
+
# to all `in` nodes within RuboCop.
|
8
|
+
class InPatternNode < Node
|
9
|
+
# Returns a node of the pattern in the `in` branch.
|
10
|
+
#
|
11
|
+
# @return [Node] a pattern node
|
12
|
+
def pattern
|
13
|
+
node_parts.first
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the index of the `in` branch within the `case` statement.
|
17
|
+
#
|
18
|
+
# @return [Integer] the index of the `in` branch
|
19
|
+
def branch_index
|
20
|
+
parent.in_pattern_branches.index(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Checks whether the `in` node has a `then` keyword.
|
24
|
+
#
|
25
|
+
# @return [Boolean] whether the `in` node has a `then` keyword
|
26
|
+
def then?
|
27
|
+
loc.begin&.is?('then')
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the body of the `in` node.
|
31
|
+
#
|
32
|
+
# @return [Node, nil] the body of the `in` node
|
33
|
+
def body
|
34
|
+
node_parts[-1]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -13,13 +13,9 @@ module RuboCop
|
|
13
13
|
#
|
14
14
|
# @overload each_child_node
|
15
15
|
# Yield all nodes.
|
16
|
-
# @overload each_child_node(type)
|
17
|
-
# Yield only nodes matching the type.
|
18
|
-
# @param [Symbol] type a node type
|
19
|
-
# @overload each_child_node(type_a, type_b, ...)
|
16
|
+
# @overload each_child_node(type, ...)
|
20
17
|
# Yield only nodes matching any of the types.
|
21
|
-
# @param [Symbol]
|
22
|
-
# @param [Symbol] type_b a node type
|
18
|
+
# @param [Symbol] type a node type
|
23
19
|
# @yieldparam [Node] node each child node
|
24
20
|
# @return [self] if a block is given
|
25
21
|
# @return [Enumerator] if no block is given
|
@@ -165,16 +165,34 @@ module RuboCop
|
|
165
165
|
ARITHMETIC_OPERATORS.include?(method_name)
|
166
166
|
end
|
167
167
|
|
168
|
-
# Checks if this node is part of a chain of `def` modifiers.
|
168
|
+
# Checks if this node is part of a chain of `def` or `defs` modifiers.
|
169
169
|
#
|
170
170
|
# @example
|
171
171
|
#
|
172
172
|
# private def foo; end
|
173
173
|
#
|
174
|
-
# @return
|
175
|
-
|
176
|
-
|
177
|
-
|
174
|
+
# @return wether the `def|defs` node is a modifier or not.
|
175
|
+
# See also `def_modifier` that returns the node or `nil`
|
176
|
+
def def_modifier?(node = self)
|
177
|
+
!!def_modifier(node)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Checks if this node is part of a chain of `def` or `defs` modifiers.
|
181
|
+
#
|
182
|
+
# @example
|
183
|
+
#
|
184
|
+
# private def foo; end
|
185
|
+
#
|
186
|
+
# @return [Node | nil] returns the `def|defs` node this is a modifier for,
|
187
|
+
# or `nil` if it isn't a def modifier
|
188
|
+
def def_modifier(node = self)
|
189
|
+
arg = node.children[2]
|
190
|
+
|
191
|
+
return unless node.send_type? && node.receiver.nil? && arg.is_a?(::AST::Node)
|
192
|
+
|
193
|
+
return arg if arg.def_type? || arg.defs_type?
|
194
|
+
|
195
|
+
def_modifier(arg)
|
178
196
|
end
|
179
197
|
|
180
198
|
# Checks whether this is a lambda. Some versions of parser parses
|
@@ -224,6 +242,7 @@ module RuboCop
|
|
224
242
|
|
225
243
|
private
|
226
244
|
|
245
|
+
# @!method in_macro_scope?(node = self)
|
227
246
|
def_node_matcher :in_macro_scope?, <<~PATTERN
|
228
247
|
{
|
229
248
|
root? # Either a root node,
|
@@ -239,14 +258,17 @@ module RuboCop
|
|
239
258
|
}
|
240
259
|
PATTERN
|
241
260
|
|
261
|
+
# @!method adjacent_def_modifier?(node = self)
|
242
262
|
def_node_matcher :adjacent_def_modifier?, <<~PATTERN
|
243
263
|
(send nil? _ ({def defs} ...))
|
244
264
|
PATTERN
|
245
265
|
|
266
|
+
# @!method bare_access_modifier_declaration?(node = self)
|
246
267
|
def_node_matcher :bare_access_modifier_declaration?, <<~PATTERN
|
247
268
|
(send nil? {:public :protected :private :module_function})
|
248
269
|
PATTERN
|
249
270
|
|
271
|
+
# @!method non_bare_access_modifier_declaration?(node = self)
|
250
272
|
def_node_matcher :non_bare_access_modifier_declaration?, <<~PATTERN
|
251
273
|
(send nil? {:public :protected :private :module_function} _)
|
252
274
|
PATTERN
|
@@ -9,6 +9,7 @@ module RuboCop
|
|
9
9
|
include ParameterizedNode::RestArguments
|
10
10
|
include MethodDispatchNode
|
11
11
|
|
12
|
+
# @!method attribute_accessor?(node = self)
|
12
13
|
def_node_matcher :attribute_accessor?, <<~PATTERN
|
13
14
|
[(send nil? ${:attr_reader :attr_writer :attr_accessor :attr} $...)
|
14
15
|
(_ _ _ _ ...)]
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
28
28
|
module Macros
|
29
29
|
# Define a method which applies a pattern to an AST node
|
30
30
|
#
|
31
|
-
# The new method will return nil if the node does not match
|
31
|
+
# The new method will return nil if the node does not match.
|
32
32
|
# If the node matches, and a block is provided, the new method will
|
33
33
|
# yield to the block (passing any captures as block arguments).
|
34
34
|
# If the node matches, and no block is provided, the new method will
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
41
41
|
def ast_with_comments
|
42
42
|
return if !ast || !comments
|
43
43
|
|
44
|
-
@ast_with_comments ||= Parser::Source::Comment.
|
44
|
+
@ast_with_comments ||= Parser::Source::Comment.associate_by_identity(ast, comments)
|
45
45
|
end
|
46
46
|
|
47
47
|
# Returns the source lines, line break characters removed, excluding a
|
@@ -236,6 +236,9 @@ module RuboCop
|
|
236
236
|
when 2.8, 3.0
|
237
237
|
require 'parser/ruby30'
|
238
238
|
Parser::Ruby30
|
239
|
+
when 3.1
|
240
|
+
require 'parser/ruby31'
|
241
|
+
Parser::Ruby31
|
239
242
|
else
|
240
243
|
raise ArgumentError,
|
241
244
|
"RuboCop found unknown Ruby version: #{ruby_version.inspect}"
|
data/lib/rubocop/ast/version.rb
CHANGED
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: 1.
|
4
|
+
version: 1.7.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: 2021-
|
13
|
+
date: 2021-05-28 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parser
|
@@ -18,14 +18,14 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 3.0.1.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 3.0.1.1
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: bundler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,7 +61,6 @@ files:
|
|
61
61
|
- lib/rubocop/ast/builder.rb
|
62
62
|
- lib/rubocop/ast/ext/range.rb
|
63
63
|
- lib/rubocop/ast/ext/range_min_max.rb
|
64
|
-
- lib/rubocop/ast/ext/set.rb
|
65
64
|
- lib/rubocop/ast/node.rb
|
66
65
|
- lib/rubocop/ast/node/alias_node.rb
|
67
66
|
- lib/rubocop/ast/node/and_node.rb
|
@@ -76,12 +75,14 @@ files:
|
|
76
75
|
- lib/rubocop/ast/node/const_node.rb
|
77
76
|
- lib/rubocop/ast/node/def_node.rb
|
78
77
|
- lib/rubocop/ast/node/defined_node.rb
|
78
|
+
- lib/rubocop/ast/node/dstr_node.rb
|
79
79
|
- lib/rubocop/ast/node/ensure_node.rb
|
80
80
|
- lib/rubocop/ast/node/float_node.rb
|
81
81
|
- lib/rubocop/ast/node/for_node.rb
|
82
82
|
- lib/rubocop/ast/node/forward_args_node.rb
|
83
83
|
- lib/rubocop/ast/node/hash_node.rb
|
84
84
|
- lib/rubocop/ast/node/if_node.rb
|
85
|
+
- lib/rubocop/ast/node/in_pattern_node.rb
|
85
86
|
- lib/rubocop/ast/node/index_node.rb
|
86
87
|
- lib/rubocop/ast/node/indexasgn_node.rb
|
87
88
|
- lib/rubocop/ast/node/int_node.rb
|
@@ -161,7 +162,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
161
162
|
requirements:
|
162
163
|
- - ">="
|
163
164
|
- !ruby/object:Gem::Version
|
164
|
-
version: 2.
|
165
|
+
version: 2.5.0
|
165
166
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
167
|
requirements:
|
167
168
|
- - ">="
|