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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8575eee0ddbed5fb9eb553bbc33346ec8dc75216403501a46a946f825e79102
4
- data.tar.gz: 5762b5f73e28c3dfd687feb0308d4248d87b90488ff99c9ddeebd49dced31941
3
+ metadata.gz: 34e6f8d5799eb4f6871ac4666b174d020ca3131b801184b31324d7488abc64b8
4
+ data.tar.gz: f0be9d5375bc11ae205a2b6343aa2db37afdd330bbde6d22c82ee54b1d6ae03d
5
5
  SHA512:
6
- metadata.gz: c7b6f9c6f1366ec8ddcb852ce8af9abdd0f945d41c17c9221ea27e9442b324912a1ff530e9faa36a4d48242e282b5786095cf714b38180e6b9fb121e97f4d703
7
- data.tar.gz: e43be065343ccc65a3c776b7073c6647c4cbf406121ec8e31782ced1b2d218937597f70a35b014d9c5681cdf7e76a8045755c4133394160ab3ed710e87639972
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 `emit_forward_arg` which is set to `true`.
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`:
@@ -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'
@@ -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
@@ -48,7 +48,7 @@ module RuboCop
48
48
 
49
49
  # @api private
50
50
  EQUALS_ASSIGNMENTS = %i[lvasgn ivasgn cvasgn gvasgn
51
- casgn masgn rasgn mrasgn].to_set.freeze
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 blockarg].to_set.freeze
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 block_given?
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
- # Note: Some rare nodes may have no source, like `s(:args)` in `foo {}`
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
- # Note: `loop { }` is a normal method call and thus not a loop keyword.
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
@@ -19,7 +19,7 @@ module RuboCop
19
19
 
20
20
  # @deprecated Use `values.each` (a.k.a. `children.each`)
21
21
  def each_value(&block)
22
- return to_enum(__method__) unless block_given?
22
+ return to_enum(__method__) unless block
23
23
 
24
24
  values.each(&block)
25
25
 
@@ -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 block_given?
20
+ return in_pattern_branches.to_enum(__method__) unless block
21
21
 
22
22
  in_pattern_branches.each(&block)
23
23
 
@@ -17,7 +17,7 @@ module RuboCop
17
17
 
18
18
  # @deprecated Use `when_branches.each`
19
19
  def each_when(&block)
20
- return when_branches.to_enum(__method__) unless block_given?
20
+ return when_branches.to_enum(__method__) unless block
21
21
 
22
22
  when_branches.each(&block)
23
23
 
@@ -45,7 +45,7 @@ module RuboCop
45
45
  # s(:const, :Foo), then
46
46
  # s(:const, s(:const, :Foo), :Bar)
47
47
  def each_path(&block)
48
- return to_enum(__method__) unless block_given?
48
+ return to_enum(__method__) unless block
49
49
 
50
50
  descendants = []
51
51
  last = self
@@ -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 block_given?
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 block_given?
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
- branches = [if_branch]
149
-
150
- return branches unless else?
151
-
152
- other_branches = if elsif_conditional?
153
- else_branch.branches
154
- else
155
- [else_branch]
156
- end
157
- branches.concat(other_branches)
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 block_given?
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 block_given?
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 block_given?
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
@@ -25,7 +25,7 @@ module RuboCop
25
25
  children.last
26
26
  end
27
27
 
28
- # Note: The 'o' option is ignored.
28
+ # NOTE: The 'o' option is ignored.
29
29
  #
30
30
  # @return [Integer] the Regexp option bits as returned by Regexp#options
31
31
  def options
@@ -15,7 +15,7 @@ module RuboCop
15
15
 
16
16
  # @deprecated Use `conditions.each`
17
17
  def each_condition(&block)
18
- return conditions.to_enum(__method__) unless block_given?
18
+ return conditions.to_enum(__method__) unless block
19
19
 
20
20
  conditions.each(&block)
21
21
 
@@ -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 block_given?
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 accross
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 begining)
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
- # Note: assumes `@cur_index != :seq_head`. Node types using `within_loop` must
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|
@@ -52,7 +52,7 @@ module RuboCop
52
52
  def emit_regexp
53
53
  body = ss[1]
54
54
  options = ss[2]
55
- flag = options.each_char.map { |c| REGEXP_OPTIONS[c] }.sum
55
+ flag = options.each_char.sum { |c| REGEXP_OPTIONS[c] }
56
56
 
57
57
  emit(:tREGEXP) { Regexp.new(body, flag) }
58
58
  end
@@ -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-zA-Z_][a-zA-Z0-9_-]*/
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
- /%([A-Z:][a-zA-Z_:]+)/ { emit :tPARAM_CONST }
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
- /\#(#{IDENTIFIER}[!?]?)/o { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
36
+ /\#(#{CALL})/o { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
34
37
  /#{IDENTIFIER}\?/o { @state = :ARG; emit :tPREDICATE, &:to_sym }
35
- /#{IDENTIFIER}/o { emit :tNODE_TYPE, &:to_sym }
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-zA-Z_][a-zA-Z0-9_-]*/
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(/%([A-Z:][a-zA-Z_:]+)/) then
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(/\#(#{IDENTIFIER}[!?]?)/o) then
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(/#{IDENTIFIER}/o) then
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 }
@@ -56,6 +56,8 @@ module RuboCop
56
56
  end
57
57
  src = yield method_name
58
58
  base.class_eval(src, location.path, location.lineno)
59
+
60
+ method_name
59
61
  end
60
62
 
61
63
  def emit_node_search(method_name)
@@ -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 overriden by subclasses
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 withing a Set (e.g. `42`, `:sym` but not `/regexp/`)
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 = map_min_max(children.map(&:arity_range)).transpose.map(&:sum)
220
- min == max ? min || 0 : min..max # Note: || 0 for empty case, where min == max == nil.
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 = map_min_max(children.map(&:arity_range)).transpose
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.16
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, 40, 5, 43, 6, 7, 8,
18
- 28, 23, 56, 50, 66, 61, 24, 51, 51, 40,
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, 9, 23,
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, 28, 23,
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, 47, 48, 49, -1, -1, -1, -2, -2,
51
- -2 ]
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, 11, 42, 24, 42, 42, 42,
56
- 42, 42, 42, 30, 62, 54, 1, 63, 30, 10,
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, 5, 5, 5, 5,
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, 29, 29, 29, 25, 25, 25, 26, 26,
89
- 26 ]
88
+ 61, 61, 25, 25, 25, 26, 26, 26, 29, 29,
89
+ 29 ]
90
90
 
91
91
  racc_action_pointer = [
92
- 164, 26, nil, nil, 186, 54, 76, 98, 120, 142,
93
- 17, 2, nil, nil, nil, nil, nil, nil, nil, nil,
94
- nil, nil, nil, nil, 16, 318, 321, 208, 230, 315,
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, -2, -3, nil, nil, nil ]
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, 64, 32, 25, 34, 35, 36, 37, 38,
111
- 54, 26, 39, 41, 27, 42, 46, 63, 62, nil,
112
- nil, nil, nil, nil, nil, nil, 45, 25, 38, nil,
113
- nil, nil, nil, 53, 26, nil, nil, nil, nil, nil,
114
- 55, 57, 25, nil, nil, nil, 59, nil, nil, 26,
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, 13, 9, 2, 1, 1, 1, 1, 1,
120
- 14, 3, 6, 6, 4, 8, 10, 11, 12, nil,
121
- nil, nil, nil, nil, nil, nil, 9, 2, 1, nil,
122
- nil, nil, nil, 1, 3, nil, nil, nil, nil, nil,
123
- 1, 9, 2, nil, nil, nil, 5, nil, nil, 3,
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, 7, 10, -4, 2, nil, -8, -1,
129
- -13, -42, -41, -57, -30 ]
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
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.0.1'
6
+ STRING = '1.4.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: 1.0.1
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: 2020-10-23 00:00:00.000000000 Z
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.3.0
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.1.4
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.