rubocop 1.64.1 → 1.65.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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +11 -1
  4. data/lib/rubocop/config_loader.rb +1 -1
  5. data/lib/rubocop/config_loader_resolver.rb +9 -3
  6. data/lib/rubocop/cop/cop.rb +20 -2
  7. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  8. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
  9. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  10. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  11. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  12. data/lib/rubocop/cop/layout/first_argument_indentation.rb +2 -2
  13. data/lib/rubocop/cop/layout/heredoc_indentation.rb +1 -1
  14. data/lib/rubocop/cop/layout/indentation_width.rb +1 -1
  15. data/lib/rubocop/cop/layout/line_length.rb +20 -20
  16. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -0
  17. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  18. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  19. data/lib/rubocop/cop/lint/empty_when.rb +1 -1
  20. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +14 -7
  21. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -1
  22. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  23. data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -9
  24. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  25. data/lib/rubocop/cop/lint/void.rb +5 -0
  26. data/lib/rubocop/cop/metrics/block_nesting.rb +19 -7
  27. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  28. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  29. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  30. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  31. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  32. data/lib/rubocop/cop/style/arguments_forwarding.rb +1 -1
  33. data/lib/rubocop/cop/style/hash_except.rb +8 -5
  34. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +77 -43
  35. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
  36. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  37. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  38. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  39. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +15 -1
  40. data/lib/rubocop/cop/style/super_arguments.rb +28 -10
  41. data/lib/rubocop/cop/style/symbol_proc.rb +8 -1
  42. data/lib/rubocop/cop/style/zero_length_predicate.rb +28 -24
  43. data/lib/rubocop/cop/team.rb +8 -0
  44. data/lib/rubocop/cop/util.rb +7 -1
  45. data/lib/rubocop/cops_documentation_generator.rb +1 -1
  46. data/lib/rubocop/ext/regexp_parser.rb +4 -21
  47. data/lib/rubocop/formatter/html_formatter.rb +3 -1
  48. data/lib/rubocop/rspec/shared_contexts.rb +20 -0
  49. data/lib/rubocop/rspec/support.rb +1 -0
  50. data/lib/rubocop/server/cache.rb +10 -0
  51. data/lib/rubocop/server/client_command/exec.rb +2 -2
  52. data/lib/rubocop/server/client_command/start.rb +1 -1
  53. data/lib/rubocop/server/core.rb +4 -0
  54. data/lib/rubocop/version.rb +1 -1
  55. data/lib/rubocop.rb +1 -0
  56. metadata +11 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc79c69246529843a3d6179458d5563867515189cca9f68d34e6cba9f103a032
4
- data.tar.gz: 2b71ef0f55a63904b93e1315417ab4bd9701c1d91f3f87087fda9046243a4176
3
+ metadata.gz: 459d541c6d59f9d241213403a76f0ebe00f91e248167a7d5b7b3cc9970d7e92c
4
+ data.tar.gz: db90495c3208a80a2a41efd7daaa5fcf2b88560cb47ff0bfa861bc01cfa2cf19
5
5
  SHA512:
6
- metadata.gz: 4ea1aa79a49f5a9c7331286e58563b5b92c5c8b11bc1d81dbddee107595a9588e84c7888a8fe6338b29e856740d35d56df47e8d7b485db5cc4cd6cd0f45a8406
7
- data.tar.gz: f5bc4fb8153c6277534bc4acd22da3bb3e41ef0ca5eef2639817893fa2312b5291ca80b308151c2e315db993ea086f32f618f9ef65146b69e4b99fc50782c165
6
+ metadata.gz: 8b92f5ce74858e5142fb49469a84550e70fb19d388943432ec46b861ab224704d3ebbea964a94db275653c863b2a0afb202211557e9c26d7f4f25fdba3a741d9
7
+ data.tar.gz: 9a631b9c9b68f3c1489add6fcbf5bdd80cc043fdfb5a8d0d6525b83780df734ce7ccdae46523d3b516c105599baa01ab5807ff9a12f0e939b55c1c313f80d8d2
data/README.md CHANGED
@@ -52,7 +52,7 @@ To prevent an unwanted RuboCop update you might want to use a conservative versi
52
52
  in your `Gemfile`:
