rubocop-ast 1.18.0 → 1.26.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rubocop/ast/builder.rb +1 -1
- data/lib/rubocop/ast/ext/range.rb +1 -1
- data/lib/rubocop/ast/node/csend_node.rb +14 -0
- data/lib/rubocop/ast/node/mixin/descendence.rb +7 -2
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +3 -3
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +9 -1
- data/lib/rubocop/ast/node/regexp_node.rb +6 -0
- data/lib/rubocop/ast/node/send_node.rb +4 -0
- data/lib/rubocop/ast/node/str_node.rb +4 -0
- data/lib/rubocop/ast/node.rb +26 -10
- data/lib/rubocop/ast/node_pattern/compiler/binding.rb +2 -2
- data/lib/rubocop/ast/node_pattern.rb +16 -16
- data/lib/rubocop/ast/processed_source.rb +6 -3
- data/lib/rubocop/ast/sexp.rb +2 -1
- data/lib/rubocop/ast/token.rb +15 -1
- data/lib/rubocop/ast/traversal.rb +2 -1
- data/lib/rubocop/ast/version.rb +1 -1
- data/lib/rubocop/ast.rb +3 -2
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bc10e7c795dab5de6b3af9e4256ac4312e5c3593dac55ac4bf290386813d8375
|
4
|
+
data.tar.gz: 4f5712401b5ce837a33b44a9e1e5061ca134fe794a04a9bdb46d7941564be73d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db2491014949e08395d008635c29a22d56b6495d020adc3ecc83071bf9f8614be7ff00088a69e82cc4add3ea118a71a28f3903ed3905012312191988cb61ec92
|
7
|
+
data.tar.gz: 7ba42b76e1fa3721ac7d41e83d9ad4a87ec214c02938af1b6f2162e80ec55a4706698bee254591cdf50c3467648a95d972ad615fc559f0e8669a8de64552aa83
|
data/lib/rubocop/ast/builder.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `csend` 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 `csend` nodes within RuboCop.
|
8
|
+
class CsendNode < SendNode
|
9
|
+
def send_type?
|
10
|
+
false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -36,7 +36,10 @@ module RuboCop
|
|
36
36
|
#
|
37
37
|
# @return [Array<Node>] an array of child nodes
|
38
38
|
def child_nodes
|
39
|
-
|
39
|
+
# Iterate child nodes directly to avoid allocating an Enumerator.
|
40
|
+
nodes = []
|
41
|
+
each_child_node { |node| nodes << node }
|
42
|
+
nodes
|
40
43
|
end
|
41
44
|
|
42
45
|
# Calls the given block for each descendant node with depth first order.
|
@@ -102,7 +105,9 @@ module RuboCop
|
|
102
105
|
protected
|
103
106
|
|
104
107
|
def visit_descendants(types, &block)
|
105
|
-
|
108
|
+
children.each do |child|
|
109
|
+
next unless child.is_a?(::AST::Node)
|
110
|
+
|
106
111
|
yield child if types.empty? || types.include?(child.type)
|
107
112
|
child.visit_descendants(types, &block)
|
108
113
|
end
|
@@ -211,7 +211,7 @@ module RuboCop
|
|
211
211
|
#
|
212
212
|
# @return [Boolean] whether this method is a lambda literal
|
213
213
|
def lambda_literal?
|
214
|
-
|
214
|
+
loc.expression.source == '->' && block_literal?
|
215
215
|
end
|
216
216
|
|
217
217
|
# Checks whether this is a unary operation.
|
@@ -233,7 +233,7 @@ module RuboCop
|
|
233
233
|
#
|
234
234
|
# foo + bar
|
235
235
|
#
|
236
|
-
# @return [
|
236
|
+
# @return [Boolean] whether this method is a binary operation
|
237
237
|
def binary_operation?
|
238
238
|
return false unless loc.selector
|
239
239
|
|
@@ -249,7 +249,7 @@ module RuboCop
|
|
249
249
|
^{ # or the parent is...
|
250
250
|
sclass class module class_constructor? # a class-like node
|
251
251
|
[ { # or some "wrapper"
|
252
|
-
kwbegin begin block
|
252
|
+
kwbegin begin block numblock
|
253
253
|
(if _condition <%0 _>) # note: we're excluding the condition of `if` nodes
|
254
254
|
}
|
255
255
|
#in_macro_scope? # that is itself in a macro scope
|
@@ -82,9 +82,17 @@ module RuboCop
|
|
82
82
|
# and optimizes other calls
|
83
83
|
module RestArguments
|
84
84
|
include ParameterizedNode
|
85
|
+
|
86
|
+
EMPTY_ARGUMENTS = [].freeze
|
87
|
+
|
85
88
|
# @return [Array<Node>] arguments, if any
|
86
89
|
def arguments
|
87
|
-
|
90
|
+
if arguments?
|
91
|
+
children.drop(first_argument_index).freeze
|
92
|
+
else
|
93
|
+
# Skip unneeded Array allocation.
|
94
|
+
EMPTY_ARGUMENTS
|
95
|
+
end
|
88
96
|
end
|
89
97
|
|
90
98
|
# A shorthand for getting the first argument of the node.
|
@@ -11,6 +11,7 @@ module RuboCop
|
|
11
11
|
i: Regexp::IGNORECASE,
|
12
12
|
m: Regexp::MULTILINE,
|
13
13
|
n: Regexp::NOENCODING,
|
14
|
+
u: Regexp::FIXEDENCODING,
|
14
15
|
o: 0
|
15
16
|
}.freeze
|
16
17
|
private_constant :OPTIONS
|
@@ -87,6 +88,11 @@ module RuboCop
|
|
87
88
|
regopt_include?(:n)
|
88
89
|
end
|
89
90
|
|
91
|
+
# @return [Bool] if regexp uses the fixed-encoding regopt
|
92
|
+
def fixed_encoding?
|
93
|
+
regopt_include?(:u)
|
94
|
+
end
|
95
|
+
|
90
96
|
private
|
91
97
|
|
92
98
|
def regopt_include?(option)
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -84,8 +84,12 @@ module RuboCop
|
|
84
84
|
LITERAL_RECURSIVE_TYPES = (OPERATOR_KEYWORDS + COMPOSITE_LITERALS + %i[begin pair]).freeze
|
85
85
|
private_constant :LITERAL_RECURSIVE_METHODS, :LITERAL_RECURSIVE_TYPES
|
86
86
|
|
87
|
+
EMPTY_CHILDREN = [].freeze
|
88
|
+
EMPTY_PROPERTIES = {}.freeze
|
89
|
+
private_constant :EMPTY_CHILDREN, :EMPTY_PROPERTIES
|
90
|
+
|
87
91
|
# @see https://www.rubydoc.info/gems/ast/AST/Node:initialize
|
88
|
-
def initialize(type, children =
|
92
|
+
def initialize(type, children = EMPTY_CHILDREN, properties = EMPTY_PROPERTIES)
|
89
93
|
@mutable_attributes = {}
|
90
94
|
|
91
95
|
# ::AST::Node#initialize freezes itself.
|
@@ -101,11 +105,19 @@ module RuboCop
|
|
101
105
|
end
|
102
106
|
end
|
103
107
|
|
104
|
-
Parser::Meta::NODE_TYPES.each do |node_type|
|
108
|
+
(Parser::Meta::NODE_TYPES - [:send]).each do |node_type|
|
105
109
|
method_name = "#{node_type.to_s.gsub(/\W/, '')}_type?"
|
106
|
-
|
107
|
-
|
108
|
-
|
110
|
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
111
|
+
def #{method_name} # def block_type?
|
112
|
+
@type == :#{node_type} # @type == :block
|
113
|
+
end # end
|
114
|
+
RUBY
|
115
|
+
end
|
116
|
+
|
117
|
+
# Most nodes are of 'send' type, so this method is defined
|
118
|
+
# separately to make this check as fast as possible.
|
119
|
+
def send_type?
|
120
|
+
false
|
109
121
|
end
|
110
122
|
|
111
123
|
# Returns the parent node, or `nil` if the receiver is a root node.
|
@@ -203,9 +215,7 @@ module RuboCop
|
|
203
215
|
# destructuring method.
|
204
216
|
#
|
205
217
|
# @return [Array<Node>] the different parts of the ndde
|
206
|
-
|
207
|
-
to_a
|
208
|
-
end
|
218
|
+
alias node_parts to_a
|
209
219
|
|
210
220
|
# Calls the given block for each ancestor node from parent to root.
|
211
221
|
# If no block is given, an `Enumerator` is returned.
|
@@ -500,8 +510,14 @@ module RuboCop
|
|
500
510
|
|
501
511
|
# @!method class_constructor?(node = self)
|
502
512
|
def_node_matcher :class_constructor?, <<~PATTERN
|
503
|
-
{
|
504
|
-
|
513
|
+
{
|
514
|
+
(send #global_const?({:Class :Module :Struct}) :new ...)
|
515
|
+
(send #global_const?(:Data) :define ...)
|
516
|
+
({block numblock} {
|
517
|
+
(send #global_const?({:Class :Module :Struct}) :new ...)
|
518
|
+
(send #global_const?(:Data) :define ...)
|
519
|
+
} ...)
|
520
|
+
}
|
505
521
|
PATTERN
|
506
522
|
|
507
523
|
# @deprecated Use `:class_constructor?`
|
@@ -20,8 +20,8 @@ module RuboCop
|
|
20
20
|
end
|
21
21
|
|
22
22
|
if var == :forbidden_unification
|
23
|
-
raise Invalid, "Wildcard #{name} was first seen in a subset of a" \
|
24
|
-
"
|
23
|
+
raise Invalid, "Wildcard #{name} was first seen in a subset of a " \
|
24
|
+
"union and can't be used outside that union"
|
25
25
|
end
|
26
26
|
var
|
27
27
|
end
|
@@ -54,6 +54,22 @@ module RuboCop
|
|
54
54
|
|
55
55
|
VAR = 'node'
|
56
56
|
|
57
|
+
# Yields its argument and any descendants, depth-first.
|
58
|
+
#
|
59
|
+
def self.descend(element, &block)
|
60
|
+
return to_enum(__method__, element) unless block
|
61
|
+
|
62
|
+
yield element
|
63
|
+
|
64
|
+
if element.is_a?(::RuboCop::AST::Node)
|
65
|
+
element.children.each do |child|
|
66
|
+
descend(child, &block)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
nil
|
71
|
+
end
|
72
|
+
|
57
73
|
attr_reader :pattern, :ast, :match_code
|
58
74
|
|
59
75
|
def_delegators :@compiler, :captures, :named_parameters, :positional_parameters
|
@@ -100,22 +116,6 @@ module RuboCop
|
|
100
116
|
initialize(coder['pattern'])
|
101
117
|
end
|
102
118
|
|
103
|
-
# Yields its argument and any descendants, depth-first.
|
104
|
-
#
|
105
|
-
def self.descend(element, &block)
|
106
|
-
return to_enum(__method__, element) unless block
|
107
|
-
|
108
|
-
yield element
|
109
|
-
|
110
|
-
if element.is_a?(::RuboCop::AST::Node)
|
111
|
-
element.children.each do |child|
|
112
|
-
descend(child, &block)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
nil
|
117
|
-
end
|
118
|
-
|
119
119
|
def freeze
|
120
120
|
@match_code.freeze
|
121
121
|
@compiler.freeze
|
@@ -12,6 +12,9 @@ module RuboCop
|
|
12
12
|
# @api private
|
13
13
|
STRING_SOURCE_NAME = '(string)'
|
14
14
|
|
15
|
+
INVALID_LEVELS = %i[error fatal].freeze
|
16
|
+
private_constant :INVALID_LEVELS
|
17
|
+
|
15
18
|
attr_reader :path, :buffer, :ast, :comments, :tokens, :diagnostics,
|
16
19
|
:parser_error, :raw_source, :ruby_version
|
17
20
|
|
@@ -20,9 +23,6 @@ module RuboCop
|
|
20
23
|
new(file, ruby_version, path)
|
21
24
|
end
|
22
25
|
|
23
|
-
INVALID_LEVELS = %i[error fatal].freeze
|
24
|
-
private_constant :INVALID_LEVELS
|
25
|
-
|
26
26
|
def initialize(source, ruby_version, path = nil)
|
27
27
|
# Defaults source encoding to UTF-8, regardless of the encoding it has
|
28
28
|
# been read with, which could be non-utf8 depending on the default
|
@@ -265,6 +265,9 @@ module RuboCop
|
|
265
265
|
when 3.2
|
266
266
|
require 'parser/ruby32'
|
267
267
|
Parser::Ruby32
|
268
|
+
when 3.3
|
269
|
+
require 'parser/ruby33'
|
270
|
+
Parser::Ruby33
|
268
271
|
else
|
269
272
|
raise ArgumentError,
|
270
273
|
"RuboCop found unknown Ruby version: #{ruby_version.inspect}"
|
data/lib/rubocop/ast/sexp.rb
CHANGED
data/lib/rubocop/ast/token.rb
CHANGED
@@ -4,6 +4,8 @@ module RuboCop
|
|
4
4
|
module AST
|
5
5
|
# A basic wrapper around Parser's tokens.
|
6
6
|
class Token
|
7
|
+
LEFT_PAREN_TYPES = %i[tLPAREN tLPAREN2].freeze
|
8
|
+
|
7
9
|
attr_reader :pos, :type, :text
|
8
10
|
|
9
11
|
def self.from_parser_token(parser_token)
|
@@ -89,7 +91,7 @@ module RuboCop
|
|
89
91
|
end
|
90
92
|
|
91
93
|
def left_parens?
|
92
|
-
|
94
|
+
LEFT_PAREN_TYPES.include?(type)
|
93
95
|
end
|
94
96
|
|
95
97
|
def right_parens?
|
@@ -100,6 +102,14 @@ module RuboCop
|
|
100
102
|
type == :tCOMMA
|
101
103
|
end
|
102
104
|
|
105
|
+
def dot?
|
106
|
+
type == :tDOT
|
107
|
+
end
|
108
|
+
|
109
|
+
def regexp_dots?
|
110
|
+
%i[tDOT2 tDOT3].include?(type)
|
111
|
+
end
|
112
|
+
|
103
113
|
def rescue_modifier?
|
104
114
|
type == :kRESCUE_MOD
|
105
115
|
end
|
@@ -111,6 +121,10 @@ module RuboCop
|
|
111
121
|
def equal_sign?
|
112
122
|
%i[tEQL tOP_ASGN].include?(type)
|
113
123
|
end
|
124
|
+
|
125
|
+
def new_line?
|
126
|
+
type == :tNL
|
127
|
+
end
|
114
128
|
end
|
115
129
|
end
|
116
130
|
end
|
@@ -75,7 +75,8 @@ module RuboCop
|
|
75
75
|
### arity == 0
|
76
76
|
no_children = %i[true false nil self cbase zsuper redo retry
|
77
77
|
forward_args forwarded_args match_nil_pattern
|
78
|
-
forward_arg
|
78
|
+
forward_arg forwarded_restarg forwarded_kwrestarg
|
79
|
+
lambda empty_else kwnilarg
|
79
80
|
__FILE__ __LINE__ __ENCODING__]
|
80
81
|
|
81
82
|
### arity == 0..1
|
data/lib/rubocop/ast/version.rb
CHANGED
data/lib/rubocop/ast.rb
CHANGED
@@ -76,6 +76,7 @@ require_relative 'ast/node/resbody_node'
|
|
76
76
|
require_relative 'ast/node/return_node'
|
77
77
|
require_relative 'ast/node/self_class_node'
|
78
78
|
require_relative 'ast/node/send_node'
|
79
|
+
require_relative 'ast/node/csend_node'
|
79
80
|
require_relative 'ast/node/str_node'
|
80
81
|
require_relative 'ast/node/dstr_node'
|
81
82
|
require_relative 'ast/node/super_node'
|
@@ -91,5 +92,5 @@ require_relative 'ast/token'
|
|
91
92
|
require_relative 'ast/traversal'
|
92
93
|
require_relative 'ast/version'
|
93
94
|
|
94
|
-
|
95
|
-
|
95
|
+
RuboCop::AST::NodePattern::Parser.autoload :WithMeta, "#{__dir__}/ast/node_pattern/with_meta"
|
96
|
+
RuboCop::AST::NodePattern::Compiler.autoload :Debug, "#{__dir__}/ast/node_pattern/compiler/debug"
|
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.26.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:
|
13
|
+
date: 2023-02-11 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: 3.
|
21
|
+
version: 3.2.1.0
|
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: 3.
|
28
|
+
version: 3.2.1.0
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
30
|
name: bundler
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
@@ -76,6 +76,7 @@ files:
|
|
76
76
|
- lib/rubocop/ast/node/casgn_node.rb
|
77
77
|
- lib/rubocop/ast/node/class_node.rb
|
78
78
|
- lib/rubocop/ast/node/const_node.rb
|
79
|
+
- lib/rubocop/ast/node/csend_node.rb
|
79
80
|
- lib/rubocop/ast/node/def_node.rb
|
80
81
|
- lib/rubocop/ast/node/defined_node.rb
|
81
82
|
- lib/rubocop/ast/node/dstr_node.rb
|
@@ -175,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
176
|
- !ruby/object:Gem::Version
|
176
177
|
version: '0'
|
177
178
|
requirements: []
|
178
|
-
rubygems_version: 3.
|
179
|
+
rubygems_version: 3.4.1
|
179
180
|
signing_key:
|
180
181
|
specification_version: 4
|
181
182
|
summary: RuboCop tools to deal with Ruby code AST.
|