rubocop-ast 1.30.0 → 1.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/rubocop/ast/builder.rb +8 -0
  4. data/lib/rubocop/ast/node/array_node.rb +6 -2
  5. data/lib/rubocop/ast/node/asgn_node.rb +2 -0
  6. data/lib/rubocop/ast/node/block_node.rb +2 -2
  7. data/lib/rubocop/ast/node/casgn_node.rb +4 -12
  8. data/lib/rubocop/ast/node/const_node.rb +1 -52
  9. data/lib/rubocop/ast/node/def_node.rb +1 -1
  10. data/lib/rubocop/ast/node/ensure_node.rb +23 -0
  11. data/lib/rubocop/ast/node/for_node.rb +1 -1
  12. data/lib/rubocop/ast/node/hash_node.rb +1 -1
  13. data/lib/rubocop/ast/node/if_node.rb +8 -1
  14. data/lib/rubocop/ast/node/in_pattern_node.rb +1 -1
  15. data/lib/rubocop/ast/node/keyword_begin_node.rb +44 -0
  16. data/lib/rubocop/ast/node/masgn_node.rb +63 -0
  17. data/lib/rubocop/ast/node/mixin/basic_literal_node.rb +1 -1
  18. data/lib/rubocop/ast/node/mixin/collection_node.rb +1 -1
  19. data/lib/rubocop/ast/node/mixin/constant_node.rb +62 -0
  20. data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
  21. data/lib/rubocop/ast/node/mixin/numeric_node.rb +1 -1
  22. data/lib/rubocop/ast/node/mixin/parameterized_node.rb +1 -1
  23. data/lib/rubocop/ast/node/mlhs_node.rb +29 -0
  24. data/lib/rubocop/ast/node/op_asgn_node.rb +3 -1
  25. data/lib/rubocop/ast/node/rational_node.rb +13 -0
  26. data/lib/rubocop/ast/node/str_node.rb +37 -1
  27. data/lib/rubocop/ast/node/until_node.rb +1 -1
  28. data/lib/rubocop/ast/node/var_node.rb +15 -0
  29. data/lib/rubocop/ast/node/when_node.rb +1 -1
  30. data/lib/rubocop/ast/node/while_node.rb +1 -1
  31. data/lib/rubocop/ast/node.rb +88 -32
  32. data/lib/rubocop/ast/node_pattern/compiler/binding.rb +3 -3
  33. data/lib/rubocop/ast/node_pattern/compiler/sequence_subcompiler.rb +2 -3
  34. data/lib/rubocop/ast/node_pattern/compiler.rb +1 -1
  35. data/lib/rubocop/ast/node_pattern/lexer.rex.rb +1 -2
  36. data/lib/rubocop/ast/node_pattern/node.rb +1 -2
  37. data/lib/rubocop/ast/node_pattern/parser.racc.rb +2 -2
  38. data/lib/rubocop/ast/node_pattern/parser.rb +1 -1
  39. data/lib/rubocop/ast/node_pattern.rb +1 -1
  40. data/lib/rubocop/ast/processed_source.rb +89 -59
  41. data/lib/rubocop/ast/token.rb +1 -1
  42. data/lib/rubocop/ast/traversal.rb +2 -2
  43. data/lib/rubocop/ast/utilities/simple_forwardable.rb +16 -0
  44. data/lib/rubocop/ast/version.rb +1 -1
  45. data/lib/rubocop/ast.rb +7 -1
  46. metadata +13 -7
  47. data/lib/rubocop/ast/ext/range_min_max.rb +0 -18
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module AST
5
+ # A node extension for `lvar`, `ivar`, `cvar` and `gvar` 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 assignment nodes within RuboCop.
8
+ class VarNode < Node
9
+ # @return [Symbol] The name of the variable.
10
+ def name
11
+ node_parts[0]
12
+ end
13
+ end
14
+ end
15
+ end
@@ -33,7 +33,7 @@ module RuboCop
33
33
  #
34
34
  # @return [Boolean] whether the `when` node has a `then` keyword
35
35
  def then?
36
- loc.begin&.is?('then')
36
+ loc_is?(:begin, 'then')
37
37
  end
38
38
 
