rubocop-ast 1.17.0 → 1.29.0

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: 267bd60200cc411795e6c3dadcb9674a3b152144f1516cefba894ba7241e13d6
4
- data.tar.gz: 1e2b83c59fb18af18c99debfcda585f670dafbba5d7ba6031d45080f9eb3bca5
3
+ metadata.gz: b08ce67ff41a6d40d8385735fe36ebe6fd90513f3cbafbd21afa4f9393a66f9a
4
+ data.tar.gz: 24e6a84531e66531bcf5c358cfbed40815d1fd3f1d91e598a5b884a1971bb3c7
5
5
  SHA512:
6
- metadata.gz: 3c4871cb6d6ac715e84670c52b7534bac124abf0ddf267ba8305071dbec56ffda396e73fe2e92a65acf817a9131218f59ce0f428b0d59f9d53643e840f911090
7
- data.tar.gz: f68f78643f318518f4c20d088d267b64f43a34cb59262487b2479b66e5bb63ee5f46cc11e8ffb033e26433df29ed090cef6202ffcd7b995700010d26d2cd0922
6
+ metadata.gz: 20a8ea979cb2335691b7b39c9986962edc2fe61667e712187e3904e2a984fc3327b38034eca64028a362724964e982d053a093432d3f7994edae592cd8f6fb83
7
+ data.tar.gz: 59ab4c65c59d3407224147391e8b253c930da8add826c50553b433039057865aa1211d13e90061bb4e3a40ebb97184ea8d5698f3b4f5d0ff7c3c343d14a566bd
@@ -19,76 +19,77 @@ module RuboCop
19
19
 
20
20
  # @api private
21
21
  NODE_MAP = {
22
- and: AndNode,
23
- and_asgn: AndAsgnNode,
24
- alias: AliasNode,
25
- arg: ArgNode,
26
- blockarg: ArgNode,
27
- forward_arg: ArgNode,
28
- kwarg: ArgNode,
29
- kwoptarg: ArgNode,
30
- kwrestarg: ArgNode,
31
- optarg: ArgNode,
32
- restarg: ArgNode,
33
- shadowarg: ArgNode,
34
- args: ArgsNode,
35
- array: ArrayNode,
36
- lvasgn: AsgnNode,
37
- ivasgn: AsgnNode,
38
- cvasgn: AsgnNode,
39
- gvasgn: AsgnNode,
40
- block: BlockNode,
41
- numblock: BlockNode,
42
- break: BreakNode,
43
- case_match: CaseMatchNode,
44
- casgn: CasgnNode,
45
- case: CaseNode,
46
- class: ClassNode,
47
- const: ConstNode,
48
- def: DefNode,
49
- defined?: DefinedNode,
50
- defs: DefNode,
51
- dstr: DstrNode,
52
- ensure: EnsureNode,
53
- for: ForNode,
54
- forward_args: ForwardArgsNode,
55
- float: FloatNode,
56
- hash: HashNode,
57
- if: IfNode,
58
- in_pattern: InPatternNode,
59
- int: IntNode,
60
- index: IndexNode,
61
- indexasgn: IndexasgnNode,
62
- irange: RangeNode,
63
- erange: RangeNode,
64
- kwargs: HashNode,
65
- kwsplat: KeywordSplatNode,
66
- lambda: LambdaNode,
67
- module: ModuleNode,
68
- next: NextNode,
69
- op_asgn: OpAsgnNode,
70
- or_asgn: OrAsgnNode,
71
- or: OrNode,
72
- pair: PairNode,
73
- procarg0: Procarg0Node,
74
- regexp: RegexpNode,
75
- rescue: RescueNode,
76
- resbody: ResbodyNode,
77
- return: ReturnNode,
78
- csend: SendNode,
79
- send: SendNode,
80
- str: StrNode,
81
- xstr: StrNode,
82
- sclass: SelfClassNode,
83
- super: SuperNode,
84
- zsuper: SuperNode,
85
- sym: SymbolNode,
86
- until: UntilNode,
87
- until_post: UntilNode,
88
- when: WhenNode,
89
- while: WhileNode,
90
- while_post: WhileNode,
91
- yield: YieldNode
22
+ and: AndNode,
23
+ and_asgn: AndAsgnNode,
24
+ alias: AliasNode,
25
+ arg: ArgNode,
26
+ blockarg: ArgNode,
27
+ forward_arg: ArgNode,
28
+ kwarg: ArgNode,
29
+ kwoptarg: ArgNode,
30
+ kwrestarg: ArgNode,
31
+ optarg: ArgNode,
32
+ restarg: ArgNode,
33
+ shadowarg: ArgNode,
34
+ args: ArgsNode,
35
+ array: ArrayNode,
36
+ lvasgn: AsgnNode,
37
+ ivasgn: AsgnNode,
38
+ cvasgn: AsgnNode,
39
+ gvasgn: AsgnNode,
40
+ block: BlockNode,
41
+ numblock: BlockNode,
42
+ break: BreakNode,
43
+ case_match: CaseMatchNode,
44
+ casgn: CasgnNode,
45
+ case: CaseNode,
46
+ class: ClassNode,
47
+ const: ConstNode,
48
+ def: DefNode,
49
+ defined?: DefinedNode,
50
+ defs: DefNode,
51
+ dstr: DstrNode,
52
+ ensure: EnsureNode,
53
+ for: ForNode,
54
+ forward_args: ForwardArgsNode,
55
+ forwarded_kwrestarg: KeywordSplatNode,
56
+ float: FloatNode,
57
+ hash: HashNode,
58
+ if: IfNode,
59
+ in_pattern: InPatternNode,
60
+ int: IntNode,
61
+ index: IndexNode,
62
+ indexasgn: IndexasgnNode,
63
+ irange: RangeNode,
64
+ erange: RangeNode,
65
+ kwargs: HashNode,
66
+ kwsplat: KeywordSplatNode,
67
+ lambda: LambdaNode,
68
+ module: ModuleNode,
69
+ next: NextNode,
70
+ op_asgn: OpAsgnNode,
71
+ or_asgn: OrAsgnNode,
72
+ or: OrNode,
73
+ pair: PairNode,
74
+ procarg0: Procarg0Node,
75
+ regexp: RegexpNode,
76
+ rescue: RescueNode,
77
+ resbody: ResbodyNode,
78
+ return: ReturnNode,
79
+ csend: CsendNode,
80
+ send: SendNode,
81
+ str: StrNode,
82
+ xstr: StrNode,
83
+ sclass: SelfClassNode,
84
+ super: SuperNode,
85
+ zsuper: SuperNode,
86
+ sym: SymbolNode,
87
+ until: UntilNode,
88
+ until_post: UntilNode,
89
+ when: WhenNode,
90
+ while: WhileNode,
91
+ while_post: WhileNode,
92
+ yield: YieldNode
92
93
  }.freeze
