rubocop-ast 1.0.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rubocop/ast.rb +3 -0
  3. data/lib/rubocop/ast/builder.rb +10 -0
  4. data/lib/rubocop/ast/ext/range_min_max.rb +18 -0
  5. data/lib/rubocop/ast/node.rb +9 -7
  6. data/lib/rubocop/ast/node/arg_node.rb +34 -0
  7. data/lib/rubocop/ast/node/args_node.rb +10 -0
  8. data/lib/rubocop/ast/node/array_node.rb +1 -1
  9. data/lib/rubocop/ast/node/block_node.rb +27 -0
  10. data/lib/rubocop/ast/node/case_match_node.rb +1 -1
  11. data/lib/rubocop/ast/node/case_node.rb +1 -1
  12. data/lib/rubocop/ast/node/const_node.rb +1 -1
  13. data/lib/rubocop/ast/node/hash_node.rb +2 -2
  14. data/lib/rubocop/ast/node/if_node.rb +14 -11
  15. data/lib/rubocop/ast/node/mixin/descendence.rb +2 -2
  16. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -1
  17. data/lib/rubocop/ast/node/procarg0_node.rb +17 -0
  18. data/lib/rubocop/ast/node/regexp_node.rb +1 -1
  19. data/lib/rubocop/ast/node/when_node.rb +1 -1
  20. data/lib/rubocop/ast/node_pattern.rb +2 -2
  21. data/lib/rubocop/ast/node_pattern/builder.rb +1 -1
  22. data/lib/rubocop/ast/node_pattern/compiler.rb +2 -2
  23. data/lib/rubocop/ast/node_pattern/compiler/atom_subcompiler.rb +1 -1
  24. data/lib/rubocop/ast/node_pattern/compiler/node_pattern_subcompiler.rb +1 -1
  25. data/lib/rubocop/ast/node_pattern/compiler/sequence_subcompiler.rb +3 -3
  26. data/lib/rubocop/ast/node_pattern/compiler/subcompiler.rb +1 -1
  27. data/lib/rubocop/ast/node_pattern/lexer.rb +2 -2
  28. data/lib/rubocop/ast/node_pattern/lexer.rex +7 -4
  29. data/lib/rubocop/ast/node_pattern/lexer.rex.rb +7 -4
  30. data/lib/rubocop/ast/node_pattern/method_definer.rb +2 -0
  31. data/lib/rubocop/ast/node_pattern/node.rb +6 -21
  32. data/lib/rubocop/ast/node_pattern/parser.racc.rb +39 -39
  33. data/lib/rubocop/ast/node_pattern/parser.rb +1 -1
  34. data/lib/rubocop/ast/traversal.rb +4 -4
  35. data/lib/rubocop/ast/version.rb +1 -1
  36. metadata +6 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47a3f561646e687bc714f3f176e99c5d5eca2ab24559bedf942f792352c4270e
4
- data.tar.gz: c063c635a2436be86d39eb50145d5670e1840e94f50ae3631715737ff7dfd9a7
3
+ metadata.gz: 0f538f2ba2d235b12111dfc20f5cb568ed1212310bf90f3f9abf783866153b93
4
+ data.tar.gz: 9a67f643a7b4371f6592a846664933cd56399689a3c8005ef4ef8ddfb4857341
5
5
  SHA512:
