rubocop-ast 1.40.0 → 1.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 572b1323e4358215b5e093fa0326fb04dc3d7986746143b75bd0d58223d2dc9e
4
- data.tar.gz: 96d40dd742d28e480ca3be7dd7fd16bf9f410e7631373d4c441a74530bfc0314
3
+ metadata.gz: 724e2118bf289e457d58db38594035fb1888100577cbc82ca6e7352b2d952d24
4
+ data.tar.gz: 0f957ba53af55775cfa988490b2ea07db0022d9b3dba3d28c48a95aff64552ad
5
5
  SHA512:
6
- metadata.gz: fd75e5325a907aead5239937ee34447d16da764f1fe2a31d140c9d4f5398b4c4a81c5f88a697bb62149845fc24691b53d526cc5ac05b1060472e92fceaceefae
7
- data.tar.gz: d04d2d4dcf76bd6b23e9f6b2a44af18562d8bed8d9767b0511e58feabe762f90fba42f73869500fbe8c34ec1d0e4b6bebe74e7b3bbee18a83b284a97c05d477c
6
+ metadata.gz: db7476e8bff5a7357b8722d6a48fd185ef296e10c9e69de6e8efd76e5f281e7ad8e4c18303df1415c8219359f17fe860742fd12ae3be726f8acdeacf9afed84f
7
+ data.tar.gz: c06cf9bed363772ee88102f93685993025c03886d0f68b01d139d20c128fe4d3bd66707321431d559b75801ce84613f6c0ccf3bb19fad674482a377418134e53
@@ -32,6 +32,7 @@ module RuboCop
32
32
  gvasgn: AsgnNode,
33
33
  block: BlockNode,
34
34
  numblock: BlockNode,
35
+ itblock: BlockNode,
35
36
  break: BreakNode,
36
37
  case_match: CaseMatchNode,
37
38
  casgn: CasgnNode,
@@ -11,6 +11,8 @@ module RuboCop
11
11
  class BlockNode < Node
12
12
  include MethodIdentifierPredicates
13
13
 
14
+ IT_BLOCK_ARGUMENT = [ArgNode.new(:arg, [:it])].freeze
15
+ private_constant :IT_BLOCK_ARGUMENT
14
16
  VOID_CONTEXT_METHODS = %i[each tap].freeze
15
17
  private_constant :VOID_CONTEXT_METHODS
16
18
 
@@ -46,10 +48,10 @@ module RuboCop
46
48
  #
47
49
  # @return [Array<Node>]
48
50
  def arguments
49
- if numblock_type?
50
- [].freeze # Numbered parameters have no block arguments.
51
- else
51
+ if block_type?
52
52
  node_parts[1]
53
+ else
54
+ [].freeze # Numblocks and itblocks have no explicit block arguments.
53
55
  end
54
56
  end
55
57
 
@@ -60,6 +62,8 @@ module RuboCop
60
62
  def argument_list
61
63
  if numblock_type?
62
64
  numbered_arguments
65
+ elsif itblock_type?
66
+ IT_BLOCK_ARGUMENT
63
67
  else
64
68
  arguments.argument_list
65
69
  end
@@ -153,10 +157,7 @@ module RuboCop
153
157
 
154
158
  private
155
159
 
156
- # Numbered arguments of this `numblock`.
157
160
  def numbered_arguments
158
- return [].freeze unless numblock_type?
159
-
160
161
  max_param = children[1]
161
162
  1.upto(max_param).map do |i|
162
163
  ArgNode.new(:arg, [:"_#{i}"])
@@ -6,11 +6,24 @@ module RuboCop
6
6
  # node when the builder constructs the AST, making its methods available
7
7
  # to all `ensure` nodes within RuboCop.
8
8
  class EnsureNode < Node
9
+ DEPRECATION_WARNING_LOCATION_CACHE = [] # rubocop:disable Style/MutableConstant
10
+ private_constant :DEPRECATION_WARNING_LOCATION_CACHE
11
+
9
12
  # Returns the body of the `ensure` clause.
10
13
  #
11
14
  # @return [Node, nil] The body of the `ensure`.
12
15
  # @deprecated Use `EnsureNode#branch`
13
16
  def body
17
+ first_caller = caller(1..1).first
18
+
19
+ unless DEPRECATION_WARNING_LOCATION_CACHE.include?(first_caller)
20
+ warn '`EnsureNode#body` is deprecated and will be changed in the next major version of ' \
21
+ 'rubocop-ast. Use `EnsureNode#branch` instead to get the body of the `ensure` branch.'
22
+ warn "Called from:\n#{caller.join("\n")}\n\n"
23
+
24
+ DEPRECATION_WARNING_LOCATION_CACHE << first_caller
25
+ end
26
+
14
27
  branch
15
28
  end
16
29
 
@@ -39,10 +39,10 @@ module RuboCop
39
39
  end
40
40
  end
41
41
 
42
- # The `block` or `numblock` node associated with this method dispatch, if any.
42
+ # The `block`, `numblock`, or `itblock` node associated with this method dispatch, if any.
43
43
  #
44
- # @return [BlockNode, nil] the `block` or `numblock` node associated with this method
45
- # call or `nil`
44
+ # @return [BlockNode, nil] the `block`, `numblock`, or `itblock` node associated with this
45
+ # method call or `nil`
46
46
  def block_node
47
47
  parent if block_literal?
48
48
  end
@@ -112,7 +112,8 @@ module RuboCop
112
112
  csend: :call,
113
113
 
114
114
  block: :any_block,
115
- numblock: :any_block
115
+ numblock: :any_block,
116
+ itblock: :any_block
116
117
  }.freeze
117
118
  private_constant :GROUP_FOR_TYPE
118
119
 
@@ -109,14 +109,7 @@ module RuboCop
109
109
  private
110
110
 
111
111
  def ruby_ast(ruby)
112
- buffer = ::Parser::Source::Buffer.new('(ruby)', source: ruby)
113
- ruby_parser.parse(buffer)
114
- end
115
-
116
- def ruby_parser
117
- require 'parser/current'
118
- builder = ::RuboCop::AST::Builder.new
119
- ::Parser::CurrentRuby.new(builder)
112
+ ProcessedSource.new(ruby, RUBY_VERSION.to_f, '(ruby)').ast
120
113
  end
121
114
  end
122
115
 
@@ -35,25 +35,21 @@ module RuboCop
35
35
  INVALID_LEVELS = %i[error fatal].freeze
36
36
  private_constant :INVALID_LEVELS
37
37
 
38
- PARSER_ENGINES = %i[parser_whitequark parser_prism].freeze
38
+ PARSER_ENGINES = %i[default parser_whitequark parser_prism].freeze
39
39
  private_constant :PARSER_ENGINES
40
40
 
41
41
  attr_reader :path, :buffer, :ast, :comments, :tokens, :diagnostics,
42
42
  :parser_error, :raw_source, :ruby_version, :parser_engine
43
43
 
44
- def self.from_file(path, ruby_version, parser_engine: :parser_whitequark)
44
+ def self.from_file(path, ruby_version, parser_engine: :default)
45
45
  file = File.read(path, mode: 'rb')
46
46
  new(file, ruby_version, path, parser_engine: parser_engine)
47
47
  end
48
48
 
49
49
  def initialize(
50
- source, ruby_version, path = nil, parser_engine: :parser_whitequark, prism_result: nil
50
+ source, ruby_version, path = nil, parser_engine: :default, prism_result: nil
51
51
  )
52
- parser_engine = parser_engine.to_sym
53
- unless PARSER_ENGINES.include?(parser_engine)
54
- raise ArgumentError, 'The keyword argument `parser_engine` accepts `parser_whitequark` ' \
55
- "or `parser_prism`, but `#{parser_engine}` was passed."
56
- end
52
+ parser_engine = normalize_parser_engine(parser_engine, ruby_version)
57
53
 
58
54
  # Defaults source encoding to UTF-8, regardless of the encoding it has
59
55
  # been read with, which could be non-utf8 depending on the default
@@ -307,11 +303,10 @@ module RuboCop
307
303
  require 'parser/ruby34'
