rubocop-ast 1.0.1 → 1.4.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/README.md +3 -1
- data/lib/rubocop/ast.rb +3 -0
- data/lib/rubocop/ast/builder.rb +13 -1
- data/lib/rubocop/ast/ext/range_min_max.rb +18 -0
- data/lib/rubocop/ast/node.rb +6 -5
- data/lib/rubocop/ast/node/arg_node.rb +34 -0
- data/lib/rubocop/ast/node/args_node.rb +10 -0
- data/lib/rubocop/ast/node/array_node.rb +1 -1
- data/lib/rubocop/ast/node/block_node.rb +27 -0
- data/lib/rubocop/ast/node/case_match_node.rb +1 -1
- data/lib/rubocop/ast/node/case_node.rb +1 -1
- data/lib/rubocop/ast/node/const_node.rb +1 -1
- data/lib/rubocop/ast/node/hash_node.rb +2 -2
- data/lib/rubocop/ast/node/if_node.rb +14 -11
- data/lib/rubocop/ast/node/mixin/descendence.rb +2 -2
- data/lib/rubocop/ast/node/procarg0_node.rb +17 -0
- data/lib/rubocop/ast/node/regexp_node.rb +1 -1
- data/lib/rubocop/ast/node/when_node.rb +1 -1
- data/lib/rubocop/ast/node_pattern.rb +1 -1
- data/lib/rubocop/ast/node_pattern/compiler.rb +1 -1
- data/lib/rubocop/ast/node_pattern/compiler/sequence_subcompiler.rb +2 -2
- data/lib/rubocop/ast/node_pattern/lexer.rb +1 -1
- data/lib/rubocop/ast/node_pattern/lexer.rex +7 -4
- data/lib/rubocop/ast/node_pattern/lexer.rex.rb +7 -4
- data/lib/rubocop/ast/node_pattern/method_definer.rb +2 -0
- data/lib/rubocop/ast/node_pattern/node.rb +6 -21
- data/lib/rubocop/ast/node_pattern/parser.racc.rb +39 -39
- data/lib/rubocop/ast/traversal.rb +7 -6
- data/lib/rubocop/ast/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34e6f8d5799eb4f6871ac4666b174d020ca3131b801184b31324d7488abc64b8
|
4
|
+
data.tar.gz: f0be9d5375bc11ae205a2b6343aa2db37afdd330bbde6d22c82ee54b1d6ae03d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa8d27ca9cb6cb156f4a5cc1a951860fa2c04ef0cdf425c4ce2255825a08e664c0255e24c75495c66028f8aeadcf59f524b14b409c6d644129ff95e7a2c56194
|
7
|
+
data.tar.gz: 36c4874bf4e4dd2c8d076243ee08f670dcf17711ebced45f200f71dd720faf4cd1e119b9df491fcee140d33d94bc7ddc3fd88f8818665505702c24ac54e0b91e
|
data/README.md
CHANGED
@@ -35,7 +35,9 @@ See the [docs site](https://docs.rubocop.org/rubocop-ast) for more details.
|
|
35
35
|
|
36
36
|
### Parser compatibility switches
|
37
37
|
|
38
|
-
This gem, by default, uses most [legacy AST output from parser](https://github.com/whitequark/parser/#usage), except for
|
38
|
+
This gem, by default, uses most [legacy AST output from parser](https://github.com/whitequark/parser/#usage), except for the following which are set to `true`:
|
39
|
+
* `emit_forward_arg`
|
40
|
+
* `emit_match_pattern`
|
39
41
|
|
40
42
|
The main `RuboCop` gem uses these defaults (and is currently only compatible with these), but this gem can be used separately from `RuboCop` and is meant to be compatible with all settings. For example, to have `-> { ... }` emitted
|
41
43
|
as `LambdaNode` instead of `SendNode`:
|
data/lib/rubocop/ast.rb
CHANGED
@@ -5,6 +5,7 @@ require 'forwardable'
|
|
5
5
|
require 'set'
|
6
6
|
|
7
7
|
require_relative 'ast/ext/range'
|
8
|
+
require_relative 'ast/ext/range_min_max'
|
8
9
|
require_relative 'ast/ext/set'
|
9
10
|
require_relative 'ast/node_pattern/method_definer'
|
10
11
|
require_relative 'ast/node_pattern'
|
@@ -36,6 +37,7 @@ require_relative 'ast/node/mixin/predicate_operator_node'
|
|
36
37
|
require_relative 'ast/node/mixin/basic_literal_node'
|
37
38
|
require_relative 'ast/node/alias_node'
|
38
39
|
require_relative 'ast/node/and_node'
|
40
|
+
require_relative 'ast/node/arg_node'
|
39
41
|
require_relative 'ast/node/args_node'
|
40
42
|
require_relative 'ast/node/array_node'
|
41
43
|
require_relative 'ast/node/block_node'
|
@@ -61,6 +63,7 @@ require_relative 'ast/node/module_node'
|
|
61
63
|
require_relative 'ast/node/next_node'
|
62
64
|
require_relative 'ast/node/or_node'
|
63
65
|
require_relative 'ast/node/pair_node'
|
66
|
+
require_relative 'ast/node/procarg0_node'
|
64
67
|
require_relative 'ast/node/range_node'
|
65
68
|
require_relative 'ast/node/regexp_node'
|
66
69
|
require_relative 'ast/node/rescue_node'
|
data/lib/rubocop/ast/builder.rb
CHANGED
@@ -14,12 +14,22 @@ module RuboCop
|
|
14
14
|
# parser = Parser::Ruby25.new(builder)
|
15
15
|
# root_node = parser.parse(buffer)
|
16
16
|
class Builder < Parser::Builders::Default
|
17
|
-
self.emit_forward_arg = true
|
17
|
+
self.emit_forward_arg = true if respond_to?(:emit_forward_arg=)
|
18
|
+
self.emit_match_pattern = true if respond_to?(:emit_match_pattern=)
|
18
19
|
|
19
20
|
# @api private
|
20
21
|
NODE_MAP = {
|
21
22
|
and: AndNode,
|
22
23
|
alias: AliasNode,
|
24
|
+
arg: ArgNode,
|
25
|
+
blockarg: ArgNode,
|
26
|
+
forward_arg: ArgNode,
|
27
|
+
kwarg: ArgNode,
|
28
|
+
kwoptarg: ArgNode,
|
29
|
+
kwrestarg: ArgNode,
|
30
|
+
optarg: ArgNode,
|
31
|
+
restarg: ArgNode,
|
32
|
+
shadowarg: ArgNode,
|
23
33
|
args: ArgsNode,
|
24
34
|
array: ArrayNode,
|
25
35
|
block: BlockNode,
|
@@ -43,12 +53,14 @@ module RuboCop
|
|
43
53
|
indexasgn: IndexasgnNode,
|
44
54
|
irange: RangeNode,
|
45
55
|
erange: RangeNode,
|
56
|
+
kwargs: HashNode,
|
46
57
|
kwsplat: KeywordSplatNode,
|
47
58
|
lambda: LambdaNode,
|
48
59
|
module: ModuleNode,
|
49
60
|
next: NextNode,
|
50
61
|
or: OrNode,
|
51
62
|
pair: PairNode,
|
63
|
+
procarg0: Procarg0Node,
|
52
64
|
regexp: RegexpNode,
|
53
65
|
rescue: RescueNode,
|
54
66
|
resbody: ResbodyNode,
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
module Ext
|
6
|
+
# Refinement to circumvent broken `Range#minmax` for infinity ranges in 2.6-
|
7
|
+
module RangeMinMax
|
8
|
+
if ::Range.instance_method(:minmax).owner != ::Range
|
9
|
+
refine ::Range do
|
10
|
+
def minmax
|
11
|
+
[min, max]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
|
49
49
|
# @api private
|
50
50
|
EQUALS_ASSIGNMENTS = %i[lvasgn ivasgn cvasgn gvasgn
|
51
|
-
casgn masgn
|
51
|
+
casgn masgn].to_set.freeze
|
52
52
|
# @api private
|
53
53
|
SHORTHAND_ASSIGNMENTS = %i[op_asgn or_asgn and_asgn].to_set.freeze
|
54
54
|
# @api private
|
@@ -77,7 +77,8 @@ module RuboCop
|
|
77
77
|
# @api private
|
78
78
|
SPECIAL_KEYWORDS = %w[__FILE__ __LINE__ __ENCODING__].to_set.freeze
|
79
79
|
# @api private
|
80
|
-
ARGUMENT_TYPES = %i[arg optarg restarg kwarg kwoptarg kwrestarg
|
80
|
+
ARGUMENT_TYPES = %i[arg optarg restarg kwarg kwoptarg kwrestarg
|
81
|
+
blockarg forward_arg shadowarg].to_set.freeze
|
81
82
|
|
82
83
|
LITERAL_RECURSIVE_METHODS = (COMPARISON_OPERATORS + %i[* ! <=>]).freeze
|
83
84
|
LITERAL_RECURSIVE_TYPES = (OPERATOR_KEYWORDS + COMPOSITE_LITERALS + %i[begin pair]).freeze
|
@@ -222,7 +223,7 @@ module RuboCop
|
|
222
223
|
# @return [self] if a block is given
|
223
224
|
# @return [Enumerator] if no block is given
|
224
225
|
def each_ancestor(*types, &block)
|
225
|
-
return to_enum(__method__, *types) unless
|
226
|
+
return to_enum(__method__, *types) unless block
|
226
227
|
|
227
228
|
visit_ancestors(types, &block)
|
228
229
|
|
@@ -237,7 +238,7 @@ module RuboCop
|
|
237
238
|
each_ancestor.to_a
|
238
239
|
end
|
239
240
|
|
240
|
-
#
|
241
|
+
# NOTE: Some rare nodes may have no source, like `s(:args)` in `foo {}`
|
241
242
|
# @return [String, nil]
|
242
243
|
def source
|
243
244
|
loc.expression&.source
|
@@ -410,7 +411,7 @@ module RuboCop
|
|
410
411
|
POST_CONDITION_LOOP_TYPES.include?(type)
|
411
412
|
end
|
412
413
|
|
413
|
-
#
|
414
|
+
# NOTE: `loop { }` is a normal method call and thus not a loop keyword.
|
414
415
|
def loop_keyword?
|
415
416
|
LOOP_TYPES.include?(type)
|
416
417
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `arg`, `optarg`, `restarg`, `kwarg`, `kwoptarg`,
|
6
|
+
# `kwrestarg`, `blockarg`, `shadowarg` and `forward_arg` nodes.
|
7
|
+
# This will be used in place of a plain node when the builder constructs
|
8
|
+
# the AST, making its methods available to all `arg` nodes within RuboCop.
|
9
|
+
class ArgNode < Node
|
10
|
+
# Returns the name of an argument.
|
11
|
+
#
|
12
|
+
# @return [Symbol, nil] the name of the argument
|
13
|
+
def name
|
14
|
+
node_parts[0]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns the default value of the argument, if any.
|
18
|
+
#
|
19
|
+
# @return [Node, nil] the default value of the argument
|
20
|
+
def default_value
|
21
|
+
return unless default?
|
22
|
+
|
23
|
+
node_parts[1]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Checks whether the argument has a default value
|
27
|
+
#
|
28
|
+
# @return [Boolean] whether the argument has a default value
|
29
|
+
def default?
|
30
|
+
optarg_type? || kwoptarg_type?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -24,6 +24,16 @@ module RuboCop
|
|
24
24
|
def empty_and_without_delimiters?
|
25
25
|
loc.expression.nil?
|
26
26
|
end
|
27
|
+
|
28
|
+
# Yield each argument from the collection.
|
29
|
+
# Arguments can be inside `mlhs` nodes in the case of destructuring, so this
|
30
|
+
# flattens the collection to just `arg`, `optarg`, `restarg`, `kwarg`,
|
31
|
+
# `kwoptarg`, `kwrestarg`, `blockarg`, `forward_arg` and `shadowarg`.
|
32
|
+
#
|
33
|
+
# @return [Array<Node>] array of argument nodes.
|
34
|
+
def argument_list
|
35
|
+
each_descendant(*ARGUMENT_TYPES).to_a.freeze
|
36
|
+
end
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
@@ -22,6 +22,9 @@ module RuboCop
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# The arguments of this block.
|
25
|
+
# Note that if the block has destructured arguments, `arguments` will
|
26
|
+
# return a `mlhs` node, whereas `argument_list` will return only
|
27
|
+
# actual argument nodes.
|
25
28
|
#
|
26
29
|
# @return [Array<Node>]
|
27
30
|
def arguments
|
@@ -32,6 +35,18 @@ module RuboCop
|
|
32
35
|
end
|
33
36
|
end
|
34
37
|
|
38
|
+
# Returns a collection of all descendants of this node that are
|
39
|
+
# argument type nodes. See `ArgsNode#argument_list` for details.
|
40
|
+
#
|
41
|
+
# @return [Array<Node>]
|
42
|
+
def argument_list
|
43
|
+
if numblock_type?
|
44
|
+
numbered_arguments
|
45
|
+
else
|
46
|
+
arguments.argument_list
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
35
50
|
# The body of this block.
|
36
51
|
#
|
37
52
|
# @return [Node, nil] the body of the `block` node or `nil`
|
@@ -117,6 +132,18 @@ module RuboCop
|
|
117
132
|
def void_context?
|
118
133
|
VOID_CONTEXT_METHODS.include?(method_name)
|
119
134
|
end
|
135
|
+
|
136
|
+
private
|
137
|
+
|
138
|
+
# Numbered arguments of this `numblock`.
|
139
|
+
def numbered_arguments
|
140
|
+
return [].freeze unless numblock_type?
|
141
|
+
|
142
|
+
max_param = children[1]
|
143
|
+
1.upto(max_param).map do |i|
|
144
|
+
ArgNode.new(:arg, [:"_#{i}"])
|
145
|
+
end.freeze
|
146
|
+
end
|
120
147
|
end
|
121
148
|
end
|
122
149
|
end
|
@@ -17,7 +17,7 @@ module RuboCop
|
|
17
17
|
|
18
18
|
# @deprecated Use `in_pattern_branches.each`
|
19
19
|
def each_in_pattern(&block)
|
20
|
-
return in_pattern_branches.to_enum(__method__) unless
|
20
|
+
return in_pattern_branches.to_enum(__method__) unless block
|
21
21
|
|
22
22
|
in_pattern_branches.each(&block)
|
23
23
|
|
@@ -57,7 +57,7 @@ module RuboCop
|
|
57
57
|
# @return [self] if a block is given
|
58
58
|
# @return [Enumerator] if no block is given
|
59
59
|
def each_key(&block)
|
60
|
-
return pairs.map(&:key).to_enum unless
|
60
|
+
return pairs.map(&:key).to_enum unless block
|
61
61
|
|
62
62
|
pairs.map(&:key).each(&block)
|
63
63
|
|
@@ -81,7 +81,7 @@ module RuboCop
|
|
81
81
|
# @return [self] if a block is given
|
82
82
|
# @return [Enumerator] if no block is given
|
83
83
|
def each_value(&block)
|
84
|
-
return pairs.map(&:value).to_enum unless
|
84
|
+
return pairs.map(&:value).to_enum unless block
|
85
85
|
|
86
86
|
pairs.map(&:value).each(&block)
|
87
87
|
|
@@ -145,21 +145,24 @@ module RuboCop
|
|
145
145
|
#
|
146
146
|
# @return [Array<Node>] an array of branch nodes
|
147
147
|
def branches
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
148
|
+
if ternary?
|
149
|
+
[if_branch, else_branch]
|
150
|
+
elsif !else?
|
151
|
+
[if_branch]
|
152
|
+
else
|
153
|
+
branches = [if_branch]
|
154
|
+
other_branches = if elsif_conditional?
|
155
|
+
else_branch.branches
|
156
|
+
else
|
157
|
+
[else_branch]
|
158
|
+
end
|
159
|
+
branches.concat(other_branches)
|
160
|
+
end
|
158
161
|
end
|
159
162
|
|
160
163
|
# @deprecated Use `branches.each`
|
161
164
|
def each_branch(&block)
|
162
|
-
return branches.to_enum(__method__) unless
|
165
|
+
return branches.to_enum(__method__) unless block
|
163
166
|
|
164
167
|
branches.each(&block)
|
165
168
|
end
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
59
59
|
# @return [self] if a block is given
|
60
60
|
# @return [Enumerator] if no block is given
|
61
61
|
def each_descendant(*types, &block)
|
62
|
-
return to_enum(__method__, *types) unless
|
62
|
+
return to_enum(__method__, *types) unless block
|
63
63
|
|
64
64
|
visit_descendants(types, &block)
|
65
65
|
|
@@ -94,7 +94,7 @@ module RuboCop
|
|
94
94
|
# @return [self] if a block is given
|
95
95
|
# @return [Enumerator] if no block is given
|
96
96
|
def each_node(*types, &block)
|
97
|
-
return to_enum(__method__, *types) unless
|
97
|
+
return to_enum(__method__, *types) unless block
|
98
98
|
|
99
99
|
yield self if types.empty? || types.include?(type)
|
100
100
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module AST
|
5
|
+
# A node extension for `procarg0` nodes.
|
6
|
+
# This will be used in place of a plain node when the builder constructs
|
7
|
+
# the AST, making its methods available to all `arg` nodes within RuboCop.
|
8
|
+
class Procarg0Node < ArgNode
|
9
|
+
# Returns the name of an argument.
|
10
|
+
#
|
11
|
+
# @return [Symbol, nil] the name of the argument
|
12
|
+
def name
|
13
|
+
node_parts[0].name
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -103,7 +103,7 @@ module RuboCop
|
|
103
103
|
# Yields its argument and any descendants, depth-first.
|
104
104
|
#
|
105
105
|
def self.descend(element, &block)
|
106
|
-
return to_enum(__method__, element) unless
|
106
|
+
return to_enum(__method__, element) unless block
|
107
107
|
|
108
108
|
yield element
|
109
109
|
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
name
|
34
34
|
end
|
35
35
|
|
36
|
-
# Enumerates `enum` while keeping track of state
|
36
|
+
# Enumerates `enum` while keeping track of state across
|
37
37
|
# union branches (captures and unification).
|
38
38
|
def each_union(enum, &block)
|
39
39
|
enforce_same_captures(binding.union_bind(enum), &block)
|
@@ -40,7 +40,7 @@ module RuboCop
|
|
40
40
|
# sequence head
|
41
41
|
# :variadic_mode : child index held by @cur_index_var
|
42
42
|
# >= 0 : when the current child index is known
|
43
|
-
# (from the
|
43
|
+
# (from the beginning)
|
44
44
|
# < 0 : when the index is known from the end,
|
45
45
|
# where -1 is *past the end*,
|
46
46
|
# -2 is the last child, etc...
|
@@ -328,7 +328,7 @@ module RuboCop
|
|
328
328
|
"#{@seq_var}.children.size - #{-(cur + DELTA)}"
|
329
329
|
end
|
330
330
|
|
331
|
-
#
|
331
|
+
# NOTE: assumes `@cur_index != :seq_head`. Node types using `within_loop` must
|
332
332
|
# have `def in_sequence_head; :raise; end`
|
333
333
|
def within_loop
|
334
334
|
sync do |sync_code|
|
@@ -11,8 +11,11 @@
|
|
11
11
|
class RuboCop::AST::NodePattern::LexerRex
|
12
12
|
|
13
13
|
macros
|
14
|
+
CONST_NAME /[A-Z:][a-zA-Z_:]+/
|
14
15
|
SYMBOL_NAME /[\w+@*\/?!<>=~|%^-]+|\[\]=?/
|
15
|
-
IDENTIFIER /[a-
|
16
|
+
IDENTIFIER /[a-z][a-zA-Z0-9_]*/
|
17
|
+
NODE_TYPE /[a-z][a-zA-Z0-9_-]*/ # Same as identifier but allows '-'
|
18
|
+
CALL /(?:#{CONST_NAME}\.)?#{IDENTIFIER}[!?]?/
|
16
19
|
REGEXP_BODY /(?:[^\/]|\\\/)*/
|
17
20
|
REGEXP /\/(#{REGEXP_BODY})(?<!\\)\/([imxo]*)/
|
18
21
|
rules
|
@@ -25,14 +28,14 @@ rules
|
|
25
28
|
%w"( ) { | } [ ] < > $ ! ^ ` ... + * ? ,"
|
26
29
|
)}/o { emit ss.matched, &:to_sym }
|
27
30
|
/#{REGEXP}/o { emit_regexp }
|
28
|
-
|
31
|
+
/%?(#{CONST_NAME})/o { emit :tPARAM_CONST }
|
29
32
|
/%([a-z_]+)/ { emit :tPARAM_NAMED }
|
30
33
|
/%(\d*)/ { emit(:tPARAM_NUMBER) { |s| s.empty? ? 1 : s.to_i } } # Map `%` to `%1`
|
31
34
|
/_(#{IDENTIFIER})/o { emit :tUNIFY }
|
32
35
|
/_/o { emit :tWILDCARD }
|
33
|
-
/\#(#{
|
36
|
+
/\#(#{CALL})/o { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
|
34
37
|
/#{IDENTIFIER}\?/o { @state = :ARG; emit :tPREDICATE, &:to_sym }
|
35
|
-
/#{
|
38
|
+
/#{NODE_TYPE}/o { emit :tNODE_TYPE, &:to_sym }
|
36
39
|
:ARG /\(/ { @state = nil; emit :tARG_LIST }
|
37
40
|
:ARG // { @state = nil }
|
38
41
|
/\#.*/ { emit_comment }
|
@@ -24,8 +24,11 @@ class RuboCop::AST::NodePattern::LexerRex
|
|
24
24
|
require 'strscan'
|
25
25
|
|
26
26
|
# :stopdoc:
|
27
|
+
CONST_NAME = /[A-Z:][a-zA-Z_:]+/
|
27
28
|
SYMBOL_NAME = /[\w+@*\/?!<>=~|%^-]+|\[\]=?/
|
28
|
-
IDENTIFIER = /[a-
|
29
|
+
IDENTIFIER = /[a-z][a-zA-Z0-9_]*/
|
30
|
+
NODE_TYPE = /[a-z][a-zA-Z0-9_-]*/
|
31
|
+
CALL = /(?:#{CONST_NAME}\.)?#{IDENTIFIER}[!?]?/
|
29
32
|
REGEXP_BODY = /(?:[^\/]|\\\/)*/
|
30
33
|
REGEXP = /\/(#{REGEXP_BODY})(?<!\\)\/([imxo]*)/
|
31
34
|
# :startdoc:
|
@@ -132,7 +135,7 @@ class RuboCop::AST::NodePattern::LexerRex
|
|
132
135
|
action { emit ss.matched, &:to_sym }
|
133
136
|
when ss.skip(/#{REGEXP}/o) then
|
134
137
|
action { emit_regexp }
|
135
|
-
when ss.skip(
|
138
|
+
when ss.skip(/%?(#{CONST_NAME})/o) then
|
136
139
|
action { emit :tPARAM_CONST }
|
137
140
|
when ss.skip(/%([a-z_]+)/) then
|
138
141
|
action { emit :tPARAM_NAMED }
|
@@ -142,11 +145,11 @@ class RuboCop::AST::NodePattern::LexerRex
|
|
142
145
|
action { emit :tUNIFY }
|
143
146
|
when ss.skip(/_/o) then
|
144
147
|
action { emit :tWILDCARD }
|
145
|
-
when ss.skip(/\#(#{
|
148
|
+
when ss.skip(/\#(#{CALL})/o) then
|
146
149
|
action { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
|
147
150
|
when ss.skip(/#{IDENTIFIER}\?/o) then
|
148
151
|
action { @state = :ARG; emit :tPREDICATE, &:to_sym }
|
149
|
-
when ss.skip(/#{
|
152
|
+
when ss.skip(/#{NODE_TYPE}/o) then
|
150
153
|
action { emit :tNODE_TYPE, &:to_sym }
|
151
154
|
when ss.skip(/\#.*/) then
|
152
155
|
action { emit_comment }
|
@@ -7,12 +7,13 @@ module RuboCop
|
|
7
7
|
class Node < ::Parser::AST::Node
|
8
8
|
extend Forwardable
|
9
9
|
include ::RuboCop::AST::Descendence
|
10
|
+
using Ext::RangeMinMax
|
10
11
|
|
11
12
|
MATCHES_WITHIN_SET = %i[symbol number string].to_set.freeze
|
12
13
|
private_constant :MATCHES_WITHIN_SET
|
13
14
|
|
14
15
|
###
|
15
|
-
# To be
|
16
|
+
# To be overridden by subclasses
|
16
17
|
###
|
17
18
|
|
18
19
|
def rest?
|
@@ -59,7 +60,7 @@ module RuboCop
|
|
59
60
|
end
|
60
61
|
|
61
62
|
# @return [Boolean] returns true for nodes having a Ruby literal equivalent
|
62
|
-
# that matches
|
63
|
+
# that matches within a Set (e.g. `42`, `:sym` but not `/regexp/`)
|
63
64
|
def matches_within_set?
|
64
65
|
MATCHES_WITHIN_SET.include?(type)
|
65
66
|
end
|
@@ -197,27 +198,13 @@ module RuboCop
|
|
197
198
|
end
|
198
199
|
end
|
199
200
|
|
200
|
-
# Circumvent broken `Range#minmax` for infinity ranges in 2.6-
|
201
|
-
module MapMinMax
|
202
|
-
if RUBY_VERSION >= '2.7'
|
203
|
-
def map_min_max(enum)
|
204
|
-
enum.map(&:minmax)
|
205
|
-
end
|
206
|
-
else
|
207
|
-
def map_min_max(enum)
|
208
|
-
enum.map { |r| [r.min, r.max] } # rubocop:disable Style/MinMax
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
201
|
# A list (potentially empty) of nodes; part of a Union
|
214
202
|
class Subsequence < Node
|
215
203
|
include ForbidInSeqHead
|
216
|
-
include MapMinMax
|
217
204
|
|
218
205
|
def arity
|
219
|
-
min, max =
|
220
|
-
min == max ? min || 0 : min..max #
|
206
|
+
min, max = children.map(&:arity_range).map(&:minmax).transpose.map(&:sum)
|
207
|
+
min == max ? min || 0 : min..max # NOTE: || 0 for empty case, where min == max == nil.
|
221
208
|
end
|
222
209
|
|
223
210
|
def in_sequence_head
|
@@ -231,10 +218,8 @@ module RuboCop
|
|
231
218
|
|
232
219
|
# Node class for `{ ... }`
|
233
220
|
class Union < Node
|
234
|
-
include MapMinMax
|
235
|
-
|
236
221
|
def arity
|
237
|
-
minima, maxima =
|
222
|
+
minima, maxima = children.map(&:arity_range).map(&:minmax).transpose
|
238
223
|
min = minima.min
|
239
224
|
max = maxima.max
|
240
225
|
min == max ? min : min..max
|
@@ -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.
|
4
|
+
# This file is automatically generated by Racc 1.5.1
|
5
5
|
# from Racc grammar file "".
|
6
6
|
#
|
7
7
|
|
@@ -14,15 +14,15 @@ module RuboCop
|
|
14
14
|
|
15
15
|
racc_action_table = [
|
16
16
|
14, 15, 16, 21, 18, 17, 19, 10, 11, 12,
|
17
|
-
60, 22, 20, 4,
|
18
|
-
28, 23, 56, 50,
|
17
|
+
60, 22, 20, 4, 24, 5, 40, 6, 7, 8,
|
18
|
+
28, 23, 56, 50, 40, 61, 43, 66, 51, 51,
|
19
19
|
58, 14, 15, 16, 21, 18, 17, 19, 10, 11,
|
20
20
|
12, nil, 22, 20, 4, nil, 5, nil, 6, 7,
|
21
21
|
8, 28, 23, nil, nil, -34, 14, 15, 16, 21,
|
22
22
|
18, 17, 19, 10, 11, 12, nil, 22, 20, 4,
|
23
23
|
nil, 5, nil, 6, 7, 8, 9, 23, 14, 15,
|
24
24
|
16, 21, 18, 17, 19, 10, 11, 12, nil, 22,
|
25
|
-
20, 4, nil, 5, nil, 6, 7, 8,
|
25
|
+
20, 4, nil, 5, nil, 6, 7, 8, 28, 23,
|
26
26
|
14, 15, 16, 21, 18, 17, 19, 10, 11, 12,
|
27
27
|
nil, 22, 20, 4, nil, 5, nil, 6, 7, 8,
|
28
28
|
9, 23, 14, 15, 16, 21, 18, 17, 19, 10,
|
@@ -33,7 +33,7 @@ racc_action_table = [
|
|
33
33
|
18, 17, 19, 10, 11, 12, nil, 22, 20, 4,
|
34
34
|
nil, 5, nil, 6, 7, 8, 9, 23, 14, 15,
|
35
35
|
16, 21, 18, 17, 19, 10, 11, 12, nil, 22,
|
36
|
-
20, 4, nil, 5, nil, 6, 7, 8,
|
36
|
+
20, 4, nil, 5, nil, 6, 7, 8, 9, 23,
|
37
37
|
14, 15, 16, 21, 18, 17, 19, 10, 11, 12,
|
38
38
|
nil, 22, 20, 4, 44, 5, nil, 6, 7, 8,
|
39
39
|
28, 23, 14, 15, 16, 21, 18, 17, 19, 10,
|
@@ -47,31 +47,31 @@ racc_action_table = [
|
|
47
47
|
20, 4, nil, 5, nil, 6, 7, 8, 9, 23,
|
48
48
|
14, 15, 16, 21, 18, 17, 19, 10, 11, 12,
|
49
49
|
nil, 22, 20, 4, nil, 5, nil, 6, 7, 8,
|
50
|
-
9, 23,
|
51
|
-
|
50
|
+
9, 23, -1, -1, -1, -2, -2, -2, 47, 48,
|
51
|
+
49 ]
|
52
52
|
|
53
53
|
racc_action_check = [
|
54
54
|
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
55
|
-
54, 42, 42, 42,
|
56
|
-
42, 42, 42, 30,
|
55
|
+
54, 42, 42, 42, 1, 42, 10, 42, 42, 42,
|
56
|
+
42, 42, 42, 30, 11, 54, 24, 62, 30, 63,
|
57
57
|
42, 59, 59, 59, 59, 59, 59, 59, 59, 59,
|
58
58
|
59, nil, 59, 59, 59, nil, 59, nil, 59, 59,
|
59
|
-
59, 59, 59, nil, nil, 59,
|
60
|
-
5, 5, 5, 5, 5, 5, nil, 5, 5, 5,
|
61
|
-
nil, 5, nil, 5, 5, 5, 5, 5, 6, 6,
|
62
|
-
6, 6, 6, 6, 6, 6, 6, 6, nil, 6,
|
63
|
-
6, 6, nil, 6, nil, 6, 6, 6, 6, 6,
|
64
|
-
7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
65
|
-
nil, 7, 7, 7, nil, 7, nil, 7, 7, 7,
|
66
|
-
7, 7, 8, 8, 8, 8, 8, 8, 8, 8,
|
67
|
-
8, 8, nil, 8, 8, 8, nil, 8, nil, 8,
|
68
|
-
8, 8, 8, 8, 9, 9, 9, 9, 9, 9,
|
69
|
-
9, 9, 9, 9, nil, 9, 9, 9, nil, 9,
|
70
|
-
nil, 9, 9, 9, 9, 9, 0, 0, 0, 0,
|
59
|
+
59, 59, 59, nil, nil, 59, 0, 0, 0, 0,
|
71
60
|
0, 0, 0, 0, 0, 0, nil, 0, 0, 0,
|
72
61
|
nil, 0, nil, 0, 0, 0, 0, 0, 4, 4,
|
73
62
|
4, 4, 4, 4, 4, 4, 4, 4, nil, 4,
|
74
63
|
4, 4, nil, 4, nil, 4, 4, 4, 4, 4,
|
64
|
+
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
65
|
+
nil, 5, 5, 5, nil, 5, nil, 5, 5, 5,
|
66
|
+
5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
|
67
|
+
6, 6, nil, 6, 6, 6, nil, 6, nil, 6,
|
68
|
+
6, 6, 6, 6, 7, 7, 7, 7, 7, 7,
|
69
|
+
7, 7, 7, 7, nil, 7, 7, 7, nil, 7,
|
70
|
+
nil, 7, 7, 7, 7, 7, 8, 8, 8, 8,
|
71
|
+
8, 8, 8, 8, 8, 8, nil, 8, 8, 8,
|
72
|
+
nil, 8, nil, 8, 8, 8, 8, 8, 9, 9,
|
73
|
+
9, 9, 9, 9, 9, 9, 9, 9, nil, 9,
|
74
|
+
9, 9, nil, 9, nil, 9, 9, 9, 9, 9,
|
75
75
|
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
76
76
|
nil, 27, 27, 27, 27, 27, nil, 27, 27, 27,
|
77
77
|
27, 27, 28, 28, 28, 28, 28, 28, 28, 28,
|
@@ -85,17 +85,17 @@ racc_action_check = [
|
|
85
85
|
50, 50, nil, 50, nil, 50, 50, 50, 50, 50,
|
86
86
|
61, 61, 61, 61, 61, 61, 61, 61, 61, 61,
|
87
87
|
nil, 61, 61, 61, nil, 61, nil, 61, 61, 61,
|
88
|
-
61, 61,
|
89
|
-
|
88
|
+
61, 61, 25, 25, 25, 26, 26, 26, 29, 29,
|
89
|
+
29 ]
|
90
90
|
|
91
91
|
racc_action_pointer = [
|
92
|
-
|
93
|
-
|
94
|
-
nil, nil, nil, nil,
|
92
|
+
54, 14, nil, nil, 76, 98, 120, 142, 164, 186,
|
93
|
+
4, 12, nil, nil, nil, nil, nil, nil, nil, nil,
|
94
|
+
nil, nil, nil, nil, 26, 315, 318, 208, 230, 321,
|
95
95
|
-2, nil, nil, 252, nil, nil, nil, nil, nil, nil,
|
96
96
|
274, nil, -2, nil, nil, nil, nil, nil, nil, nil,
|
97
97
|
296, nil, nil, nil, -6, nil, nil, nil, nil, 29,
|
98
|
-
nil, 318,
|
98
|
+
nil, 318, 1, -1, nil, nil, nil ]
|
99
99
|
|
100
100
|
racc_action_default = [
|
101
101
|
-47, -47, -1, -2, -31, -47, -47, -47, -47, -47,
|
@@ -107,26 +107,26 @@ racc_action_default = [
|
|
107
107
|
-37, -47, -47, -47, -35, -39, -26 ]
|
108
108
|
|
109
109
|
racc_goto_table = [
|
110
|
-
1, 33,
|
111
|
-
|
112
|
-
nil, nil, nil, nil, nil, nil,
|
113
|
-
nil, nil, nil, 53,
|
114
|
-
55,
|
110
|
+
1, 33, 27, 25, 26, 34, 35, 36, 37, 38,
|
111
|
+
42, 32, 39, 41, 46, 63, 62, 64, 54, nil,
|
112
|
+
nil, nil, nil, nil, nil, nil, 25, 26, 38, nil,
|
113
|
+
nil, nil, nil, 53, 45, nil, nil, nil, nil, nil,
|
114
|
+
55, 25, 26, nil, nil, nil, 59, nil, nil, 57,
|
115
115
|
34, nil, nil, nil, nil, nil, nil, nil, nil, 53,
|
116
116
|
nil, 65 ]
|
117
117
|
|
118
118
|
racc_goto_check = [
|
119
|
-
1, 5,
|
120
|
-
|
121
|
-
nil, nil, nil, nil, nil, nil,
|
122
|
-
nil, nil, nil, 1,
|
123
|
-
1,
|
119
|
+
1, 5, 4, 2, 3, 1, 1, 1, 1, 1,
|
120
|
+
8, 9, 6, 6, 10, 11, 12, 13, 14, nil,
|
121
|
+
nil, nil, nil, nil, nil, nil, 2, 3, 1, nil,
|
122
|
+
nil, nil, nil, 1, 9, nil, nil, nil, nil, nil,
|
123
|
+
1, 2, 3, nil, nil, nil, 5, nil, nil, 9,
|
124
124
|
1, nil, nil, nil, nil, nil, nil, nil, nil, 1,
|
125
125
|
nil, 1 ]
|
126
126
|
|
127
127
|
racc_goto_pointer = [
|
128
|
-
nil, 0, 0,
|
129
|
-
-
|
128
|
+
nil, 0, -1, 0, -2, -4, 2, nil, -13, 7,
|
129
|
+
-15, -44, -43, -42, -22 ]
|
130
130
|
|
131
131
|
racc_goto_default = [
|
132
132
|
nil, 29, 2, 3, nil, nil, nil, 13, nil, nil,
|
@@ -39,10 +39,10 @@ module RuboCop
|
|
39
39
|
type, *aliases = type
|
40
40
|
lineno = caller_locations(1, 1).first.lineno
|
41
41
|
module_eval(<<~RUBY, __FILE__, lineno) # rubocop:disable Style/EvalWithLocation
|
42
|
-
def on_#{type}(node)
|
43
|
-
#{body}
|
44
|
-
nil
|
45
|
-
end
|
42
|
+
def on_#{type}(node) # def on_send(node)
|
43
|
+
#{body} # # body ...
|
44
|
+
nil # nil
|
45
|
+
end # end
|
46
46
|
RUBY
|
47
47
|
aliases.each do |m|
|
48
48
|
alias_method "on_#{m}", "on_#{type}"
|
@@ -114,9 +114,10 @@ module RuboCop
|
|
114
114
|
in_match match_alt break next
|
115
115
|
match_as array_pattern array_pattern_with_tail
|
116
116
|
hash_pattern const_pattern find_pattern
|
117
|
-
index indexasgn procarg0]
|
117
|
+
index indexasgn procarg0 kwargs]
|
118
118
|
many_opt_node_children = %i[case rescue resbody ensure for when
|
119
|
-
case_match in_pattern irange erange
|
119
|
+
case_match in_pattern irange erange
|
120
|
+
match_pattern match_pattern_p]
|
120
121
|
|
121
122
|
### Callbacks for above
|
122
123
|
def_callback no_children
|
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.0
|
4
|
+
version: 1.4.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: 2021-01-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: parser
|
@@ -60,10 +60,12 @@ files:
|
|
60
60
|
- lib/rubocop/ast.rb
|
61
61
|
- lib/rubocop/ast/builder.rb
|
62
62
|
- lib/rubocop/ast/ext/range.rb
|
63
|
+
- lib/rubocop/ast/ext/range_min_max.rb
|
63
64
|
- lib/rubocop/ast/ext/set.rb
|
64
65
|
- lib/rubocop/ast/node.rb
|
65
66
|
- lib/rubocop/ast/node/alias_node.rb
|
66
67
|
- lib/rubocop/ast/node/and_node.rb
|
68
|
+
- lib/rubocop/ast/node/arg_node.rb
|
67
69
|
- lib/rubocop/ast/node/args_node.rb
|
68
70
|
- lib/rubocop/ast/node/array_node.rb
|
69
71
|
- lib/rubocop/ast/node/block_node.rb
|
@@ -101,6 +103,7 @@ files:
|
|
101
103
|
- lib/rubocop/ast/node/next_node.rb
|
102
104
|
- lib/rubocop/ast/node/or_node.rb
|
103
105
|
- lib/rubocop/ast/node/pair_node.rb
|
106
|
+
- lib/rubocop/ast/node/procarg0_node.rb
|
104
107
|
- lib/rubocop/ast/node/range_node.rb
|
105
108
|
- lib/rubocop/ast/node/regexp_node.rb
|
106
109
|
- lib/rubocop/ast/node/resbody_node.rb
|
@@ -158,14 +161,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
158
161
|
requirements:
|
159
162
|
- - ">="
|
160
163
|
- !ruby/object:Gem::Version
|
161
|
-
version: 2.
|
164
|
+
version: 2.4.0
|
162
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
166
|
requirements:
|
164
167
|
- - ">="
|
165
168
|
- !ruby/object:Gem::Version
|
166
169
|
version: '0'
|
167
170
|
requirements: []
|
168
|
-
rubygems_version: 3.
|
171
|
+
rubygems_version: 3.2.3
|
169
172
|
signing_key:
|
170
173
|
specification_version: 4
|
171
174
|
summary: RuboCop tools to deal with Ruby code AST.
|