93
94
 
94
95
  # Generates {Node} from the given information.
@@ -15,8 +15,8 @@ module RuboCop
15
15
  # :bar
16
16
  # ]
17
17
  #
18
- # node.loc.begin.line_span # => 1..1
19
- # node.loc.expression.line_span(exclude_end: true) # => 1...4
18
+ # node.loc.begin.line_span # => 1..1
19
+ # node.source_range.line_span(exclude_end: true) # => 1...4
20
20
  def line_span(exclude_end: false)
21
21
  ::Range.new(first_line, last_line, exclude_end)
22
22
  end
@@ -25,4 +25,4 @@ module RuboCop
25
25
  end
26
26
  end
27
27
 
28
- ::Parser::Source::Range.include ::RuboCop::AST::Ext::Range
28
+ Parser::Source::Range.include RuboCop::AST::Ext::Range
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `csend` nodes. This will be used in place of a plain
6
+ # node when the builder constructs the AST, making its methods available
7
+ # to all `csend` nodes within RuboCop.
8
+ class CsendNode < SendNode
9
+ def send_type?
10
+ false
11
+ end
12
+ end
13
+ end
14
+ end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module RuboCop
4
4
  module AST
5
- # A node extension for `kwsplat` nodes. This will be used in place of a
6
- # plain node when the builder constructs the AST, making its methods
7
- # available to all `kwsplat` nodes within RuboCop.
5
+ # A node extension for `kwsplat` and `forwarded_kwrestarg` nodes. This will be used in
6
+ # place of a plain node when the builder constructs the AST, making its methods available to
7
+ # all `kwsplat` and `forwarded_kwrestarg` nodes within RuboCop.
8
8
  class KeywordSplatNode < Node
9
9
  include HashElementNode
10
10
 
@@ -41,6 +41,13 @@ module RuboCop
41
41
  def node_parts
42
42
  [self, self]
43
43
  end
44
+
45
+ # This provides `forwarded_kwrestarg` node to return true to be compatible with `kwsplat` node.
46
+ #
47
+ # @return [true]
48
+ def kwsplat_type?
49
+ true
50
+ end
44
51
  end
45
52
  end
46
53
  end
@@ -36,7 +36,10 @@ module RuboCop
36
36
  #
37
37
  # @return [Array<Node>] an array of child nodes
38
38
  def child_nodes
39
- each_child_node.to_a
39
+ # Iterate child nodes directly to avoid allocating an Enumerator.
40
+ nodes = []
41
+ each_child_node { |node| nodes << node }
42
+ nodes
40
43
  end
41
44
 
42
45
  # Calls the given block for each descendant node with depth first order.
@@ -102,7 +105,9 @@ module RuboCop
102
105
  protected
103
106
 
104
107
  def visit_descendants(types, &block)
105
- each_child_node do |child|
108
+ children.each do |child|
109
+ next unless child.is_a?(::AST::Node)
110
+
106
111
  yield child if types.empty? || types.include?(child.type)
107
112
  child.visit_descendants(types, &block)
108
113
  end
@@ -5,7 +5,7 @@ module RuboCop
5
5
  # Common functionality for nodes that are a kind of method dispatch:
6
6
  # `send`, `csend`, `super`, `zsuper`, `yield`, `defined?`,
7
7
  # and (modern only): `index`, `indexasgn`, `lambda`
8
- module MethodDispatchNode
8
+ module MethodDispatchNode # rubocop:disable Metrics/ModuleLength
9
9
  extend NodePattern::Macros
10
10
  include MethodIdentifierPredicates
11
11
 
@@ -28,6 +28,17 @@ module RuboCop
28
28
  node_parts[1]
29
29
  end
30
30
 
31
+ # The source range for the method name or keyword that dispatches this call.
32
+ #
33
+ # @return [Parser::Source::Range] the source range for the method name or keyword
34
+ def selector
35
+ if loc.respond_to? :keyword
36
+ loc.keyword
37
+ else
38
+ loc.selector
39
+ end
40
+ end
41
+
31
42
  # The `block` or `numblock` node associated with this method dispatch, if any.
32
43
  #
33
44
  # @return [BlockNode, nil] the `block` or `numblock` node associated with this method
@@ -147,7 +158,7 @@ module RuboCop
147
158
  #
148
159
  # @return [Boolean] whether the method is the implicit form of `#call`
149
160
  def implicit_call?
150
- method?(:call) && !loc.selector
161
+ method?(:call) && !selector
151
162
  end
152
163
 
153
164
  # Whether this method dispatch has an explicit block.
@@ -211,7 +222,7 @@ module RuboCop
211
222
  #
212
223
  # @return [Boolean] whether this method is a lambda literal
213
224
  def lambda_literal?
214
- block_literal? && loc.expression && loc.expression.source == '->'
225
+ loc.expression.source == '->' && block_literal?
215
226
  end
216
227
 
217
228
  # Checks whether this is a unary operation.
@@ -222,9 +233,9 @@ module RuboCop
222
233
  #
223
234
  # @return [Boolean] whether this method is a unary operation
224
235
  def unary_operation?
225
- return false unless loc.selector
236
+ return false unless selector
226
237
 
227
- operator_method? && loc.expression.begin_pos == loc.selector.begin_pos
238
+ operator_method? && loc.expression.begin_pos == selector.begin_pos
228
239
  end
229
240
 
230
241
  # Checks whether this is a binary operation.
@@ -233,11 +244,11 @@ module RuboCop
233
244
  #
234
245
  # foo + bar
235
246
  #
236
- # @return [Bookean] whether this method is a binary operation
247
+ # @return [Boolean] whether this method is a binary operation
237
248
  def binary_operation?
238
- return false unless loc.selector
249
+ return false unless selector
239
250
 
240
- operator_method? && loc.expression.begin_pos != loc.selector.begin_pos
251
+ operator_method? && loc.expression.begin_pos != selector.begin_pos
241
252
  end
242
253
 
243
254
  private
@@ -249,7 +260,7 @@ module RuboCop
249
260
  ^{ # or the parent is...
250
261
  sclass class module class_constructor? # a class-like node
251
262
  [ { # or some "wrapper"
252
- kwbegin begin block
263
+ kwbegin begin block numblock
253
264
  (if _condition <%0 _>) # note: we're excluding the condition of `if` nodes
254
265
  }
255
266
  #in_macro_scope? # that is itself in a macro scope
@@ -82,9 +82,17 @@ module RuboCop
82
82
  # and optimizes other calls
83
83
  module RestArguments
84
84
  include ParameterizedNode
85
+
86
+ EMPTY_ARGUMENTS = [].freeze
87
+
85
88
  # @return [Array<Node>] arguments, if any
86
89
  def arguments
87
- children[first_argument_index..-1].freeze
90
+ if arguments?
91
+ children.drop(first_argument_index).freeze
92
+ else
93
+ # Skip unneeded Array allocation.
94
+ EMPTY_ARGUMENTS
95
+ end
88
96
  end
89
97
 
90
98
  # A shorthand for getting the first argument of the node.
@@ -11,6 +11,7 @@ module RuboCop
11
11
  i: Regexp::IGNORECASE,
12
12
  m: Regexp::MULTILINE,
13
13
  n: Regexp::NOENCODING,
14
+ u: Regexp::FIXEDENCODING,
14
15
  o: 0
15
16
  }.freeze
16
17
  private_constant :OPTIONS
@@ -87,6 +88,11 @@ module RuboCop
87
88
  regopt_include?(:n)
88
89
  end
89
90
 
91
+ # @return [Bool] if regexp uses the fixed-encoding regopt
92
+ def fixed_encoding?
93
+ regopt_include?(:u)
94
+ end
95
+
90
96
  private
91
97
 
92
98
  def regopt_include?(option)
@@ -15,6 +15,10 @@ module RuboCop
15
15
  (_ _ _ _ ...)]
16
16
  PATTERN
17
17
 
18
+ def send_type?
19
+ true
20
+ end
21
+
18
22
  private
19
23
 
20
24
  def first_argument_index
@@ -8,6 +8,10 @@ module RuboCop
8
8
  class StrNode < Node
9
9
  include BasicLiteralNode
10
10
 
11
+ def character_literal?
12
+ loc.respond_to?(:begin) && loc.begin && loc.begin.is?('?')
13
+ end
14
+
11
15
  def heredoc?
12
16
  loc.is_a?(Parser::Source::Map::Heredoc)
13
17
  end
@@ -84,8 +84,12 @@ module RuboCop
84
84
  LITERAL_RECURSIVE_TYPES = (OPERATOR_KEYWORDS + COMPOSITE_LITERALS + %i[begin pair]).freeze
85
85
  private_constant :LITERAL_RECURSIVE_METHODS, :LITERAL_RECURSIVE_TYPES
86
86
 
87
+ EMPTY_CHILDREN = [].freeze
88
+ EMPTY_PROPERTIES = {}.freeze
89
+ private_constant :EMPTY_CHILDREN, :EMPTY_PROPERTIES
90
+
87
91
  # @see https://www.rubydoc.info/gems/ast/AST/Node:initialize
88
- def initialize(type, children = [], properties = {})
92
+ def initialize(type, children = EMPTY_CHILDREN, properties = EMPTY_PROPERTIES)
89
93
  @mutable_attributes = {}
90
94
 
91
95
  # ::AST::Node#initialize freezes itself.
@@ -101,11 +105,19 @@ module RuboCop
101
105
  end
102
106
  end
103
107
 
104
- Parser::Meta::NODE_TYPES.each do |node_type|
108
+ (Parser::Meta::NODE_TYPES - [:send]).each do |node_type|
105
109
  method_name = "#{node_type.to_s.gsub(/\W/, '')}_type?"
106
- define_method(method_name) do
107
- type == node_type
108
- end
110
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
111
+ def #{method_name} # def block_type?
112
+ @type == :#{node_type} # @type == :block
113
+ end # end
114
+ RUBY
115
+ end
116
+
117
+ # Most nodes are of 'send' type, so this method is defined
118
+ # separately to make this check as fast as possible.
119
+ def send_type?
120
+ false
109
121
  end
110
122
 
111
123
  # Returns the parent node, or `nil` if the receiver is a root node.
@@ -194,7 +206,7 @@ module RuboCop
194
206
  def right_siblings
195
207
  return [].freeze unless parent
196
208
 
197
- parent.children[sibling_index + 1..-1].freeze
209
+ parent.children[sibling_index + 1..].freeze
198
210
  end
199
211
 
200
212
  # Common destructuring method. This can be used to normalize
@@ -203,9 +215,7 @@ module RuboCop
203
215
  # destructuring method.
204
216
  #
205
217
  # @return [Array<Node>] the different parts of the ndde
206
- def node_parts
207
- to_a
208
- end
218
+ alias node_parts to_a
209
219
 
210
220
  # Calls the given block for each ancestor node from parent to root.
211
221
  # If no block is given, an `Enumerator` is returned.
@@ -500,8 +510,14 @@ module RuboCop
500
510
 
501
511
  # @!method class_constructor?(node = self)
502
512
  def_node_matcher :class_constructor?, <<~PATTERN
503
- { (send #global_const?({:Class :Module :Struct}) :new ...)
504
- (block (send #global_const?({:Class :Module :Struct}) :new ...) ...)}
513
+ {
514
+ (send #global_const?({:Class :Module :Struct}) :new ...)
515
+ (send #global_const?(:Data) :define ...)
516
+ ({block numblock} {
517
+ (send #global_const?({:Class :Module :Struct}) :new ...)
518
+ (send #global_const?(:Data) :define ...)
519
+ } ...)
520
+ }
505
521
  PATTERN
506
522
 
507
523
  # @deprecated Use `:class_constructor?`
@@ -38,7 +38,7 @@ module RuboCop
38
38
  end
39
39
 
40
40
  def visit_set
41
- set = node.children.map(&:child).to_set.freeze
41
+ set = node.children.to_set(&:child).freeze
42
42
  NodePattern::Sets[set]
43
43
  end
44
44
 
@@ -20,8 +20,8 @@ module RuboCop
20
20
  end
21
21
 
22
22
  if var == :forbidden_unification
23
- raise Invalid, "Wildcard #{name} was first seen in a subset of a" \
24
- " union and can't be used outside that union"
23
+ raise Invalid, "Wildcard #{name} was first seen in a subset of a " \
24
+ "union and can't be used outside that union"
25
25
  end
26
26
  var
27
27
  end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  # @return [String] a Rainbow colorized version of ruby
48
48
  def colorize(color_scheme = COLOR_SCHEME)
49
49
  map = color_map(color_scheme)
50
- ast.loc.expression.source_buffer.source.chars.map.with_index do |char, i|
50
+ ast.source_range.source_buffer.source.chars.map.with_index do |char, i|
51
51
  Rainbow(char).color(map[i])
52
52
  end.join
53
53
  end
@@ -371,13 +371,13 @@ module RuboCop
371
371
 
372
372
  # @return [Hash] of {subcompiler => code}
373
373
  def compile_union_forks
374
- compiler.each_union(node.children).map do |child|
374
+ compiler.each_union(node.children).to_h do |child|
375
375
  subsequence_terms = child.is_a?(Node::Subsequence) ? child.children : [child]
376
376
  fork = dup
377
377
  code = fork.compile_terms(subsequence_terms, @remaining_arity)
378
378
  @in_sync = false if @cur_index != :variadic_mode
379
379
  [fork, code]
380
- end.to_h # we could avoid map if RUBY_VERSION >= 2.6...
380
+ end
381
381
  end
382
382
 
383
383
  # Modifies in place `forks` to insure that `cur_{child|index}_var` are ok
@@ -75,6 +75,10 @@ module RuboCop
75
75
  self.class.new(type, children, { location: location })
76
76
  end
77
77
 
78
+ def source_range
79
+ loc.expression
80
+ end
81
+
78
82
  INT_TO_RANGE = Hash.new { |h, k| h[k] = k..k }
79
83
  private_constant :INT_TO_RANGE
80
84
 
@@ -116,7 +120,7 @@ module RuboCop
116
120
 
117
121
  def initialize(type, children = [], properties = {})
118
122
  if (replace = children.first.in_sequence_head)
119
- children = [*replace, *children[1..-1]]
123
+ children = [*replace, *children[1..]]
120
124
  end
121
125
 
122
126
  super
@@ -130,7 +134,7 @@ module RuboCop
130
134
  end
131
135
 
132
136
  def arg_list
133
- children[1..-1]
137
+ children[1..]
134
138
  end
135
139
  end
136
140
  FunctionCall = Predicate
@@ -212,7 +216,7 @@ module RuboCop
212
216
 
213
217
  return unless (replace = children.first.in_sequence_head)
214
218
 
215
- [with(children: [*replace, *children[1..-1]])]
219
+ [with(children: [*replace, *children[1..]])]
216
220
  end
217
221
  end
218
222
 
@@ -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.5.1
4
+ # This file is automatically generated by Racc 1.6.2
5
5
  # from Racc grammar file "".
6
6
  #
7
7
 
@@ -48,12 +48,12 @@ module RuboCop
48
48
 
49
49
  def emit_unary_op(type, operator_t = nil, *children)
50
50
  children[-1] = children[-1].first if children[-1].is_a?(Array) # token?
51
- map = source_map(children.first.loc.expression, operator_t: operator_t)
51
+ map = source_map(children.first.source_range, operator_t: operator_t)
52
52
  n(type, children, map)
53
53
  end
54
54
 
55
55
  def emit_list(type, begin_t, children, end_t)
56
- expr = children.first.loc.expression.join(children.last.loc.expression)
56
+ expr = children.first.source_range.join(children.last.source_range)
57
57
  map = source_map(expr, begin_t: begin_t, end_t: end_t)
58
58
  n(type, children, map)
59
59
  end
@@ -79,8 +79,7 @@ module RuboCop
79
79
  end
80
80
 
81
81
  def join_exprs(left_expr, right_expr)
82
- left_expr.loc.expression
83
- .join(right_expr.loc.expression)
82
+ left_expr.source_range.join(right_expr.source_range)
84
83
  end
85
84
 
86
85
  def source_map(token_or_range, begin_t: nil, end_t: nil, operator_t: nil, selector_t: nil)
@@ -54,6 +54,22 @@ module RuboCop
54
54
 
55
55
  VAR = 'node'
56
56
 
57
+ # Yields its argument and any descendants, depth-first.
58
+ #
59
+ def self.descend(element, &block)
60
+ return to_enum(__method__, element) unless block
61
+
62
+ yield element
63
+
64
+ if element.is_a?(::RuboCop::AST::Node)
65
+ element.children.each do |child|
66
+ descend(child, &block)
67
+ end
68
+ end
69
+
70
+ nil
71
+ end
72
+
57
73
  attr_reader :pattern, :ast, :match_code
58
74
 
59
75
  def_delegators :@compiler, :captures, :named_parameters, :positional_parameters
@@ -100,22 +116,6 @@ module RuboCop
100
116
  initialize(coder['pattern'])
101
117
  end
102
118
 
103
- # Yields its argument and any descendants, depth-first.
104
- #
105
- def self.descend(element, &block)
106
- return to_enum(__method__, element) unless block
107
-
108
- yield element
109
-
110
- if element.is_a?(::RuboCop::AST::Node)
111
- element.children.each do |child|
112
- descend(child, &block)
113
- end
114
- end
115
-
116
- nil
117
- end
118
-
119
119
  def freeze
120
120
  @match_code.freeze
121
121
  @compiler.freeze
@@ -12,6 +12,9 @@ module RuboCop
12
12
  # @api private
13
13
  STRING_SOURCE_NAME = '(string)'
14
14
 
15
+ INVALID_LEVELS = %i[error fatal].freeze
16
+ private_constant :INVALID_LEVELS
17
+
15
18
  attr_reader :path, :buffer, :ast, :comments, :tokens, :diagnostics,
16
19
  :parser_error, :raw_source, :ruby_version
17
20
 
@@ -20,14 +23,11 @@ module RuboCop
20
23
  new(file, ruby_version, path)
21
24
  end
22
25
 
23
- INVALID_LEVELS = %i[error fatal].freeze
24
- private_constant :INVALID_LEVELS
25
-
26
26
  def initialize(source, ruby_version, path = nil)
27
27
  # Defaults source encoding to UTF-8, regardless of the encoding it has
28
28
  # been read with, which could be non-utf8 depending on the default
29
29
  # external encoding.
30
- source.force_encoding(Encoding::UTF_8) unless source.encoding == Encoding::UTF_8
30
+ (+source).force_encoding(Encoding::UTF_8) unless source.encoding == Encoding::UTF_8
31
31
 
32
32
  @raw_source = source
33
33
  @path = path
@@ -226,9 +226,24 @@ module RuboCop
226
226
  [ast, comments, tokens]
227
227
  end
228
228
 
229
- # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
229
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
230
230
  def parser_class(ruby_version)
231
231
  case ruby_version
232
+ when 1.9
233
+ require 'parser/ruby19'
234
+ Parser::Ruby19
235
+ when 2.0
236
+ require 'parser/ruby20'
237
+ Parser::Ruby20
238
+ when 2.1
239
+ require 'parser/ruby21'
240
+ Parser::Ruby21
241
+ when 2.2
242
+ require 'parser/ruby22'
243
+ Parser::Ruby22
244
+ when 2.3
245
+ require 'parser/ruby23'
246
+ Parser::Ruby23
232
247
  when 2.4
233
248
  require 'parser/ruby24'
234
249
  Parser::Ruby24
@@ -250,12 +265,15 @@ module RuboCop
250
265
  when 3.2
251
266
  require 'parser/ruby32'
252
267
  Parser::Ruby32
268
+ when 3.3
269
+ require 'parser/ruby33'
270
+ Parser::Ruby33
253
271
  else
254
272
  raise ArgumentError,
255
273
  "RuboCop found unknown Ruby version: #{ruby_version.inspect}"
256
274
  end
257
275
  end
258
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
276
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
259
277
 
260
278
  def create_parser(ruby_version)
261
279
  builder = RuboCop::AST::Builder.new
@@ -9,7 +9,8 @@ module RuboCop
9
9
  module Sexp
10
10
  # Creates a {Node} with type `type` and children `children`.
11
11
  def s(type, *children)
12
- Node.new(type, children)
12
+ klass = Builder::NODE_MAP[type] || Node
13
+ klass.new(type, children)
13
14
  end
14
15
  end
15
16
  end
@@ -4,6 +4,8 @@ module RuboCop
4
4
  module AST
5
5
  # A basic wrapper around Parser's tokens.
6
6
  class Token
7
+ LEFT_PAREN_TYPES = %i[tLPAREN tLPAREN2].freeze
8
+
7
9
  attr_reader :pos, :type, :text
8
10
 
9
11
  def self.from_parser_token(parser_token)
@@ -89,7 +91,7 @@ module RuboCop
89
91
  end
90
92
 
91
93
  def left_parens?
92
- %i[tLPAREN tLPAREN2].include?(type)
94
+ LEFT_PAREN_TYPES.include?(type)
93
95
  end
94
96
 
95
97
  def right_parens?
@@ -100,6 +102,14 @@ module RuboCop
100
102
  type == :tCOMMA
101
103
  end
102
104
 
105
+ def dot?
106
+ type == :tDOT
107
+ end
108
+
109
+ def regexp_dots?
110
+ %i[tDOT2 tDOT3].include?(type)
111
+ end
112
+
103
113
  def rescue_modifier?
104
114
  type == :kRESCUE_MOD
105
115
  end
@@ -111,6 +121,10 @@ module RuboCop
111
121
  def equal_sign?
112
122
  %i[tEQL tOP_ASGN].include?(type)
113
123
  end
124
+
125
+ def new_line?
126
+ type == :tNL
127
+ end
114
128
  end
115
129
  end
116
130
  end
@@ -34,7 +34,7 @@ module RuboCop
34
34
 
35
35
  def def_callback(type, *signature,
36
36
  arity: signature.size..signature.size,
37
- arity_check: ENV['RUBOCOP_DEBUG'] && self.arity_check(arity),
37
+ arity_check: ENV.fetch('RUBOCOP_DEBUG', nil) && self.arity_check(arity),
38
38
  body: self.body(signature, arity_check))
39
39
  type, *aliases = type
40
40
  lineno = caller_locations(1, 1).first.lineno
@@ -75,7 +75,8 @@ module RuboCop
75
75
  ### arity == 0
76
76
  no_children = %i[true false nil self cbase zsuper redo retry
77
77
  forward_args forwarded_args match_nil_pattern
78
- forward_arg lambda empty_else kwnilarg
78
+ forward_arg forwarded_restarg forwarded_kwrestarg
79
+ lambda empty_else kwnilarg
79
80
  __FILE__ __LINE__ __ENCODING__]
80
81
 
81
82
  ### arity == 0..1
@@ -162,7 +163,7 @@ module RuboCop
162
163
  ### generic processing of any other node (forward compatibility)
163
164
  defined = instance_methods(false)
164
165
  .grep(/^on_/)
165
- .map { |s| s.to_s[3..-1].to_sym } # :on_foo => :foo
166
+ .map { |s| s.to_s[3..].to_sym } # :on_foo => :foo
166
167
 
167
168
  to_define = ::Parser::Meta::NODE_TYPES.to_a
168
169
  to_define -= defined
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.17.0'
6
+ STRING = '1.29.0'
7
7
  end
8
8
  end
9
9
  end
data/lib/rubocop/ast.rb CHANGED
@@ -76,6 +76,7 @@ require_relative 'ast/node/resbody_node'
76
76
  require_relative 'ast/node/return_node'
77
77
  require_relative 'ast/node/self_class_node'
78
78
  require_relative 'ast/node/send_node'
79
+ require_relative 'ast/node/csend_node'
79
80
  require_relative 'ast/node/str_node'
80
81
  require_relative 'ast/node/dstr_node'
81
82
  require_relative 'ast/node/super_node'
@@ -91,5 +92,5 @@ require_relative 'ast/token'
91
92
  require_relative 'ast/traversal'
92
93
  require_relative 'ast/version'
93
94
 
94
- ::RuboCop::AST::NodePattern::Parser.autoload :WithMeta, "#{__dir__}/ast/node_pattern/with_meta"
95
- ::RuboCop::AST::NodePattern::Compiler.autoload :Debug, "#{__dir__}/ast/node_pattern/compiler/debug"
95
+ RuboCop::AST::NodePattern::Parser.autoload :WithMeta, "#{__dir__}/ast/node_pattern/with_meta"
96
+ RuboCop::AST::NodePattern::Compiler.autoload :Debug, "#{__dir__}/ast/node_pattern/compiler/debug"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-ast
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.17.0
4
+ version: 1.29.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: 2022-04-09 00:00:00.000000000 Z
13
+ date: 2023-06-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: parser
@@ -18,34 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: 3.1.1.0
21
+ version: 3.2.1.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 3.1.1.0
29
- - !ruby/object:Gem::Dependency
30
- name: bundler
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: 1.15.0
36
- - - "<"
37
- - !ruby/object:Gem::Version
38
- version: '3.0'
39
- type: :development
40
- prerelease: false
41
- version_requirements: !ruby/object:Gem::Requirement
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: 1.15.0
46
- - - "<"
47
- - !ruby/object:Gem::Version
48
- version: '3.0'
28
+ version: 3.2.1.0
49
29
  description: " RuboCop's Node and NodePattern classes.\n"
50
30
  email: rubocop@googlegroups.com
51
31
  executables: []
@@ -76,6 +56,7 @@ files:
76
56
  - lib/rubocop/ast/node/casgn_node.rb
77
57
  - lib/rubocop/ast/node/class_node.rb
78
58
  - lib/rubocop/ast/node/const_node.rb
59
+ - lib/rubocop/ast/node/csend_node.rb
79
60
  - lib/rubocop/ast/node/def_node.rb
80
61
  - lib/rubocop/ast/node/defined_node.rb
81
62
  - lib/rubocop/ast/node/dstr_node.rb
@@ -168,14 +149,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
168
149
  requirements:
169
150
  - - ">="
170
151
  - !ruby/object:Gem::Version
171
- version: 2.5.0
152
+ version: 2.6.0
172
153
  required_rubygems_version: !ruby/object:Gem::Requirement
173
154
  requirements:
174
155
  - - ">="
175
156
  - !ruby/object:Gem::Version
176
157
  version: '0'
177
158
  requirements: []
178
- rubygems_version: 3.3.3
159
+ rubygems_version: 3.4.1
179
160
  signing_key:
180
161
  specification_version: 4
181
162
  summary: RuboCop tools to deal with Ruby code AST.