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 +4 -4
- data/lib/rubocop/ast/builder.rb +1 -0
- data/lib/rubocop/ast/node/block_node.rb +7 -6
- data/lib/rubocop/ast/node/ensure_node.rb +13 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +3 -3
- data/lib/rubocop/ast/node.rb +2 -1
- data/lib/rubocop/ast/node_pattern/compiler/debug.rb +1 -8
- data/lib/rubocop/ast/processed_source.rb +35 -44
- data/lib/rubocop/ast/traversal.rb +2 -1
- data/lib/rubocop/ast/version.rb +1 -1
- data/lib/rubocop/ast.rb +2 -0
- metadata +19 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 724e2118bf289e457d58db38594035fb1888100577cbc82ca6e7352b2d952d24
|
4
|
+
data.tar.gz: 0f957ba53af55775cfa988490b2ea07db0022d9b3dba3d28c48a95aff64552ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db7476e8bff5a7357b8722d6a48fd185ef296e10c9e69de6e8efd76e5f281e7ad8e4c18303df1415c8219359f17fe860742fd12ae3be726f8acdeacf9afed84f
|
7
|
+
data.tar.gz: c06cf9bed363772ee88102f93685993025c03886d0f68b01d139d20c128fe4d3bd66707321431d559b75801ce84613f6c0ccf3bb19fad674482a377418134e53
|
data/lib/rubocop/ast/builder.rb
CHANGED
@@ -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
|
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 `
|
42
|
+
# The `block`, `numblock`, or `itblock` node associated with this method dispatch, if any.
|
43
43
|
#
|
44
|
-
# @return [BlockNode, nil] the `block` or `
|
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
|
data/lib/rubocop/ast/node.rb
CHANGED
@@ -109,14 +109,7 @@ module RuboCop
|
|
109
109
|
private
|
110
110
|
|
111
111
|
def ruby_ast(ruby)
|
112
|
-
|
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: :
|
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: :
|
50
|
+
source, ruby_version, path = nil, parser_engine: :default, prism_result: nil
|
51
51
|
)
|
52
|
-
parser_engine = parser_engine
|
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,
|
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
|
-
|
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
|
data/lib/rubocop/ast/version.rb
CHANGED
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.
|
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-
|
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.
|
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.
|
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.
|
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: []
|