rubocop-performance 1.20.0 → 1.20.2

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: afce4fa4bdd79fa5f4429edcdb3fa157f94be3f2526630db7d342c56fd5d741b
4
- data.tar.gz: 833a0a5c44c55a7e30640c7658f54e5a28c5a362add04c60b434fa9f58b61136
3
+ metadata.gz: 1dad3fdab16d4dbcb3047e3319ab415b6e9ae3e2cbf14a73a1874831bf473701
4
+ data.tar.gz: ca98aec2aac71f768e63c5b5ed3c73c2a5ef8242433fc8fe078e9930f47a4d38
5
5
  SHA512:
6
- metadata.gz: 62dea0dda6f9fc634e7d7d418ba980bb106d698db3d7242da2c81c9abc49124748dc553bf413e9281fe6969d1b29ef991d58e2e2a6211c759f27cbe36a99cfe4
7
- data.tar.gz: 046a795365aa47793e3afa36cc0685cc44851573210669945a8b6bda73d8edcb38ca6acc522d17009ea722a6c84e68c21ddc759181ba1840cac7c566e76b0220
6
+ metadata.gz: 16536c625e9f66d73368d70153a139f72da96dee225807c1154c07e7a2df999be9f06278b1c6db95836baa6832524da39715f8240151236c5b29ec47ce99e91b
7
+ data.tar.gz: bfd72acdc38b7337c4b783fc8e5e14516aa8926980cfbf2051487350eb939648ac9af302e1f5c0abc889f3564efb98ff5a7551d107d8d28b2912c4c9a0128b79
@@ -16,13 +16,19 @@ module RuboCop
16
16
  # send('do_something')
17
17
  # attr_accessor 'do_something'
18
18
  # instance_variable_get('@ivar')
19
- # const_get("string_#{interpolation}")
19
+ # respond_to?("string_#{interpolation}")
20
20
  #
21
21
  # # good
22
22
  # send(:do_something)
23
23
  # attr_accessor :do_something
24
24
  # instance_variable_get(:@ivar)
25
- # const_get(:"string_#{interpolation}")
25
+ # respond_to?(:"string_#{interpolation}")
26
+ #
27
+ # # good - these methods don't support namespaced symbols
28
+ # const_get("#{module_path}::Base")
29
+ # const_source_location("#{module_path}::Base")
30
+ # const_defined?("#{module_path}::Base")
31
+ #
26
32
  #
27
33
  class StringIdentifierArgument < Base
28
34
  extend AutoCorrector
@@ -34,40 +40,68 @@ module RuboCop
34
40
  protected public public_constant module_function
35
41
  ].freeze
36
42
 
43
+ INTERPOLATION_IGNORE_METHODS = %i[const_get const_source_location const_defined?].freeze
44
+
45
+ TWO_ARGUMENTS_METHOD = :alias_method
46
+ MULTIPLE_ARGUMENTS_METHODS = %i[
47
+ attr_accessor attr_reader attr_writer private private_constant
48
+ protected public public_constant module_function
49
+ ].freeze
50
+
37
51
  # NOTE: `attr` method is not included in this list as it can cause false positives in Nokogiri API.
38
52
  # And `attr` may not be used because `Style/Attr` registers an offense.
39
53
  # https://github.com/rubocop/rubocop-performance/issues/278
40
54
  RESTRICT_ON_SEND = (%i[
41
- class_variable_defined? const_defined? const_get const_set const_source_location
55
+ class_variable_defined? const_set
42
56
  define_method instance_method method_defined? private_class_method? private_method_defined?
43
57
  protected_method_defined? public_class_method public_instance_method public_method_defined?
44
58
  remove_class_variable remove_method undef_method class_variable_get class_variable_set
45
59
  deprecate_constant remove_const ruby2_keywords define_singleton_method instance_variable_defined?
46
60
  instance_variable_get instance_variable_set method public_method public_send remove_instance_variable
47
61
  respond_to? send singleton_method __send__
48
- ] + COMMAND_METHODS).freeze
62
+ ] + COMMAND_METHODS + INTERPOLATION_IGNORE_METHODS).freeze
49
63
 
50
- # rubocop:disable Metrics/CyclomaticComplexity
51
64
  def on_send(node)
52
65
  return if COMMAND_METHODS.include?(node.method_name) && node.receiver
53
- return unless (first_argument = node.first_argument)
54
- return unless first_argument.str_type? || first_argument.dstr_type?
55
-
56
- first_argument_value = first_argument.value
57
- return if first_argument_value.include?(' ') || first_argument_value.include?('::')
58
-
59
- replacement = argument_replacement(first_argument, first_argument_value)
60
66
 
61
- message = format(MSG, symbol_arg: replacement, string_arg: first_argument.source)
67
+ string_arguments(node).each do |string_argument|
68
+ string_argument_value = string_argument.value
69
+ next if string_argument_value.include?(' ') || string_argument_value.include?('::')
62
70
 
63
- add_offense(first_argument, message: message) do |corrector|
64
- corrector.replace(first_argument, replacement)
71
+ register_offense(string_argument, string_argument_value)
65
72
  end
66
73
  end
67
- # rubocop:enable Metrics/CyclomaticComplexity
68
74
 
69
75
  private
70
76
 
77
+ def string_arguments(node)
78
+ arguments = if node.method?(TWO_ARGUMENTS_METHOD)
79
+ [node.first_argument, node.arguments[1]]
80
+ elsif MULTIPLE_ARGUMENTS_METHODS.include?(node.method_name)
81
+ node.arguments
82
+ else
83
+ [node.first_argument]
84
+ end
85
+
86
+ arguments.compact.filter { |argument| string_argument_compatible?(argument, node) }
87
+ end
88
+
89
+ def string_argument_compatible?(argument, node)
90
+ return true if argument.str_type?
91
+
92
+ argument.dstr_type? && INTERPOLATION_IGNORE_METHODS.none? { |method| node.method?(method) }
93
+ end
94
+
95
+ def register_offense(argument, argument_value)
96
+ replacement = argument_replacement(argument, argument_value)
97
+
98
+ message = format(MSG, symbol_arg: replacement, string_arg: argument.source)
99
+
100
+ add_offense(argument, message: message) do |corrector|
101
+ corrector.replace(argument, replacement)
102
+ end
103
+ end
104
+
71
105
  def argument_replacement(node, value)
72
106
  if node.str_type?
73
107
  value.to_sym.inspect
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Performance
5
5
  # This module holds the RuboCop Performance version information.
6
6
  module Version
7
- STRING = '1.20.0'
7
+ STRING = '1.20.2'
8
8
 
9
9
  def self.document_version
10
10
  STRING.match('\d+\.\d+').to_s
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-performance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.0
4
+ version: 1.20.2
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: 2023-12-16 00:00:00.000000000 Z
13
+ date: 2024-01-08 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop