rubocop-ast 1.1.0 → 1.4.1

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: 80da9c79ffae899ecc1eea266704e35274d85ce07d3f46a9bed2a7ac573445b9
4
- data.tar.gz: af113442d1be42f61c17b369e097c6c0ad9c5c9c49cac27c70dee3c21aa39568
3
+ metadata.gz: 514cdc7bddc33ed7ef5123a27b9a8c7f4977a6d5f79b677371e8ec9b0f8641c3
4
+ data.tar.gz: 66670e0fa5cf3e0710154714eb854624a592d72d219aee0e425e11be009892ab
5
5
  SHA512:
6
- metadata.gz: d4d26dca602b849000686fa68f1b543681d8e51598741a6a4bf9e69a57ca6bab21ce8ac270b8578ad473808ed985f13ce9b080ac2259ad73fd6f87110e345305
7
- data.tar.gz: 72d5d9852cd5286ba8d01c7f5b46b774fdfb7bae7382aebd9cf766b8bd103f22477d3ba7d47a62c3466bc35d74eba4784e6b53725aa4332669d20a8801d46936
6
+ metadata.gz: cc1dc3353b12e90a8166d02d7ddf95e80a966290c6f611500cc5b446a707456a6acbd15947d92399b3ddd004195e8c8da4b23dd3ca80c91226920dd269326621
7
+ data.tar.gz: 962af11aa6ad1d1b32117758661faa0e43f632cf6540df082e2e0aedabfecd7fb98adc9b30ff4ee5beb63674b2ad42a3dcc7b07a821e109e77b49868efce8b69
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'
@@ -69,6 +72,7 @@ require_relative 'ast/node/return_node'
69
72
  require_relative 'ast/node/self_class_node'
70
73
  require_relative 'ast/node/send_node'
71
74
  require_relative 'ast/node/str_node'
75
+ require_relative 'ast/node/dstr_node'
72
76
  require_relative 'ast/node/super_node'
73
77
  require_relative 'ast/node/symbol_node'
74
78
  require_relative 'ast/node/until_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,
@@ -32,6 +42,7 @@ module RuboCop
32
42
  def: DefNode,
33
43
  defined?: DefinedNode,
34
44
  defs: DefNode,
45
+ dstr: DstrNode,
35
46
  ensure: EnsureNode,
36
47
  for: ForNode,
37
48
  forward_args: ForwardArgsNode,
@@ -43,12 +54,14 @@ module RuboCop
43
54
  indexasgn: IndexasgnNode,
44
55
  irange: RangeNode,
45
56
  erange: RangeNode,
57
+ kwargs: HashNode,
46
58
  kwsplat: KeywordSplatNode,
47
59
  lambda: LambdaNode,
48
60
  module: ModuleNode,
49
61
  next: NextNode,
50
62
  or: OrNode,
51
63
  pair: PairNode,
64
+ procarg0: Procarg0Node,
52
65
  regexp: RegexpNode,
53
66
  rescue: RescueNode,
54
67
  resbody: ResbodyNode,
@@ -56,7 +69,6 @@ module RuboCop
56
69
  csend: SendNode,
57
70
  send: SendNode,
58
71
  str: StrNode,
59
- dstr: StrNode,
60
72
  xstr: StrNode,
61
73
  sclass: SelfClassNode,
62
74
  super: SuperNode,
@@ -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
@@ -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
@@ -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
@@ -13,7 +13,8 @@ class RuboCop::AST::NodePattern::LexerRex
13
13
  macros
14
14
  CONST_NAME /[A-Z:][a-zA-Z_:]+/
15
15
  SYMBOL_NAME /[\w+@*\/?!<>=~|%^-]+|\[\]=?/
16
- 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 '-'
17
18
  CALL /(?:#{CONST_NAME}\.)?#{IDENTIFIER}[!?]?/
18
19
  REGEXP_BODY /(?:[^\/]|\\\/)*/
19
20
  REGEXP /\/(#{REGEXP_BODY})(?<!\\)\/([imxo]*)/
@@ -27,14 +28,14 @@ rules
27
28
  %w"( ) { | } [ ] < > $ ! ^ ` ... + * ? ,"
28
29
  )}/o { emit ss.matched, &:to_sym }
29
30
  /#{REGEXP}/o { emit_regexp }