308
304
  Parser::Ruby34
309
305
  else
310
- raise ArgumentError, "RuboCop found unknown Ruby version: #{ruby_version.inspect}"
306
+ raise ArgumentError, 'RuboCop supports target Ruby versions 3.4 and below with ' \
307
+ "`parser`. Specified target Ruby version: #{ruby_version.inspect}"
311
308
  end
312
309
  when :parser_prism
313
- require_prism
314
-
315
310
  case ruby_version
316
311
  when 3.3
317
312
  require 'prism/translation/parser33'
@@ -319,6 +314,9 @@ module RuboCop
319
314
  when 3.4
320
315
  require 'prism/translation/parser34'
321
316
  Prism::Translation::Parser34
317
+ when 3.5
318
+ require 'prism/translation/parser35'
319
+ Prism::Translation::Parser35
322
320
  else
323
321
  raise ArgumentError, 'RuboCop supports target Ruby versions 3.3 and above with Prism. ' \
324
322
  "Specified target Ruby version: #{ruby_version.inspect}"
@@ -331,49 +329,17 @@ module RuboCop
331
329
  when :parser_whitequark
332
330
  RuboCop::AST::Builder
333
331
  when :parser_prism
334
- require_prism
335
- require_relative 'builder_prism'
336
332
  RuboCop::AST::BuilderPrism
337
333
  end
338
334
  end
339
335
 
340
- # Prism is a native extension, a `LoadError` will be raised if linked to an incompatible
341
- # Ruby version. Only raise if it really was caused by Prism not being present.
342
- # rubocop:disable Metrics/MethodLength
343
- def require_prism
344
- require 'prism'
345
- required_prism_version = '1.4.0'
346
- if required_prism_version > Prism::VERSION
347
- # While Prism is not yet a dependency, users may run with outdated versions that
348
- # don't have all the parsers.
349
- warn <<~MESSAGE
350
- Error: Prism version #{Prism::VERSION} was loaded, but rubocop-ast requires #{required_prism_version}.
351
- * If you're using Bundler and don't yet have `gem 'prism'` as a dependency, add it now.
352
- * If you're using Bundler and already have `gem 'prism'` as a dependency, update it to the most recent version.
353
- * If you don't use Bundler, run `gem update prism`.
354
- MESSAGE
355
- exit!
356
- end
357
- rescue LoadError => e
358
- raise unless e.path == 'prism'
359
-
360
- warn "Error: Unable to load Prism. Add `gem 'prism'` to your Gemfile."
361
- exit!
362
- end
363
- # rubocop:enable Metrics/MethodLength
364
-
365
336
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
366
337
  def create_parser(ruby_version, parser_engine, prism_result)
367
338
  builder = builder_class(parser_engine).new
368
339
 
369
340
  parser_class = parser_class(ruby_version, parser_engine)
370
341
 
371
- # NOTE: Check if the `Prism#initialize` method has the `:parser` keyword argument.
372
- # The `:parser` keyword argument cannot be used to switch parsers because older versions of
373
- # Prism do not support it.
374
- parser_switch_available = parser_class.instance_method(:initialize).parameters.assoc(:key)
375
-
376
- parser_instance = if prism_result && parser_switch_available
342
+ parser_instance = if prism_result
377
343
  # NOTE: Since it is intended for use with Ruby LSP, it targets only Prism.
378
344
  # If there is no reuse of a pre-parsed result, such as in Ruby LSP,
379
345
  # regular parsing with Prism occurs, and `else` branch will be executed.
@@ -397,6 +363,31 @@ module RuboCop
397
363
  end
398
364
  # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
399
365
 