6
- metadata.gz: 02f8fcec5a73b6ddf0f1f526681fc625cf866cda61a69f3a11a41e70ab3addafed172b6c25218c1583e7247da66aef458559dc5a182d1cee010cdb603dc31f3d
7
- data.tar.gz: af3e1390138540f1f728906efad504d7029deb1261b8607d168383511b210d74d73986e63186339cb916a9dda4ae8f116119257f340c687c88fcac7b8c5d83a1
6
+ metadata.gz: 9df6cd1a8593620ac41fc08a9798b5c0e5c2973f62d8068605435f6d0231ab0ccd9555610645951d2550f7150753395f64d4ffd9d8fe74b40ffbce6a095f3ce1
7
+ data.tar.gz: c4d67ddff04232bead212dcc7632ac3e5195c29f0314a5137c0c2da57ba7805f386600f4a21fdd490d7a0988165974482fc1e60a7aed9227a9f37466b79e85eb
@@ -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'
@@ -20,6 +20,15 @@ module RuboCop
20
20
  NODE_MAP = {
21
21
  and: AndNode,
22
22
  alias: AliasNode,
23
+ arg: ArgNode,
24
+ blockarg: ArgNode,
25
+ forward_arg: ArgNode,
26
+ kwarg: ArgNode,
27
+ kwoptarg: ArgNode,
28
+ kwrestarg: ArgNode,
29
+ optarg: ArgNode,
30
+ restarg: ArgNode,
31
+ shadowarg: ArgNode,
23
32
  args: ArgsNode,
24
33
  array: ArrayNode,
25
34
  block: BlockNode,
@@ -49,6 +58,7 @@ module RuboCop
49
58
  next: NextNode,
50
59
  or: OrNode,
51
60
  pair: PairNode,
61
+ procarg0: Procarg0Node,
52
62
  regexp: RegexpNode,
53
63
  rescue: RescueNode,
54
64
  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
@@ -484,10 +485,11 @@ module RuboCop
484
485
  def_node_matcher :global_const?, '(const {nil? cbase} %1)'
485
486
 
486
487
  def_node_matcher :class_constructor?, <<~PATTERN
487
- { (send #global_const?({:Class :Module}) :new ...)
488
- (block (send #global_const?({:Class :Module}) :new ...) ...)}
488
+ { (send #global_const?({:Class :Module :Struct}) :new ...)
489
+ (block (send #global_const?({:Class :Module :Struct}) :new ...) ...)}
489
490
  PATTERN
490
491
 
492
+ # @deprecated Use `:class_constructor?`
491
493
  def_node_matcher :struct_constructor?, <<~PATTERN
492
494
  (block (send #global_const?(:Struct) :new ...) _ $_)
493
495
  PATTERN
@@ -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
 
@@ -174,7 +174,7 @@ module RuboCop
174
174
  # @return [Boolean] whether the dispatched method is a `def` modifier
175
175
  def def_modifier?
176
176
  send_type? &&
177
- [self, *each_descendant(:send)].any?(&:adjacent_def_modifier?)
177
+ adjacent_def_modifier? || each_child_node(:send).any?(&:def_modifier?)
178
178
  end
179
179
 
180
180
  # Checks whether this is a lambda. Some versions of parser parses
@@ -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
 
@@ -6,7 +6,7 @@ module RuboCop
6
6
  module AST
7
7
  # This class performs a pattern-matching operation on an AST node.
8
8
  #
9
- # Detailed syntax: /doc/modules/ROOT/pages/node_pattern.md
9
+ # Detailed syntax: /docs/modules/ROOT/pages/node_pattern.adoc
10
10
  #
11
11
  # Initialize a new `NodePattern` with `NodePattern.new(pattern_string)`, then
12
12
  # pass an AST node to `NodePattern#match`. Alternatively, use one of the class
@@ -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
 
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Responsible to build the AST nodes for `NodePattern`
7
7
  #
8
8
  # Doc on how this fits in the compiling process:
9
- # /doc/modules/ROOT/pages/node_pattern.md
9
+ # /docs/modules/ROOT/pages/node_pattern.adoc
10
10
  class Builder
11
11
  def emit_capture(capture_token, node)
12
12
  return node if capture_token.nil?
@@ -7,7 +7,7 @@ module RuboCop
7
7
  # Defers work to its subcompilers
8
8
  #
9
9
  # Doc on how this fits in the compiling process:
10
- # /doc/modules/ROOT/pages/node_pattern.md
10
+ # /docs/modules/ROOT/pages/node_pattern.adoc
11
11
  class Compiler
12
12
  extend Forwardable
13
13
  attr_reader :captures, :named_parameters, :positional_parameters, :binding
@@ -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)
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # This value responds to `===`.
9
9
  #
10
10
  # Doc on how this fits in the compiling process:
11
- # /doc/modules/ROOT/pages/node_pattern.md
11
+ # /docs/modules/ROOT/pages/node_pattern.adoc
12
12
  class AtomSubcompiler < Subcompiler
13
13
  private
14
14
 
@@ -9,7 +9,7 @@ module RuboCop
9
9
  # or it's `node.type` if `seq_head` is true
10
10
  #
11
11
  # Doc on how this fits in the compiling process:
12
- # /doc/modules/ROOT/pages/node_pattern.md
12
+ # /docs/modules/ROOT/pages/node_pattern.adoc
13
13
  class NodePatternSubcompiler < Subcompiler
14
14
  attr_reader :access, :seq_head
15
15
 
@@ -11,7 +11,7 @@ module RuboCop
11
11
  # Assumes the given `var` is a `::RuboCop::AST::Node`
12
12
  #
13
13
  # Doc on how this fits in the compiling process:
14
- # /doc/modules/ROOT/pages/node_pattern.md
14
+ # /docs/modules/ROOT/pages/node_pattern.adoc
15
15
  #
16
16
  # rubocop:disable Metrics/ClassLength
17
17
  class SequenceSubcompiler < Subcompiler
@@ -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|
@@ -8,7 +8,7 @@ module RuboCop
8
8
  # Implements visitor pattern
9
9
  #
10
10
  # Doc on how this fits in the compiling process:
11
- # /doc/modules/ROOT/pages/node_pattern.md
11
+ # /docs/modules/ROOT/pages/node_pattern.adoc
12
12
  class Subcompiler
13
13
  attr_reader :compiler
14
14
 
@@ -14,7 +14,7 @@ module RuboCop
14
14
  # Lexer class for `NodePattern`
15
15
  #
16
16
  # Doc on how this fits in the compiling process:
17
- # /doc/modules/ROOT/pages/node_pattern.md
17
+ # /docs/modules/ROOT/pages/node_pattern.adoc
18
18
  class Lexer < LexerRex
19
19
  Error = ScanError
20
20
 
@@ -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,
@@ -9,7 +9,7 @@ module RuboCop
9
9
  # Note: class reopened in `parser.racc`
10
10
  #
11
11
  # Doc on how this fits in the compiling process:
12
- # /doc/modules/ROOT/pages/node_pattern.md
12
+ # /docs/modules/ROOT/pages/node_pattern.adoc
13
13
  class Parser < Racc::Parser
14
14
  extend Forwardable
15
15
 
@@ -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}"
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.0.0'
6
+ STRING = '1.3.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.0
4
+ version: 1.3.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-21 00:00:00.000000000 Z
13
+ date: 2020-12-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parser
@@ -46,20 +46,6 @@ dependencies:
46
46
  - - "<"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '3.0'
49
- - !ruby/object:Gem::Dependency
50
- name: rubocop-rspec
51
- requirement: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '1.0'
56
- type: :development
57
- prerelease: false
58
- version_requirements: !ruby/object:Gem::Requirement
59
- requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '1.0'
63
49
  description: " RuboCop's Node and NodePattern classes.\n"
64
50
  email: rubocop@googlegroups.com
65
51
  executables: []
@@ -74,10 +60,12 @@ files:
74
60
  - lib/rubocop/ast.rb
75
61
  - lib/rubocop/ast/builder.rb
76
62
  - lib/rubocop/ast/ext/range.rb
63
+ - lib/rubocop/ast/ext/range_min_max.rb
77
64
  - lib/rubocop/ast/ext/set.rb
78
65
  - lib/rubocop/ast/node.rb
79
66
  - lib/rubocop/ast/node/alias_node.rb
80
67
  - lib/rubocop/ast/node/and_node.rb
68
+ - lib/rubocop/ast/node/arg_node.rb
81
69
  - lib/rubocop/ast/node/args_node.rb
82
70
  - lib/rubocop/ast/node/array_node.rb
83
71
  - lib/rubocop/ast/node/block_node.rb
@@ -115,6 +103,7 @@ files:
115
103
  - lib/rubocop/ast/node/next_node.rb
116
104
  - lib/rubocop/ast/node/or_node.rb
117
105
  - lib/rubocop/ast/node/pair_node.rb
106
+ - lib/rubocop/ast/node/procarg0_node.rb
118
107
  - lib/rubocop/ast/node/range_node.rb
119
108
  - lib/rubocop/ast/node/regexp_node.rb
120
109
  - lib/rubocop/ast/node/resbody_node.rb
@@ -172,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
161
  requirements:
173
162
  - - ">="
174
163
  - !ruby/object:Gem::Version
175
- version: 2.3.0
164
+ version: 2.4.0
176
165
  required_rubygems_version: !ruby/object:Gem::Requirement
177
166
  requirements:
178
167
  - - ">="