30
- /%(#{CONST_NAME})/o { emit :tPARAM_CONST }
31
+ /%?(#{CONST_NAME})/o { emit :tPARAM_CONST }
31
32
  /%([a-z_]+)/ { emit :tPARAM_NAMED }
32
33
  /%(\d*)/ { emit(:tPARAM_NUMBER) { |s| s.empty? ? 1 : s.to_i } } # Map `%` to `%1`
33
34
  /_(#{IDENTIFIER})/o { emit :tUNIFY }
34
35
  /_/o { emit :tWILDCARD }
35
36
  /\#(#{CALL})/o { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
36
37
  /#{IDENTIFIER}\?/o { @state = :ARG; emit :tPREDICATE, &:to_sym }
37
- /#{IDENTIFIER}/o { emit :tNODE_TYPE, &:to_sym }
38
+ /#{NODE_TYPE}/o { emit :tNODE_TYPE, &:to_sym }
38
39
  :ARG /\(/ { @state = nil; emit :tARG_LIST }
39
40
  :ARG // { @state = nil }
40
41
  /\#.*/ { emit_comment }
@@ -26,7 +26,8 @@ class RuboCop::AST::NodePattern::LexerRex
26
26
  # :stopdoc:
27
27
  CONST_NAME = /[A-Z:][a-zA-Z_:]+/
28
28
  SYMBOL_NAME = /[\w+@*\/?!<>=~|%^-]+|\[\]=?/
29
- 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_-]*/
30
31
  CALL = /(?:#{CONST_NAME}\.)?#{IDENTIFIER}[!?]?/
31
32
  REGEXP_BODY = /(?:[^\/]|\\\/)*/
32
33
  REGEXP = /\/(#{REGEXP_BODY})(?<!\\)\/([imxo]*)/
@@ -134,7 +135,7 @@ class RuboCop::AST::NodePattern::LexerRex
134
135
  action { emit ss.matched, &:to_sym }
135
136
  when ss.skip(/#{REGEXP}/o) then
136
137
  action { emit_regexp }
137
- when ss.skip(/%(#{CONST_NAME})/o) then
138
+ when ss.skip(/%?(#{CONST_NAME})/o) then
138
139
  action { emit :tPARAM_CONST }
139
140
  when ss.skip(/%([a-z_]+)/) then
140
141
  action { emit :tPARAM_NAMED }
@@ -148,7 +149,7 @@ class RuboCop::AST::NodePattern::LexerRex
148
149
  action { @state = :ARG; emit :tFUNCTION_CALL, &:to_sym }
149
150
  when ss.skip(/#{IDENTIFIER}\?/o) then
150
151
  action { @state = :ARG; emit :tPREDICATE, &:to_sym }
151
- when ss.skip(/#{IDENTIFIER}/o) then
152
+ when ss.skip(/#{NODE_TYPE}/o) then
152
153
  action { emit :tNODE_TYPE, &:to_sym }
153
154
  when ss.skip(/\#.*/) then
154
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.1.0'
6
+ STRING = '1.4.1'
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.1.0
4
+ version: 1.4.1
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-27 00:00:00.000000000 Z
13
+ date: 2021-01-23 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
@@ -74,6 +76,7 @@ files:
74
76
  - lib/rubocop/ast/node/const_node.rb
75
77
  - lib/rubocop/ast/node/def_node.rb
76
78
  - lib/rubocop/ast/node/defined_node.rb
79
+ - lib/rubocop/ast/node/dstr_node.rb
77
80
  - lib/rubocop/ast/node/ensure_node.rb
78
81
  - lib/rubocop/ast/node/float_node.rb
79
82
  - lib/rubocop/ast/node/for_node.rb
@@ -101,6 +104,7 @@ files:
101
104
  - lib/rubocop/ast/node/next_node.rb
102
105
  - lib/rubocop/ast/node/or_node.rb
103
106
  - lib/rubocop/ast/node/pair_node.rb
107
+ - lib/rubocop/ast/node/procarg0_node.rb
104
108
  - lib/rubocop/ast/node/range_node.rb
105
109
  - lib/rubocop/ast/node/regexp_node.rb
106
110
  - lib/rubocop/ast/node/resbody_node.rb
@@ -158,14 +162,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
162
  requirements:
159
163
  - - ">="
160
164
  - !ruby/object:Gem::Version
161
- version: 2.3.0
165
+ version: 2.4.0
162
166
  required_rubygems_version: !ruby/object:Gem::Requirement
163
167
  requirements:
164
168
  - - ">="
165
169
  - !ruby/object:Gem::Version
166
170
  version: '0'
167
171
  requirements: []
168
- rubygems_version: 3.1.4
172
+ rubygems_version: 3.2.3
169
173
  signing_key:
170
174
  specification_version: 4
171
175
  summary: RuboCop tools to deal with Ruby code AST.