366
+ def normalize_parser_engine(parser_engine, ruby_version)
367
+ parser_engine = parser_engine.to_sym
368
+ unless PARSER_ENGINES.include?(parser_engine)
369
+ raise ArgumentError, 'The keyword argument `parser_engine` accepts `default`, ' \
370
+ "`parser_whitequark`, or `parser_prism`, but `#{parser_engine}` " \
371
+ 'was passed.'
372
+ end
373
+ if parser_engine == :default
374
+ default_parser_engine(ruby_version)
375
+ else
376
+ parser_engine
377
+ end
378
+ end
379
+
380
+ # The Parser gem does not support Ruby 3.5 or later.
381
+ # It is also not fully compatible with Ruby 3.4 but for
382
+ # now respects using parser for backwards compatibility.
383
+ def default_parser_engine(ruby_version)
384
+ if ruby_version >= 3.4
385
+ :parser_prism
386
+ else
387
+ :parser_whitequark
388
+ end
389
+ end
390
+
400
391
  def first_token_index(range_or_node)
401
392
  begin_pos = source_range(range_or_node).begin_pos
402
393
  sorted_tokens.bsearch_index { |token| token.begin_pos >= begin_pos }
@@ -159,6 +159,7 @@ module RuboCop
159
159
  def_callback :if, :always, :nil?, :nil?
160
160
  def_callback :block, :always, :always, :nil?
161
161
  def_callback :numblock, :always, :skip, :nil?
162
+ def_callback :itblock, :always, :skip, :nil?
162
163
  def_callback :defs, :always, :skip, :always, :nil?
163
164
 
164
165
  def_callback %i[send csend], body: <<~RUBY
@@ -176,7 +177,7 @@ module RuboCop
176
177
 
177
178
  to_define = ::Parser::Meta::NODE_TYPES.to_a
178
179
  to_define -= defined
179
- to_define -= %i[numargs ident] # transient
180
+ to_define -= %i[numargs itarg ident] # transient
180
181
  to_define -= %i[blockarg_expr restarg_expr] # obsolete
181
182
  to_define -= %i[objc_kwarg objc_restarg objc_varargs] # mac_ruby
182
183
  def_callback to_define, body: <<~RUBY
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module AST
5
5
  module Version
6
- STRING = '1.40.0'
6
+ STRING = '1.43.0'
7
7
  end
8
8
  end
9
9
  end
data/lib/rubocop/ast.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'parser'
4
+ require 'prism'
4
5
  require 'forwardable'
5
6
  require 'set'
6
7
 
@@ -92,6 +93,7 @@ require_relative 'ast/node/when_node'
92
93
  require_relative 'ast/node/while_node'
93
94
  require_relative 'ast/node/yield_node'
94
95
  require_relative 'ast/builder'
96
+ require_relative 'ast/builder_prism'
95
97
  require_relative 'ast/processed_source'
96
98
  require_relative 'ast/rubocop_compatibility'
97
99
  require_relative 'ast/token'
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-ast
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.40.0
4
+ version: 1.43.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bozhidar Batsov
8
8
  - Jonas Arvidsson
9
9
  - Yuji Nakayama
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2025-03-19 00:00:00.000000000 Z
12
+ date: 2025-03-25 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: parser
@@ -18,14 +17,28 @@ dependencies:
18
17
  requirements:
19
18
  - - ">="
20
19
  - !ruby/object:Gem::Version
21
- version: 3.3.1.0
20
+ version: 3.3.7.2
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
24
  requirements:
26
25
  - - ">="
27
26
  - !ruby/object:Gem::Version
28
- version: 3.3.1.0
27
+ version: 3.3.7.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: prism
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.4'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.4'
29
42
  description: " RuboCop's Node and NodePattern classes.\n"
30
43
  email: rubocop@googlegroups.com
31
44
  executables: []
@@ -148,7 +161,6 @@ metadata:
148
161
  documentation_uri: https://docs.rubocop.org/rubocop-ast/
149
162
  bug_tracker_uri: https://github.com/rubocop/rubocop-ast/issues
150
163
  rubygems_mfa_required: 'true'
151
- post_install_message:
152
164
  rdoc_options: []
153
165
  require_paths:
154
166
  - lib
@@ -163,8 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
175
  - !ruby/object:Gem::Version
164
176
  version: '0'
165
177
  requirements: []
166
- rubygems_version: 3.5.11
167
- signing_key:
178
+ rubygems_version: 3.6.2
168
179
  specification_version: 4
169
180
  summary: RuboCop tools to deal with Ruby code AST.
170
181
  test_files: []