53
53
 
54
54
  ```rb
55
- gem 'rubocop', '~> 1.64', require: false
55
+ gem 'rubocop', '~> 1.65', require: false
56
56
  ```
57
57
 
58
58
  See [our versioning policy](https://docs.rubocop.org/rubocop/versioning.html) for further details.
data/config/default.yml CHANGED
@@ -262,6 +262,15 @@ Bundler/OrderedGems:
262
262
 
263
263
  #################### Gemspec ###############################
264
264
 
265
+ Gemspec/AddRuntimeDependency:
266
+ Description: 'Prefer `add_dependency` over `add_runtime_dependency`.'
267
+ StyleGuide: '#add_dependency_vs_add_runtime_dependency'
268
+ Reference: https://github.com/rubygems/rubygems/issues/7799#issuecomment-2192720316
269
+ Enabled: pending
270
+ VersionAdded: '1.65'
271
+ Include:
272
+ - '**/*.gemspec'
273
+
265
274
  Gemspec/DependencyVersion:
266
275
  Description: 'Requires or forbids specifying gem dependency versions.'
267
276
  Enabled: false
@@ -2617,8 +2626,9 @@ Metrics/BlockNesting:
2617
2626
  StyleGuide: '#three-is-the-number-thou-shalt-count'
2618
2627
  Enabled: true
2619
2628
  VersionAdded: '0.25'
2620
- VersionChanged: '0.47'
2629
+ VersionChanged: '1.65'
2621
2630
  CountBlocks: false
2631
+ CountModifierForms: false
2622
2632
  Max: 3
2623
2633
 
2624
2634
  Metrics/ClassLength:
@@ -164,7 +164,7 @@ module RuboCop
164
164
  # searches will go past this directory.
165
165
  # @deprecated Use `RuboCop::ConfigFinder.project_root` instead.
166
166
  def project_root
167
- warn Rainbow(<<~WARNING).yellow
167
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
168
168
  `RuboCop::ConfigLoader.project_root` is deprecated and will be removed in RuboCop 2.0. \
169
169
  Use `RuboCop::ConfigFinder.project_root` instead.
170
170
  WARNING
@@ -6,7 +6,7 @@ require 'yaml'
6
6
  module RuboCop
7
7
  # A help class for ConfigLoader that handles configuration resolution.
8
8
  # @api private
9
- class ConfigLoaderResolver
9
+ class ConfigLoaderResolver # rubocop:disable Metrics/ClassLength
10
10
  def resolve_requires(path, hash)
11
11
  config_dir = File.dirname(path)
12
12
  hash.delete('require').tap do |loaded_features|
@@ -267,8 +267,14 @@ module RuboCop
267
267
 
268
268
  def gem_config_path(gem_name, relative_config_path)
269
269
  if defined?(Bundler)
270
- gem = Bundler.load.specs[gem_name].first
271
- gem_path = gem.full_gem_path if gem
270
+ begin
271
+ gem = Bundler.load.specs[gem_name].first
272
+ gem_path = gem.full_gem_path if gem
273
+ rescue Bundler::GemfileNotFound
274
+ # No Gemfile found. Bundler may be loaded manually
275
+ rescue Bundler::GitError
276
+ # The Gemfile exists but contains an uninstalled git source
277
+ end
272
278
  end
273
279
 
274
280
  gem_path ||= Gem::Specification.find_by_name(gem_name).gem_dir
@@ -37,16 +37,28 @@ module RuboCop
37
37
 
38
38
  # @deprecated Use Registry.global
39
39
  def self.registry
40
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
41
+ `Cop.registry` is deprecated. Use `Registry.global` instead.
42
+ WARNING
43
+
40
44
  Registry.global
41
45
  end
42
46
 
43
47
  # @deprecated Use Registry.all
44
48
  def self.all
49
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
50
+ `Cop.all` is deprecated. Use `Registry.all` instead.
51
+ WARNING
52
+
45
53
  Registry.all
46
54
  end
47
55
 
48
56
  # @deprecated Use Registry.qualified_cop_name
49
57
  def self.qualified_cop_name(name, origin)
58
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
59
+ `Cop.qualified_cop_name` is deprecated. Use `Registry.qualified_cop_name` instead.
60
+ WARNING
61
+
50
62
  Registry.qualified_cop_name(name, origin)
51
63
  end
52
64
 
@@ -74,13 +86,19 @@ module RuboCop
74
86
 
75
87
  # @deprecated Use class method
76
88
  def support_autocorrect?
77
- # warn 'deprecated, use cop.class.support_autocorrect?' TODO
89
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
90
+ `support_autocorrect?` is deprecated. Use `cop.class.support_autocorrect?`.
91
+ WARNING
92
+
78
93
  self.class.support_autocorrect?
79
94
  end
80
95
 
81
96
  # @deprecated
82
97
  def corrections
83
- # warn 'Cop#corrections is deprecated' TODO
98
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
99
+ `Cop#corrections` is deprecated.
100
+ WARNING
101
+
84
102
  return [] unless @last_corrector
85
103
 
86
104
  Legacy::CorrectionsProxy.new(@last_corrector)
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Gemspec
6
+ # Prefer `add_dependency` over `add_runtime_dependency` as the latter is
7
+ # considered soft-deprecated.
8
+ #
9
+ # @example
10
+ #
11
+ # # bad
12
+ # Gem::Specification.new do |spec|
13
+ # spec.add_runtime_dependency('rubocop')
14
+ # end
15
+ #
16
+ # # good
17
+ # Gem::Specification.new do |spec|
18
+ # spec.add_dependency('rubocop')
19
+ # end
20
+ #
21
+ class AddRuntimeDependency < Base
22
+ extend AutoCorrector
23
+
24
+ MSG = 'Use `add_dependency` instead of `add_runtime_dependency`.'
25
+
26
+ RESTRICT_ON_SEND = %i[add_runtime_dependency].freeze
27
+
28
+ def on_send(node)
29
+ return if !node.receiver || node.arguments.empty?
30
+
31
+ add_offense(node.loc.selector) do |corrector|
32
+ corrector.replace(node.loc.selector, 'add_dependency')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -31,8 +31,8 @@ module RuboCop
31
31
  #
32
32
  # # good
33
33
  # Gem::Specification.new do |spec|
34
- # spec.add_runtime_dependency('parallel', '~> 1.10')
35
- # spec.add_runtime_dependency('parser', '>= 2.3.3.1', '< 3.0')
34
+ # spec.add_dependency('parallel', '~> 1.10')
35
+ # spec.add_dependency('parser', '>= 2.3.3.1', '< 3.0')
36
36
  # end
37
37
  class DuplicatedAssignment < Base
38
38
  include RangeHelp
@@ -14,15 +14,15 @@ module RuboCop
14
14
  # # bad
15
15
  # Gem::Specification.new do |spec|
16
16
  # if RUBY_VERSION >= '3.0'
17
- # spec.add_runtime_dependency 'gem_a'
17
+ # spec.add_dependency 'gem_a'
18
18
  # else
19
- # spec.add_runtime_dependency 'gem_b'
19
+ # spec.add_dependency 'gem_b'
20
20
  # end
21
21
  # end
22
22
  #
23
23
  # # good
24
24
  # Gem::Specification.new do |spec|
25
- # spec.add_runtime_dependency 'gem_a'
25
+ # spec.add_dependency 'gem_a'
26
26
  # end
27
27
  #
28
28
  class RubyVersionGlobalsUsage < Base
@@ -121,7 +121,7 @@ module RuboCop
121
121
  return if case_node.single_line?
122
122
  return if enforced_style_end? && end_and_last_conditional_same_line?(case_node)
123
123
 
124
- case_node.each_when { |when_node| check_when(when_node, 'when') }
124
+ case_node.when_branches.each { |when_node| check_when(when_node, 'when') }
125
125
  end
126
126
 
127
127
  def on_case_match(case_match_node)
@@ -80,7 +80,7 @@ module RuboCop
80
80
  alias on_until_post on_while_post
81
81
 
82
82
  def on_case(node)
83
- node.each_when do |when_node|
83
+ node.when_branches.each do |when_node|
84
84
  last_condition = when_node.conditions.last
85
85
 
86
86
  next if !multiline_when_condition?(when_node) ||
@@ -118,8 +118,8 @@ module RuboCop
118
118
  #
119
119
  # @example EnforcedStyle: special_for_inner_method_call
120
120
  # # The first argument should normally be indented one step more than
121
- # # the preceding line, but if it's a argument for a method call that
122
- # # is itself a argument in a method call, then the inner argument
121
+ # # the preceding line, but if it's an argument for a method call that
122
+ # # is itself an argument in a method call, then the inner argument
123
123
  # # should be indented relative to the inner method.
124
124
  #
125
125
  # # good
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks the indentation of the here document bodies. The bodies
7
7
  # are indented one step.
8
8
  #
9
- # Note: When ``Layout/LineLength``'s `AllowHeredoc` is false (not default),
9
+ # NOTE: When ``Layout/LineLength``'s `AllowHeredoc` is false (not default),
10
10
  # this cop does not add any offenses for long here documents to
11
11
  # avoid ``Layout/LineLength``'s offenses.
12
12
  #
@@ -136,7 +136,7 @@ module RuboCop
136
136
  alias on_until on_while
137
137
 
138
138
  def on_case(case_node)
139
- case_node.each_when do |when_node|
139
+ case_node.when_branches.each do |when_node|
140
140
  check_indentation(when_node.loc.keyword, when_node.body)
141
141
  end
142
142
 
@@ -17,29 +17,29 @@ module RuboCop
17
17
  # split across lines. These include arrays, hashes, and
18
18
  # method calls with argument lists.
19
19
  #
20
- # If autocorrection is enabled, the following Layout cops
20
+ # If autocorrection is enabled, the following cops
21
21
  # are recommended to further format the broken lines.
22
22
  # (Many of these are enabled by default.)
23
23
  #
24
- # * ArgumentAlignment
25
- # * ArrayAlignment
26
- # * BlockAlignment
27
- # * BlockDelimiters
28
- # * BlockEndNewline
29
- # * ClosingParenthesisIndentation
30
- # * FirstArgumentIndentation
31
- # * FirstArrayElementIndentation
32
- # * FirstHashElementIndentation
33
- # * FirstParameterIndentation
34
- # * HashAlignment
35
- # * IndentationWidth
36
- # * MultilineArrayLineBreaks
37
- # * MultilineBlockLayout
38
- # * MultilineHashBraceLayout
39
- # * MultilineHashKeyLineBreaks
40
- # * MultilineMethodArgumentLineBreaks
41
- # * MultilineMethodParameterLineBreaks
42
- # * ParameterAlignment
24
+ # * `Layout/ArgumentAlignment`
25
+ # * `Layout/ArrayAlignment`
26
+ # * `Layout/BlockAlignment`
27
+ # * `Layout/BlockEndNewline`
28
+ # * `LayoutClosingParenthesisIndentation`
29
+ # * `LayoutFirstArgumentIndentation`
30
+ # * `LayoutFirstArrayElementIndentation`
31
+ # * `LayoutFirstHashElementIndentation`
32
+ # * `LayoutFirstParameterIndentation`
33
+ # * `LayoutHashAlignment`
34
+ # * `LayoutIndentationWidth`
35
+ # * `LayoutMultilineArrayLineBreaks`
36
+ # * `LayoutMultilineBlockLayout`
37
+ # * `LayoutMultilineHashBraceLayout`
38
+ # * `LayoutMultilineHashKeyLineBreaks`
39
+ # * `LayoutMultilineMethodArgumentLineBreaks`
40
+ # * `LayoutMultilineMethodParameterLineBreaks`
41
+ # * `Layout/ParameterAlignment`
42
+ # * `Style/BlockDelimiters`
43
43
  #
44
44
  # Together, these cops will pretty print hashes, arrays,
45
45
  # method calls, etc. For example, let's say the max columns
@@ -180,6 +180,9 @@ module RuboCop
180
180
  with_space = range_with_surrounding_space(operator)
181
181
  return if with_space.source.start_with?("\n")
182
182
 
183
+ comment = processed_source.comment_at_line(operator.line)
184
+ return if comment && with_space.last_column == comment.loc.column
185
+
183
186
  offense(type, operator, with_space, right_operand) do |msg|
184
187
  add_offense(operator, message: msg) do |corrector|
185
188
  autocorrect(corrector, with_space, right_operand)
@@ -12,13 +12,23 @@ module RuboCop
12
12
  if corr.is_a?(CorrectionsProxy)
13
13
  merge!(corr.send(:corrector))
14
14
  else
15
- # warn "Corrector.new with corrections is deprecated." unless corr.empty? TODO
15
+ unless corr.empty?
16
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
17
+ `Corrector.new` with corrections is deprecated.
18
+ See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
19
+ WARNING
20
+ end
21
+
16
22
  corr.each { |c| corrections << c }
17
23
  end
18
24
  end
19
25
 
20
26
  def corrections
21
- # warn "#corrections is deprecated. Open an issue if you have a valid usecase." TODO
27
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
28
+ `Corrector#corrections` is deprecated. Open an issue if you have a valid usecase.
29
+ See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
30
+ WARNING
31
+
22
32
  CorrectionsProxy.new(self)
23
33
  end
24
34
  end
@@ -32,7 +32,7 @@ module RuboCop
32
32
 
33
33
  def on_case(case_node)
34
34
  case_node.when_branches.each_with_object(Set.new) do |when_node, previous|
35
- when_node.each_condition do |condition|
35
+ when_node.conditions.each do |condition|
36
36
  add_offense(condition) unless previous.add?(condition)
37
37
  end
38
38
  end
@@ -50,7 +50,7 @@ module RuboCop
50
50
  MSG = 'Avoid `when` branches without a body.'
51
51
 
52
52
  def on_case(node)
53
- node.each_when do |when_node|
53
+ node.when_branches.each do |when_node|
54
54
  next if when_node.body
55
55
  next if cop_config['AllowComments'] && contains_comments?(when_node)
56
56
 
@@ -23,27 +23,34 @@ module RuboCop
23
23
  # 'Item 2'
24
24
  # ]
25
25
  class ImplicitStringConcatenation < Base
26
- MSG = 'Combine %<string1>s and %<string2>s into a single string ' \
26
+ extend AutoCorrector
27
+
28
+ MSG = 'Combine %<lhs>s and %<rhs>s into a single string ' \
27
29
  'literal, rather than using implicit string concatenation.'
28
30
  FOR_ARRAY = ' Or, if they were intended to be separate array ' \
29
31
  'elements, separate them with a comma.'
30
32
  FOR_METHOD = ' Or, if they were intended to be separate method ' \
31
33
  'arguments, separate them with a comma.'
32
34
 
35
+ # rubocop:disable Metrics/AbcSize
33
36
  def on_dstr(node)
34
- each_bad_cons(node) do |child_node1, child_node2|
35
- range = child_node1.source_range.join(child_node2.source_range)
36
- message = format(MSG,
37
- string1: display_str(child_node1),
38
- string2: display_str(child_node2))
37
+ each_bad_cons(node) do |lhs_node, rhs_node|
38
+ range = lhs_node.source_range.join(rhs_node.source_range)
39
+ message = format(MSG, lhs: display_str(lhs_node), rhs: display_str(rhs_node))
39
40
  if node.parent&.array_type?
40
41
  message << FOR_ARRAY
41
42
  elsif node.parent&.send_type?
42
43
  message << FOR_METHOD
43
44
  end
44
- add_offense(range, message: message)
45
+
46
+ add_offense(range, message: message) do |corrector|
47
+ preferred = "#{lhs_node.source} + #{rhs_node.source}"
48
+
49
+ corrector.replace(range, preferred)
50
+ end
45
51
  end
46
52
  end
53
+ # rubocop:enable Metrics/AbcSize
47
54
 
48
55
  private
49
56
 
@@ -59,7 +59,7 @@ module RuboCop
59
59
  if case_node.condition
60
60
  check_case(case_node)
61
61
  else
62
- case_node.each_when do |when_node|
62
+ case_node.when_branches.each do |when_node|
63
63
  next unless when_node.conditions.all?(&:literal?)
64
64
 
65
65
  range = when_conditions_range(when_node)
@@ -102,7 +102,7 @@ module RuboCop
102
102
 
103
103
  def on_def(node)
104
104
  subject, = *node
105
- return if node.defs_type? && subject.lvar_type?
105
+ return if node.defs_type? && subject.variable?
106
106
 
107
107
  def_ancestor = node.each_ancestor(:def, :defs).first
108
108
  return unless def_ancestor
@@ -49,15 +49,8 @@ module RuboCop
49
49
  return unless def_node
50
50
 
51
51
  enum_conversion_call?(node) do |method_node, arguments|
52
- next if method_node.call_type? &&
53
- !method_node.method?(:__method__) && !method_node.method?(:__callee__)
54
-
55
- valid = if method_name?(method_node, def_node.method_name)
56
- arguments_match?(arguments, def_node)
57
- else
58
- def_node.arguments.empty?
59
- end
60
- return if valid
52
+ next if !method_name?(method_node, def_node.method_name) ||
53
+ arguments_match?(arguments, def_node)
61
54
 
62
55
  add_offense(node)
63
56
  end
@@ -113,6 +113,7 @@ module RuboCop
113
113
  PATTERN
114
114
 
115
115
  def on_block(node)
116
+ return unless node.body
116
117
  return unless reduce_with_block?(node)
117
118
  return unless node.argument_list.length >= 2
118
119
 
@@ -111,6 +111,8 @@ module RuboCop
111
111
  end
112
112
 
113
113
  def check_expression(expr)
114
+ expr = expr.body if expr.if_type? && expr.modifier_form?
115
+
114
116
  check_literal(expr)
115
117
  check_var(expr)
116
118
  check_self(expr)
@@ -121,6 +123,7 @@ module RuboCop
121
123
  end
122
124
 
123
125
  def check_void_op(node, &block)
126
+ node = node.children.first while node.begin_type?
124
127
  return unless node.send_type? && OPERATORS.include?(node.method_name)
125
128
  return if block && yield(node)
126
129
 
@@ -211,6 +214,8 @@ module RuboCop
211
214
  end
212
215
 
213
216
  def autocorrect_void_expression(corrector, node)
217
+ return if node.parent.if_type? && node.parent.modifier_form?
218
+
214
219
  corrector.remove(range_with_surrounding_space(range: node.source_range, side: :left))
215
220
  end
216
221
 
@@ -3,12 +3,12 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Metrics
6
- # Checks for excessive nesting of conditional and looping
7
- # constructs.
6
+ # Checks for excessive nesting of conditional and looping constructs.
8
7
  #
9
- # You can configure if blocks are considered using the `CountBlocks`
10
- # option. When set to `false` (the default) blocks are not counted
11
- # towards the nesting level. Set to `true` to count blocks as well.
8
+ # You can configure if blocks are considered using the `CountBlocks` and `CountModifierForms`
9
+ # options. When both are set to `false` (the default) blocks and modifier forms are not
10
+ # counted towards the nesting level. Set them to `true` to include these in the nesting level
11
+ # calculation as well.
12
12
  #
13
13
  # The maximum level of nesting allowed is configurable.
14
14
  class BlockNesting < Base
@@ -27,7 +27,7 @@ module RuboCop
27
27
 
28
28
  def check_nesting_level(node, max, current_level)
29
29
  if consider_node?(node)
30
- current_level += 1 unless node.if_type? && node.elsif?
30
+ current_level += 1 if count_if_block?(node)
31
31
  if current_level > max
32
32
  self.max = current_level
33
33
  unless part_of_ignored_node?(node)
@@ -41,6 +41,14 @@ module RuboCop
41
41
  end
42
42
  end
43
43
 
44
+ def count_if_block?(node)
45
+ return true unless node.if_type?
46
+ return false if node.elsif?
47
+ return count_modifier_forms? if node.modifier_form?
48
+
49
+ true
50
+ end
51
+
44
52
  def consider_node?(node)
45
53
  return true if NESTING_BLOCKS.include?(node.type)
46
54
 
@@ -52,7 +60,11 @@ module RuboCop
52
60
  end
53
61
 
54
62
  def count_blocks?
55
- cop_config['CountBlocks']
63
+ cop_config.fetch('CountBlocks', false)
64
+ end
65
+
66
+ def count_modifier_forms?
67
+ cop_config.fetch('CountModifierForms', false)
56
68
  end
57
69
  end
58
70
  end
@@ -65,8 +65,12 @@ module RuboCop
65
65
  inner.begin_pos >= outer.begin_pos && inner.end_pos <= outer.end_pos
66
66
  end
67
67
 
68
- # @deprecated Use processed_source.comment_at_line(line)
68
+ # @deprecated Use processed_source.line_with_comment?(line)
69
69
  def end_of_line_comment(line)
70
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
71
+ `end_of_line_comment` is deprecated. Use `processed_source.line_with_comment?` instead.
72
+ WARNING
73
+
70
74
  processed_source.line_with_comment?(line)
71
75
  end
72
76
 
@@ -15,7 +15,13 @@ module RuboCop
15
15
  end
16
16
 
17
17
  # @deprecated Use allowed_method? instead
18
- alias ignored_method? allowed_method?
18
+ def ignored_method?
19
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
20
+ `ignored_method?` is deprecated. Use `allowed_method?` instead.
21
+ WARNING
22
+
23
+ allowed_method?
24
+ end
19
25
 
20
26
  # @api public
21
27
  def allowed_methods
@@ -18,14 +18,26 @@ module RuboCop
18
18
  end
19
19
 
20
20
  # @deprecated Use allowed_line? instead
21
- alias ignored_line? allowed_line?
21
+ def ignored_line?
22
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
23
+ `ignored_line?` is deprecated. Use `allowed_line?` instead.
24
+ WARNING
25
+
26
+ allowed_line?
27
+ end
22
28
 
23
29
  def matches_allowed_pattern?(line)
24
30
  allowed_patterns.any? { |pattern| Regexp.new(pattern).match?(line) }
25
31
  end
26
32
 
27
- # @deprecated Use matches_allowed_pattern?? instead
28
- alias matches_ignored_pattern? matches_allowed_pattern?
33
+ # @deprecated Use matches_allowed_pattern? instead
34
+ def matches_ignored_pattern?
35
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
36
+ `matches_ignored_pattern?` is deprecated. Use `matches_allowed_pattern?` instead.
37
+ WARNING
38
+
39
+ matches_allowed_pattern?
40
+ end
29
41
 
30
42
  def allowed_patterns
31
43
  # Since there could be a pattern specified in the default config, merge the two
@@ -4,11 +4,15 @@ module RuboCop
4
4
  module Cop
5
5
  # Handles `Max` configuration parameters, especially setting them to an
6
6
  # appropriate value with --auto-gen-config.
7
- # @deprecated Use `exclude_limit ParameterName` instead.
7
+ # @deprecated Use `exclude_limit <ParameterName>` instead.
8
8
  module ConfigurableMax
9
9
  private
10
10
 
11
11
  def max=(value)
12
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
13
+ `max=` is deprecated. Use `exclude_limit <ParameterName>` instead.
14
+ WARNING
15
+
12
16
  cfg = config_to_allow_offenses
13
17
  cfg[:exclude_limit] ||= {}
14
18
  current_max = cfg[:exclude_limit][max_parameter_name]
@@ -18,6 +18,10 @@ module RuboCop
18
18
 
19
19
  # @deprecated Use ResbodyNode#exceptions instead
20
20
  def rescued_exceptions(resbody)
21
+ warn Rainbow(<<~WARNING).yellow, uplevel: 1
22
+ `rescued_exceptions` is deprecated. Use `ResbodyNode#exceptions` instead.
23
+ WARNING
24
+
21
25
  rescue_group, = *resbody
22
26
  if rescue_group
23
27
  rescue_group.values
@@ -148,7 +148,7 @@ module RuboCop
148
148
 
149
149
  restarg, kwrestarg, blockarg = extract_forwardable_args(node.arguments)
150
150
  forwardable_args = redundant_forwardable_named_args(restarg, kwrestarg, blockarg)
151
- send_nodes = node.each_descendant(:send, :csend, :super).to_a
151
+ send_nodes = node.each_descendant(:send, :csend, :super, :yield).to_a
152
152
 
153
153
  send_classifications = classify_send_nodes(
154
154
  node, send_nodes, non_splat_or_block_pass_lvar_references(node.body), forwardable_args