39
39
  # Returns the body of the `when` node.
@@ -28,7 +28,7 @@ module RuboCop
28
28
  #
29
29
  # @return [Boolean] whether the `until` node has a `do` keyword
30
30
  def do?
31
- loc.begin&.is?('do')
31
+ loc_is?(:begin, 'do')
32
32
  end
33
33
  end
34
34
  end
@@ -88,6 +88,55 @@ module RuboCop
88
88
  EMPTY_PROPERTIES = {}.freeze
89
89
  private_constant :EMPTY_CHILDREN, :EMPTY_PROPERTIES
90
90
 
91
+ # @api private
92
+ GROUP_FOR_TYPE = {
93
+ arg: :argument,
94
+ optarg: :argument,
95
+ restarg: :argument,
96
+ kwarg: :argument,
97
+ kwoptarg: :argument,
98
+ kwrestarg: :argument,
99
+ blockarg: :argument,
100
+ forward_arg: :argument,
101
+ shardowarg: :argument,
102
+
103
+ true: :boolean,
104
+ false: :boolean,
105
+
106
+ int: :numeric,
107
+ float: :numeric,
108
+ rational: :numeric,
109
+ complex: :numeric,
110
+
111
+ irange: :range,
112
+ erange: :range,
113
+
114
+ send: :call,
115
+ csend: :call
116
+ }.freeze
117
+ private_constant :GROUP_FOR_TYPE
118
+
119
+ # Define a +recursive_?+ predicate method for the given node kind.
120
+ private_class_method def self.def_recursive_literal_predicate(kind) # rubocop:disable Metrics/MethodLength
121
+ recursive_kind = "recursive_#{kind}?"
122
+ kind_filter = "#{kind}?"
123
+
124
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
125
+ def #{recursive_kind} # def recursive_literal?
126
+ case type # case type
127
+ when :send # when :send
128
+ LITERAL_RECURSIVE_METHODS.include?(method_name) && # LITERAL_RECURSIVE_METHODS.include?(method_name) &&
129
+ receiver.send(:#{recursive_kind}) && # receiver.send(:recursive_literal?) &&
130
+ arguments.all?(&:#{recursive_kind}) # arguments.all?(&:recursive_literal?)
131
+ when LITERAL_RECURSIVE_TYPES # when LITERAL_RECURSIVE_TYPES
132
+ children.compact.all?(&:#{recursive_kind}) # children.compact.all?(&:recursive_literal?)
133
+ else # else
134
+ send(:#{kind_filter}) # send(:literal?)
135
+ end # end
136
+ end # end
137
+ RUBY
138
+ end
139
+
91
140
  # @see https://www.rubydoc.info/gems/ast/AST/Node:initialize
92
141
  def initialize(type, children = EMPTY_CHILDREN, properties = EMPTY_PROPERTIES)
93
142
  @mutable_attributes = {}
@@ -105,6 +154,16 @@ module RuboCop
105
154
  end
106
155
  end
107
156
 
157
+ # Determine if the node is one of several node types in a single query
158
+ # Allows specific single node types, as well as "grouped" types
159
+ # (e.g. `:boolean` for `:true` or `:false`)
160
+ def type?(*types)
161
+ return true if types.include?(type)
162
+
163
+ group_type = GROUP_FOR_TYPE[type]
164
+ !group_type.nil? && types.include?(group_type)
165
+ end
166
+
108
167
  (Parser::Meta::NODE_TYPES - [:send]).each do |node_type|
109
168
  method_name = "#{node_type.to_s.gsub(/\W/, '')}_type?"
110
169
  class_eval <<~RUBY, __FILE__, __LINE__ + 1
@@ -291,13 +350,12 @@ module RuboCop
291
350
  def_node_matcher :str_content, '(str $_)'
292
351
 
293
352
  def const_name
294
- return unless const_type?
353
+ return unless const_type? || casgn_type?
295
354
 
296
- namespace, name = *self
297
355
  if namespace && !namespace.cbase_type?
298
- "#{namespace.const_name}::#{name}"
356
+ "#{namespace.const_name}::#{short_name}"
299
357
  else
300
- name.to_s
358
+ short_name.to_s
301
359
  end
302
360
  end
303
361
 
@@ -326,13 +384,13 @@ module RuboCop
326
384
  # what class or module is this method/constant/etc definition in?
327
385
  # returns nil if answer cannot be determined
328
386
  ancestors = each_ancestor(:class, :module, :sclass, :casgn, :block)
329
- result = ancestors.map do |ancestor|
387
+ result = ancestors.filter_map do |ancestor|
330
388
  parent_module_name_part(ancestor) do |full_name|
331
389
  return nil unless full_name
332
390
 
333
391
  full_name
334
392
  end
335
- end.compact.reverse.join('::')
393
+ end.reverse.join('::')
336
394
  result.empty? ? 'Object' : result
337
395
  end
338
396
 
@@ -380,22 +438,11 @@ module RuboCop
380
438
  IMMUTABLE_LITERALS.include?(type)
381
439
  end
382
440
 
383
- %i[literal basic_literal].each do |kind|
384
- recursive_kind = :"recursive_#{kind}?"
385
- kind_filter = :"#{kind}?"
386
- define_method(recursive_kind) do
387
- case type
388
- when :send
389
- LITERAL_RECURSIVE_METHODS.include?(method_name) &&
390
- receiver.send(recursive_kind) &&
391
- arguments.all?(&recursive_kind)
392
- when LITERAL_RECURSIVE_TYPES
393
- children.compact.all?(&recursive_kind)
394
- else
395
- send(kind_filter)
396
- end
397
- end
398
- end
441
+ # @!macro [attach] def_recursive_literal_predicate
442
+ # @!method recursive_$1?
443
+ # @return [Boolean]
444
+ def_recursive_literal_predicate :literal
445
+ def_recursive_literal_predicate :basic_literal
399
446
 
400
447
  def variable?
401
448
  VARIABLES.include?(type)
@@ -450,11 +497,11 @@ module RuboCop
450
497
  end
451
498
 
452
499
  def parenthesized_call?
453
- loc.respond_to?(:begin) && loc.begin && loc.begin.is?('(')
500
+ loc_is?(:begin, '(')
454
501
  end
455
502
 
456
503
  def call_type?
457
- send_type? || csend_type?
504
+ GROUP_FOR_TYPE[type] == :call
458
505
  end
459
506
 
460
507
  def chained?
@@ -466,27 +513,38 @@ module RuboCop
466
513
  end
467
514
 
468
515
  def argument_type?
469
- ARGUMENT_TYPES.include?(type)
516
+ GROUP_FOR_TYPE[type] == :argument
470
517
  end
471
518
 
472
519
  def boolean_type?
473
- true_type? || false_type?
520
+ GROUP_FOR_TYPE[type] == :boolean
474
521
  end
475
522
 
476
523
  def numeric_type?
477
- int_type? || float_type? || rational_type? || complex_type?
524
+ GROUP_FOR_TYPE[type] == :numeric
478
525
  end
479
526
 
480
527
  def range_type?
481
- irange_type? || erange_type?
528
+ GROUP_FOR_TYPE[type] == :range
482
529
  end
483
530
 
484
531
  def guard_clause?
485
- node = and_type? || or_type? ? rhs : self
532
+ node = operator_keyword? ? rhs : self
486
533
 
487
534
  node.match_guard_clause?
488
535
  end
489
536
 
537
+ # Shortcut to safely test a particular location, even if
538
+ # this location does not exist or is `nil`
539
+ def loc_is?(which_loc, str)
540
+ return false unless loc.respond_to?(which_loc)
541
+
542
+ location = loc.public_send(which_loc)
543
+ return false unless location
544
+
545
+ location.is?(str)
546
+ end
547
+
490
548
  # @!method match_guard_clause?(node = self)
491
549
  def_node_matcher :match_guard_clause?, <<~PATTERN
492
550
  [${(send nil? {:raise :fail} ...) return break next} single_line?]
@@ -547,8 +605,7 @@ module RuboCop
547
605
  # So, does the return value of this node matter? If we changed it to
548
606
  # `(...; nil)`, might that affect anything?
549
607
  #
550
- # rubocop:disable Metrics/MethodLength
551
- def value_used?
608
+ def value_used? # rubocop:disable Metrics/MethodLength
552
609
  # Be conservative and return true if we're not sure.
553
610
  return false if parent.nil?
554
611
 
@@ -569,7 +626,6 @@ module RuboCop
569
626
  true
570
627
  end
571
628
  end
572
- # rubocop:enable Metrics/MethodLength
573
629
 
574
630
  # Some expressions are evaluated for their value, some for their side
575
631
  # effects, and some for both.
@@ -26,8 +26,9 @@ module RuboCop
26
26
  var
27
27
  end
28
28
 
29
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
30
- def union_bind(enum)
29
+ # Yields for each branch of the given union, forbidding unification of
30
+ # bindings which only appear in a subset of the union.
31
+ def union_bind(enum) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
31
32
  # We need to reset @bound before each branch is processed.
32
33
  # Moreover we need to keep track of newly encountered wildcards.
33
34
  # Var `newly_bound_intersection` will hold those that are encountered
@@ -62,7 +63,6 @@ module RuboCop
62
63
 
63
64
  result
64
65
  end
65
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
66
66
 
67
67
  private
68
68
 
@@ -13,8 +13,8 @@ module RuboCop
13
13
  # Doc on how this fits in the compiling process:
14
14
  # /docs/modules/ROOT/pages/node_pattern.adoc
15
15
  #
16
- # rubocop:disable Metrics/ClassLength
17
- class SequenceSubcompiler < Subcompiler
16
+ class SequenceSubcompiler < Subcompiler # rubocop:disable Metrics/ClassLength
17
+ # Shift of 1 from standard Ruby indices
18
18
  DELTA = 1
19
19
  POSITIVE = :positive?.to_proc
20
20
  private_constant :POSITIVE
@@ -413,7 +413,6 @@ module RuboCop
413
413
  @in_sync = sub_compilers.all?(&:in_sync)
414
414
  end
415
415
  end
416
- # rubocop:enable Metrics/ClassLength
417
416
  end
418
417
  end
419
418
  end
@@ -9,7 +9,7 @@ module RuboCop
9
9
  # Doc on how this fits in the compiling process:
10
10
  # /docs/modules/ROOT/pages/node_pattern.adoc
11
11
  class Compiler
12
- extend Forwardable
12
+ extend SimpleForwardable
13
13
  attr_reader :captures, :named_parameters, :positional_parameters, :binding
14
14
 
15
15
  def initialize
@@ -2,7 +2,7 @@
2
2
  # encoding: UTF-8
3
3
  #--
4
4
  # This file is automatically generated. Do not modify it.
5
- # Generated by: oedipus_lex version 2.6.1.
5
+ # Generated by: oedipus_lex version 2.6.2.
6
6
  # Source: lib/rubocop/ast/node_pattern/lexer.rex
7
7
  #++
8
8
 
@@ -70,7 +70,6 @@ class RuboCop::AST::NodePattern::LexerRex
70
70
  yield
71
71
  end
72
72
 
73
-
74
73
  ##
75
74
  # The current scanner class. Must be overridden in subclasses.
76
75
 
@@ -5,9 +5,8 @@ module RuboCop
5
5
  class NodePattern
6
6
  # Base class for AST Nodes of a `NodePattern`
7
7
  class Node < ::Parser::AST::Node
8
- extend Forwardable
8
+ extend SimpleForwardable
9
9
  include ::RuboCop::AST::Descendence
10
- using Ext::RangeMinMax
11
10
 
12
11
  MATCHES_WITHIN_SET = %i[symbol number string].to_set.freeze
13
12
  private_constant :MATCHES_WITHIN_SET
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  #
3
3
  # DO NOT MODIFY!!!!
4
- # This file is automatically generated by Racc 1.7.1
5
- # from Racc grammar file "".
4
+ # This file is automatically generated by Racc 1.8.1
5
+ # from Racc grammar file "parser.y".
6
6
  #
7
7
 
8
8
  require 'racc/parser.rb'
@@ -11,7 +11,7 @@ module RuboCop
11
11
  # Doc on how this fits in the compiling process:
12
12
  # /docs/modules/ROOT/pages/node_pattern.adoc
13
13
  class Parser < Racc::Parser
14
- extend Forwardable
14
+ extend SimpleForwardable
15
15
 
16
16
  Builder = NodePattern::Builder
17
17
  Lexer = NodePattern::Lexer
@@ -48,7 +48,7 @@ module RuboCop
48
48
  end
49
49
  end
50
50
 
51
- extend Forwardable
51
+ extend SimpleForwardable
52
52
  include MethodDefiner
53
53
  Invalid = Class.new(StandardError)
54
54
 
@@ -2,28 +2,36 @@
2
2
 
3
3
  require 'digest/sha1'
4
4
 
5
- # rubocop:disable Metrics/ClassLength
6
5
  module RuboCop
7
6
  module AST
8
7
  # ProcessedSource contains objects which are generated by Parser
9
8
  # and other information such as disabled lines for cops.
10
9
  # It also provides a convenient way to access source lines.
11
- class ProcessedSource
10
+ class ProcessedSource # rubocop:disable Metrics/ClassLength
12
11
  # @api private
13
12
  STRING_SOURCE_NAME = '(string)'
14
13
 
15
14
  INVALID_LEVELS = %i[error fatal].freeze
16
15
  private_constant :INVALID_LEVELS
17
16
 
17
+ PARSER_ENGINES = %i[parser_whitequark parser_prism].freeze
18
+ private_constant :PARSER_ENGINES
19
+
18
20
  attr_reader :path, :buffer, :ast, :comments, :tokens, :diagnostics,
19
- :parser_error, :raw_source, :ruby_version
21
+ :parser_error, :raw_source, :ruby_version, :parser_engine
20
22
 
21
- def self.from_file(path, ruby_version)
23
+ def self.from_file(path, ruby_version, parser_engine: :parser_whitequark)
22
24
  file = File.read(path, mode: 'rb')
23
- new(file, ruby_version, path)
25
+ new(file, ruby_version, path, parser_engine: parser_engine)
24
26
  end
25
27
 
26
- def initialize(source, ruby_version, path = nil)
28
+ def initialize(source, ruby_version, path = nil, parser_engine: :parser_whitequark)
29
+ parser_engine = parser_engine.to_sym
30
+ unless PARSER_ENGINES.include?(parser_engine)
31
+ raise ArgumentError, 'The keyword argument `parser_engine` accepts `parser_whitequark` ' \
32
+ "or `parser_prism`, but `#{parser_engine}` was passed."
33
+ end
34
+
27
35
  # Defaults source encoding to UTF-8, regardless of the encoding it has
28
36
  # been read with, which could be non-utf8 depending on the default
29
37
  # external encoding.
@@ -33,9 +41,10 @@ module RuboCop
33
41
  @path = path
34
42
  @diagnostics = []
35
43
  @ruby_version = ruby_version
44
+ @parser_engine = parser_engine
36
45
  @parser_error = nil
37
46
 
38
- parse(source, ruby_version)
47
+ parse(source, ruby_version, parser_engine)
39
48
  end
40
49
 
41
50
  def ast_with_comments
@@ -193,13 +202,13 @@ module RuboCop
193
202
  end
194
203
  end
195
204
 
196
- def parse(source, ruby_version)
205
+ def parse(source, ruby_version, parser_engine)
197
206
  buffer_name = @path || STRING_SOURCE_NAME
198
207
  @buffer = Parser::Source::Buffer.new(buffer_name, 1)
199
208
 
200
209
  begin
201
210
  @buffer.source = source
202
- rescue EncodingError => e
211
+ rescue EncodingError, Parser::UnknownEncodingInMagicComment => e
203
212
  @parser_error = e
204
213
  @ast = nil
205
214
  @comments = []
@@ -207,7 +216,7 @@ module RuboCop
207
216
  return
208
217
  end
209
218
 
210
- @ast, @comments, @tokens = tokenize(create_parser(ruby_version))
219
+ @ast, @comments, @tokens = tokenize(create_parser(ruby_version, parser_engine))
211
220
  end
212
221
 
213
222
  def tokenize(parser)
@@ -226,59 +235,81 @@ module RuboCop
226
235
  [ast, comments, tokens]
227
236
  end
228
237
 
229
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
230
- def parser_class(ruby_version)
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
247
- when 2.4
248
- require 'parser/ruby24'
249
- Parser::Ruby24
250
- when 2.5
251
- require 'parser/ruby25'
252
- Parser::Ruby25
253
- when 2.6
254
- require 'parser/ruby26'
255
- Parser::Ruby26
256
- when 2.7
257
- require 'parser/ruby27'
258
- Parser::Ruby27
259
- when 2.8, 3.0
260
- require 'parser/ruby30'
261
- Parser::Ruby30
262
- when 3.1
263
- require 'parser/ruby31'
264
- Parser::Ruby31
265
- when 3.2
266
- require 'parser/ruby32'
267
- Parser::Ruby32
268
- when 3.3
269
- require 'parser/ruby33'
270
- Parser::Ruby33
271
- else
272
- raise ArgumentError,
273
- "RuboCop found unknown Ruby version: #{ruby_version.inspect}"
238
+ def parser_class(ruby_version, parser_engine) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
239
+ case parser_engine
240
+ when :parser_whitequark
241
+ case ruby_version
242
+ when 1.9
243
+ require 'parser/ruby19'
244
+ Parser::Ruby19
245
+ when 2.0
246
+ require 'parser/ruby20'
247
+ Parser::Ruby20
248
+ when 2.1
249
+ require 'parser/ruby21'
250
+ Parser::Ruby21
251
+ when 2.2
252
+ require 'parser/ruby22'
253
+ Parser::Ruby22
254
+ when 2.3
255
+ require 'parser/ruby23'
256
+ Parser::Ruby23
257
+ when 2.4
258
+ require 'parser/ruby24'
259
+ Parser::Ruby24
260
+ when 2.5
261
+ require 'parser/ruby25'
262
+ Parser::Ruby25
263
+ when 2.6
264
+ require 'parser/ruby26'
265
+ Parser::Ruby26
266
+ when 2.7
267
+ require 'parser/ruby27'
268
+ Parser::Ruby27
269
+ when 2.8, 3.0
270
+ require 'parser/ruby30'
271
+ Parser::Ruby30
272
+ when 3.1
273
+ require 'parser/ruby31'
274
+ Parser::Ruby31
275
+ when 3.2
276
+ require 'parser/ruby32'
277
+ Parser::Ruby32
278
+ when 3.3
279
+ require 'parser/ruby33'
280
+ Parser::Ruby33
281
+ when 3.4
282
+ require 'parser/ruby34'
283
+ Parser::Ruby34
284
+ else
285
+ raise ArgumentError, "RuboCop found unknown Ruby version: #{ruby_version.inspect}"
286
+ end
287
+ when :parser_prism
288
+ begin
289
+ require 'prism'
290
+ rescue LoadError
291
+ warn "Error: Unable to load Prism. Add `gem 'prism'` to your Gemfile."
292
+ exit!
293
+ end
294
+
295
+ case ruby_version
296
+ when 3.3
297
+ require 'prism/translation/parser33'
298
+ Prism::Translation::Parser33
299
+ when 3.4
300
+ require 'prism/translation/parser34'
301
+ Prism::Translation::Parser34
302
+ else
303
+ raise ArgumentError, 'RuboCop supports target Ruby versions 3.3 and above with Prism. ' \
304
+ "Specified target Ruby version: #{ruby_version.inspect}"
305
+ end
274
306
  end
275
307
  end
276
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
277
308
 
278
- def create_parser(ruby_version)
309
+ def create_parser(ruby_version, parser_engine)
279
310
  builder = RuboCop::AST::Builder.new
280
311
 
281
- parser_class(ruby_version).new(builder).tap do |parser|
312
+ parser_class(ruby_version, parser_engine).new(builder).tap do |parser|
282
313
  # On JRuby there's a risk that we hang in tokenize() if we
283
314
  # don't set the all errors as fatal flag. The problem is caused by a bug
284
315
  # in Racc that is discussed in issue #93 of the whitequark/parser
@@ -311,4 +342,3 @@ module RuboCop
311
342
  end
312
343
  end
313
344
  end
314
- # rubocop:enable Metrics/ClassLength
@@ -83,7 +83,7 @@ module RuboCop
83
83
  end
84
84
 
85
85
  def left_curly_brace?
86
- type == :tLCURLY
86
+ type == :tLCURLY || type == :tLAMBEG
87
87
  end
88
88
 
89
89
  def right_curly_brace?
@@ -38,14 +38,14 @@ module RuboCop
38
38
  body: self.body(signature, arity_check))
39
39
  type, *aliases = type
40
40
  lineno = caller_locations(1, 1).first.lineno
41
- module_eval(<<~RUBY, __FILE__, lineno) # rubocop:disable Style/EvalWithLocation
41
+ module_eval(<<~RUBY, __FILE__, lineno)
42
42
  def on_#{type}(node) # def on_send(node)
43
43
  #{body} # # body ...
44
44
  nil # nil
45
45
  end # end
46
46
  RUBY
47
47
  aliases.each do |m|
48
- alias_method "on_#{m}", "on_#{type}"
48
+ alias_method :"on_#{m}", :"on_#{type}"
49
49
  end
50
50
  end
51
51
 
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # Similar to `Forwardable#def_delegators`, but simpler & faster
5
+ module SimpleForwardable
6
+ def def_delegators(accessor, *methods)
7
+ methods.each do |method|
8
+ class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
9
+ def #{method}(...) # def example(...)
10
+ #{accessor}.#{method}(...) # foo.example(...)
11
+ end # end
12
+ RUBY
13
+ end
14
+ end
15
+ end
16
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.30.0'
6
+ STRING = '1.37.0'
7
7
  end
8
8
  end
9
9
  end
data/lib/rubocop/ast.rb CHANGED
@@ -5,7 +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
+ require_relative 'ast/utilities/simple_forwardable'
9
9
  require_relative 'ast/node_pattern/method_definer'
10
10
  require_relative 'ast/node_pattern'
11
11
  require_relative 'ast/node/mixin/descendence'
@@ -27,6 +27,7 @@ require_relative 'ast/node/mixin/method_identifier_predicates'
27
27
  require_relative 'ast/node/mixin/binary_operator_node'
28
28
  require_relative 'ast/node/mixin/collection_node'
29
29
  require_relative 'ast/node/mixin/conditional_node'
30
+ require_relative 'ast/node/mixin/constant_node'
30
31
  require_relative 'ast/node/mixin/hash_element_node'
31
32
  require_relative 'ast/node/mixin/method_dispatch_node'
32
33
  require_relative 'ast/node/mixin/modifier_node'
@@ -59,8 +60,11 @@ require_relative 'ast/node/in_pattern_node'
59
60
  require_relative 'ast/node/index_node'
60
61
  require_relative 'ast/node/indexasgn_node'
61
62
  require_relative 'ast/node/int_node'
63
+ require_relative 'ast/node/keyword_begin_node'
62
64
  require_relative 'ast/node/keyword_splat_node'
63
65
  require_relative 'ast/node/lambda_node'
66
+ require_relative 'ast/node/masgn_node'
67
+ require_relative 'ast/node/mlhs_node'
64
68
  require_relative 'ast/node/module_node'
65
69
  require_relative 'ast/node/next_node'
66
70
  require_relative 'ast/node/op_asgn_node'
@@ -70,6 +74,7 @@ require_relative 'ast/node/or_node'
70
74
  require_relative 'ast/node/pair_node'
71
75
  require_relative 'ast/node/procarg0_node'
72
76
  require_relative 'ast/node/range_node'
77
+ require_relative 'ast/node/rational_node'
73
78
  require_relative 'ast/node/regexp_node'
74
79
  require_relative 'ast/node/rescue_node'
75
80
  require_relative 'ast/node/resbody_node'
@@ -82,6 +87,7 @@ require_relative 'ast/node/dstr_node'
82
87
  require_relative 'ast/node/super_node'
83
88
  require_relative 'ast/node/symbol_node'
84
89
  require_relative 'ast/node/until_node'
90
+ require_relative 'ast/node/var_node'
85
91
  require_relative 'ast/node/when_node'
86
92
  require_relative 'ast/node/while_node'
87
93
  require_relative 'ast/node/yield_node'