rubocop 0.89.0 → 0.89.1

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  4. data/lib/rubocop/comment_config.rb +3 -5
  5. data/lib/rubocop/config.rb +1 -1
  6. data/lib/rubocop/config_loader.rb +1 -1
  7. data/lib/rubocop/config_validator.rb +1 -1
  8. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  9. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  10. data/lib/rubocop/cop/layout/class_structure.rb +3 -7
  11. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  12. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -21
  13. data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
  14. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -1
  15. data/lib/rubocop/cop/lint/missing_super.rb +9 -9
  16. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +33 -4
  17. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +14 -17
  18. data/lib/rubocop/cop/lint/uri_regexp.rb +9 -25
  19. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  20. data/lib/rubocop/cop/mixin/alignment.rb +2 -1
  21. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  22. data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -2
  23. data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
  24. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  25. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
  26. data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
  27. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  28. data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
  29. data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -4
  30. data/lib/rubocop/cop/style/access_modifier_declarations.rb +5 -8
  31. data/lib/rubocop/cop/style/accessor_grouping.rb +20 -20
  32. data/lib/rubocop/cop/style/alias.rb +34 -33
  33. data/lib/rubocop/cop/style/and_or.rb +9 -11
  34. data/lib/rubocop/cop/style/array_join.rb +6 -8
  35. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  36. data/lib/rubocop/cop/style/attr.rb +11 -9
  37. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
  38. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  39. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  40. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -12
  41. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  42. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  43. data/lib/rubocop/cop/style/case_like_if.rb +17 -14
  44. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  45. data/lib/rubocop/cop/style/class_check.rb +7 -9
  46. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  47. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  48. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  49. data/lib/rubocop/cop/style/colon_method_call.rb +6 -7
  50. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  51. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  52. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  53. data/lib/rubocop/cop/style/commented_keyword.rb +1 -1
  54. data/lib/rubocop/cop/style/conditional_assignment.rb +1 -1
  55. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  56. data/lib/rubocop/cop/style/copyright.rb +12 -12
  57. data/lib/rubocop/cop/style/date_time.rb +1 -1
  58. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  59. data/lib/rubocop/cop/style/dir.rb +7 -10
  60. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  61. data/lib/rubocop/cop/style/documentation.rb +2 -4
  62. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  63. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  64. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  65. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  66. data/lib/rubocop/cop/style/each_with_object.rb +16 -17
  67. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  68. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  69. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  70. data/lib/rubocop/cop/style/empty_method.rb +5 -8
  71. data/lib/rubocop/cop/style/encoding.rb +5 -9
  72. data/lib/rubocop/cop/style/end_block.rb +4 -6
  73. data/lib/rubocop/cop/style/eval_with_location.rb +5 -7
  74. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  75. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -24
  76. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  77. data/lib/rubocop/cop/style/float_division.rb +1 -1
  78. data/lib/rubocop/cop/style/for.rb +11 -15
  79. data/lib/rubocop/cop/style/format_string.rb +17 -19
  80. data/lib/rubocop/cop/style/format_string_token.rb +4 -7
  81. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  82. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  83. data/lib/rubocop/cop/style/guard_clause.rb +3 -4
  84. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -1
  85. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  86. data/lib/rubocop/cop/style/hash_syntax.rb +0 -2
  87. data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
  88. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
  89. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  90. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  91. data/lib/rubocop/cop/style/if_unless_modifier.rb +10 -12
  92. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  93. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  94. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  95. data/lib/rubocop/cop/style/infinite_loop.rb +23 -23
  96. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  97. data/lib/rubocop/cop/style/inverse_methods.rb +20 -29
  98. data/lib/rubocop/cop/style/lambda.rb +7 -12
  99. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  100. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  101. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  102. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -11
  103. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  104. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +7 -6
  105. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
  106. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  107. data/lib/rubocop/cop/style/min_max.rb +8 -12
  108. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  109. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  110. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  111. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  112. data/lib/rubocop/cop/style/module_function.rb +10 -13
  113. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  114. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  115. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -10
  116. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  117. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  118. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
  119. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  120. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  121. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +3 -1
  122. data/lib/rubocop/cop/style/redundant_sort.rb +0 -2
  123. data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
  124. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  125. data/lib/rubocop/cop/util.rb +2 -0
  126. data/lib/rubocop/cops_documentation_generator.rb +1 -1
  127. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  128. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  129. data/lib/rubocop/options.rb +3 -3
  130. data/lib/rubocop/rspec/shared_contexts.rb +1 -5
  131. data/lib/rubocop/runner.rb +1 -1
  132. data/lib/rubocop/version.rb +1 -1
  133. metadata +4 -4
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # FOO = 2
20
20
  # foo = 2
21
21
  # $stdin.read
22
- class GlobalVars < Cop
22
+ class GlobalVars < Base
23
23
  MSG = 'Do not introduce global variables.'
24
24
 
25
25
  # built-in global variables and their English aliases
@@ -72,7 +72,7 @@ module RuboCop
72
72
  def check(node)
73
73
  global_var, = *node
74
74
 
75
- add_offense(node, location: :name) unless allowed_var?(global_var)
75
+ add_offense(node.loc.name) unless allowed_var?(global_var)
76
76
  end
77
77
  end
78
78
  end
@@ -46,7 +46,7 @@ module RuboCop
46
46
  # # good
47
47
  # foo || raise('exception') if something
48
48
  # ok
49
- class GuardClause < Cop
49
+ class GuardClause < Base
50
50
  include MinBodyLength
51
51
  include StatementModifier
52
52
 
@@ -105,9 +105,8 @@ module RuboCop
105
105
  example = "#{conditional_keyword} #{condition.source}; " \
106
106
  "#{scope_exiting_keyword}; end"
107
107
  end
108
- add_offense(node,
109
- location: :keyword,
110
- message: format(MSG, example: example))
108
+
109
+ add_offense(node.loc.keyword, message: format(MSG, example: example))
111
110
  end
112
111
 
113
112
  def guard_clause_source(guard_clause)
@@ -40,7 +40,7 @@ module RuboCop
40
40
  parent = node.parent
41
41
  return false unless parent
42
42
 
43
- parent.array_type? && parent.values.last == node
43
+ parent.array_type? && parent.children.last.equal?(node)
44
44
  end
45
45
 
46
46
  def check_braces(node)
@@ -17,8 +17,9 @@ module RuboCop
17
17
  # # good
18
18
  # hash.each_key { |k| p k }
19
19
  # hash.each_value { |v| p v }
20
- class HashEachMethods < Cop
20
+ class HashEachMethods < Base
21
21
  include Lint::UnusedArgument
22
+ extend AutoCorrector
22
23
 
23
24
  MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
24
25
 
@@ -30,12 +31,6 @@ module RuboCop
30
31
  register_kv_offense(node)
31
32
  end
32
33
 
33
- def autocorrect(node)
34
- lambda do |corrector|
35
- correct_key_value_each(node, corrector)
36
- end
37
- end
38
-
39
34
  private
40
35
 
41
36
  def register_kv_offense(node)
@@ -45,7 +40,9 @@ module RuboCop
45
40
  msg = format(message, prefer: "each_#{method[0..-2]}",
46
41
  current: "#{method}.each")
47
42
 
48
- add_offense(target, location: kv_range(target), message: msg)
43
+ add_offense(kv_range(target), message: msg) do |corrector|
44
+ correct_key_value_each(target, corrector)
45
+ end
49
46
  end
50
47
  end
51
48
 
@@ -62,7 +62,6 @@ module RuboCop
62
62
  MSG_NO_MIXED_KEYS = "Don't mix styles in the same hash."
63
63
  MSG_HASH_ROCKETS = 'Use hash rockets syntax.'
64
64
 
65
- # rubocop:disable Metrics/PerceivedComplexity, Metrics/AbcSize
66
65
  def on_hash(node)
67
66
  pairs = node.pairs
68
67
 
@@ -78,7 +77,6 @@ module RuboCop
78
77
  ruby19_check(pairs)
79
78
  end
80
79
  end
81
- # rubocop:enable Metrics/PerceivedComplexity, Metrics/AbcSize
82
80
 
83
81
  def ruby19_check(pairs)
84
82
  check(pairs, '=>', MSG_19) if sym_indices?(pairs)
@@ -23,9 +23,10 @@ module RuboCop
23
23
  # # good
24
24
  # {a: 1, b: 2}.transform_keys { |k| foo(k) }
25
25
  # {a: 1, b: 2}.transform_keys { |k| k.to_s }
26
- class HashTransformKeys < Cop
27
- extend TargetRubyVersion
26
+ class HashTransformKeys < Base
28
27
  include HashTransformMethod
28
+ extend TargetRubyVersion
29
+ extend AutoCorrector
29
30
 
30
31
  minimum_target_ruby_version 2.5
31
32
 
@@ -23,8 +23,9 @@ module RuboCop
23
23
  # # good
24
24
  # {a: 1, b: 2}.transform_values { |v| foo(v) }
25
25
  # {a: 1, b: 2}.transform_values { |v| v * v }
26
- class HashTransformValues < Cop
26
+ class HashTransformValues < Base
27
27
  include HashTransformMethod
28
+ extend AutoCorrector
28
29
 
29
30
  def_node_matcher :on_bad_each_with_object, <<~PATTERN
30
31
  (block
@@ -62,7 +62,7 @@ module RuboCop
62
62
  # do_x
63
63
  # do_z
64
64
  # end
65
- class IdenticalConditionalBranches < Cop
65
+ class IdenticalConditionalBranches < Base
66
66
  MSG = 'Move `%<source>s` out of the conditional.'
67
67
 
68
68
  def on_if(node)
@@ -58,7 +58,7 @@ module RuboCop
58
58
  # action_b
59
59
  # end
60
60
  #
61
- class IfInsideElse < Cop
61
+ class IfInsideElse < Base
62
62
  MSG = 'Convert `if` nested inside `else` to `elsif`.'
63
63
 
64
64
  def on_if(node)
@@ -69,7 +69,7 @@ module RuboCop
69
69
  return unless else_branch&.if_type? && else_branch&.if?
70
70
  return if allow_if_modifier_in_else_branch?(else_branch)
71
71
 
72
- add_offense(else_branch, location: :keyword)
72
+ add_offense(else_branch.loc.keyword)
73
73
  end
74
74
 
75
75
  private
@@ -30,10 +30,11 @@ module RuboCop
30
30
  # if long_condition
31
31
  # do_something_in_a_method_with_a_long_name(arg)
32
32
  # end
33
- class IfUnlessModifier < Cop
33
+ class IfUnlessModifier < Base
34
34
  include StatementModifier
35
35
  include LineLengthHelp
36
36
  include IgnoredPattern
37
+ extend AutoCorrector
37
38
 
38
39
  MSG_USE_MODIFIER = 'Favor modifier `%<keyword>s` usage when having a ' \
39
40
  'single-line body. Another good alternative is ' \
@@ -49,22 +50,22 @@ module RuboCop
49
50
  end
50
51
  return unless msg
51
52
 
52
- add_offense(node,
53
- location: :keyword,
54
- message: format(msg, keyword: node.keyword))
53
+ add_offense(node.loc.keyword, message: format(msg, keyword: node.keyword)) do |corrector|
54
+ autocorrect(corrector, node)
55
+ end
55
56
  end
56
57
 
57
- def autocorrect(node)
58
+ private
59
+
60
+ def autocorrect(corrector, node)
58
61
  replacement = if node.modifier_form?
59
62
  to_normal_form(node)
60
63
  else
61
64
  to_modifier_form(node)
62
65
  end
63
- ->(corrector) { corrector.replace(node, replacement) }
66
+ corrector.replace(node, replacement)
64
67
  end
65
68
 
66
- private
67
-
68
69
  def too_long_due_to_modifier?(node)
69
70
  node.modifier_form? && too_long_single_line?(node) &&
70
71
  !another_statement_on_same_line?(node)
@@ -158,10 +159,7 @@ module RuboCop
158
159
  end
159
160
 
160
161
  def first_line_comment(node)
161
- comment =
162
- processed_source.find_comment { |c| c.loc.line == node.loc.line }
163
-
164
- comment ? comment.loc.expression.source : nil
162
+ processed_source.comment_at_line(node.loc.line)&.text
165
163
  end
166
164
  end
167
165
  end
@@ -22,20 +22,16 @@ module RuboCop
22
22
  # if running?
23
23
  # tired? ? 'stop' : 'go faster'
24
24
  # end
25
- class IfUnlessModifierOfIfUnless < Cop
25
+ class IfUnlessModifierOfIfUnless < Base
26
26
  include StatementModifier
27
+ extend AutoCorrector
27
28
 
28
29
  MSG = 'Avoid modifier `%<keyword>s` after another conditional.'
29
30
 
30
31
  def on_if(node)
31
32
  return unless node.modifier_form? && node.body.if_type?
32
33
 
33
- add_offense(node, location: :keyword,
34
- message: format(MSG, keyword: node.keyword))
35
- end
36
-
37
- def autocorrect(node)
38
- lambda do |corrector|
34
+ add_offense(node.loc.keyword, message: format(MSG, keyword: node.keyword)) do |corrector|
39
35
  keyword = node.if? ? 'if' : 'unless'
40
36
 
41
37
  corrector.replace(node, <<~RUBY.chop)
@@ -13,8 +13,9 @@ module RuboCop
13
13
  # # good
14
14
  # result = some_condition ? something : another_thing
15
15
  #
16
- class IfWithSemicolon < Cop
16
+ class IfWithSemicolon < Base
17
17
  include OnNormalIfUnless
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Do not use if x; Use the ternary operator instead.'
20
21
 
@@ -24,11 +25,7 @@ module RuboCop
24
25
  beginning = node.loc.begin
25
26
  return unless beginning&.is?(';')
26
27
 
27
- add_offense(node)
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(node) do |corrector|
32
29
  corrector.replace(node, correct_to_ternary(node))
33
30
  end
34
31
  end
@@ -14,7 +14,7 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # raise ArgumentError, 'Error message here'
17
- class ImplicitRuntimeError < Cop
17
+ class ImplicitRuntimeError < Base
18
18
  MSG = 'Use `%<method>s` with an explicit exception class and message,' \
19
19
  ' rather than just a message.'
20
20
 
@@ -15,13 +15,15 @@ module RuboCop
15
15
  # loop do
16
16
  # work
17
17
  # end
18
- class InfiniteLoop < Cop
18
+ class InfiniteLoop < Base
19
+ extend AutoCorrector
20
+
19
21
  LEADING_SPACE = /\A(\s*)/.freeze
20
22
 
21
23
  MSG = 'Use `Kernel#loop` for infinite loops.'
22
24
 
23
- def join_force?(force_class)
24
- force_class == VariableForce
25
+ def self.joining_forces
26
+ VariableForce
25
27
  end
26
28
 
27
29
  def after_leaving_scope(scope, _variable_table)
@@ -40,16 +42,6 @@ module RuboCop
40
42
  alias on_while_post on_while
41
43
  alias on_until_post on_until
42
44
 
43
- def autocorrect(node)
44
- if node.while_post_type? || node.until_post_type?
45
- replace_begin_end_with_modifier(node)
46
- elsif node.modifier_form?
47
- replace_source(node.source_range, modifier_replacement(node))
48
- else
49
- replace_source(non_modifier_range(node), 'loop do')
50
- end
51
- end
52
-
53
45
  private
54
46
 
55
47
  def while_or_until(node)
@@ -66,7 +58,19 @@ module RuboCop
66
58
  referenced_after_loop?(var, range)
67
59
  end
68
60
 
69
- add_offense(node, location: :keyword)
61
+ add_offense(node.loc.keyword) do |corrector|
62
+ autocorrect(corrector, node)
63
+ end
64
+ end
65
+
66
+ def autocorrect(corrector, node)
67
+ if node.while_post_type? || node.until_post_type?
68
+ replace_begin_end_with_modifier(corrector, node)
69
+ elsif node.modifier_form?
70
+ replace_source(corrector, node.source_range, modifier_replacement(node))
71
+ else
72
+ replace_source(corrector, non_modifier_range(node), 'loop do')
73
+ end
70
74
  end
71
75
 
72
76
  def assigned_inside_loop?(var, range)
@@ -83,17 +87,13 @@ module RuboCop
83
87
  var.references.any? { |r| r.node.source_range.begin_pos > e }
84
88
  end
85
89
 
86
- def replace_begin_end_with_modifier(node)
87
- lambda do |corrector|
88
- corrector.replace(node.body.loc.begin, 'loop do')
89
- corrector.remove(node.body.loc.end.end.join(node.source_range.end))
90
- end
90
+ def replace_begin_end_with_modifier(corrector, node)
91
+ corrector.replace(node.body.loc.begin, 'loop do')
92
+ corrector.remove(node.body.loc.end.end.join(node.source_range.end))
91
93
  end
92
94
 
93
- def replace_source(range, replacement)
94
- lambda do |corrector|
95
- corrector.replace(range, replacement)
96
- end
95
+ def replace_source(corrector, range, replacement)
96
+ corrector.replace(range, replacement)
97
97
  end
98
98
 
99
99
  def modifier_replacement(node)
@@ -17,11 +17,11 @@ module RuboCop
17
17
  # foo.each do |f|
18
18
  # f.bar # Trailing inline comment
19
19
  # end
20
- class InlineComment < Cop
20
+ class InlineComment < Base
21
21
  MSG = 'Avoid trailing inline comments.'
22
22
 
23
- def investigate(processed_source)
24
- processed_source.each_comment do |comment|
23
+ def on_new_investigation
24
+ processed_source.comments.each do |comment|
25
25
  next if comment_line?(processed_source[comment.loc.line - 1]) ||
26
26
  comment.text.match?(/\A# rubocop:(enable|disable)/)
27
27
 
@@ -33,9 +33,10 @@ module RuboCop
33
33
  # next if f.zero?
34
34
  # f != 1
35
35
  # end
36
- class InverseMethods < Cop
36
+ class InverseMethods < Base
37
37
  include IgnoredNode
38
38
  include RangeHelp
39
+ extend AutoCorrector
39
40
 
40
41
  MSG = 'Use `%<inverse>s` instead of inverting `%<method>s`.'
41
42
  CLASS_COMPARISON_METHODS = %i[<= >= < >].freeze
@@ -70,9 +71,9 @@ module RuboCop
70
71
  return if part_of_ignored_node?(node)
71
72
  return if possible_class_hierarchy_check?(lhs, rhs, method)
72
73
 
73
- add_offense(node,
74
- message: format(MSG, method: method,
75
- inverse: inverse_methods[method]))
74
+ add_offense(node, message: message(method, inverse_methods[method])) do |corrector|
75
+ correct_inverse_method(corrector, node)
76
+ end
76
77
  end
77
78
  end
78
79
 
@@ -86,40 +87,28 @@ module RuboCop
86
87
  # offense, such as `y.reject { |key, _value| !(key =~ /c\d/) }`,
87
88
  # can cause auto-correction to apply improper corrections.
88
89
  ignore_node(block)
89
- add_offense(node,
90
- message: format(MSG, method: method,
91
- inverse: inverse_blocks[method]))
90
+ add_offense(node, message: message(method, inverse_blocks[method])) do |corrector|
91
+ correct_inverse_block(corrector, node)
92
+ end
92
93
  end
93
94
  end
94
95
 
95
- def autocorrect(node)
96
- if node.block_type?
97
- correct_inverse_block(node)
98
- elsif node.send_type?
99
- correct_inverse_method(node)
100
- end
101
- end
96
+ private
102
97
 
103
- def correct_inverse_method(node)
98
+ def correct_inverse_method(corrector, node)
104
99
  method_call, _lhs, method, _rhs = inverse_candidate?(node)
105
100
  return unless method_call && method
106
101
 
107
- lambda do |corrector|
108
- corrector.remove(not_to_receiver(node, method_call))
109
- corrector.replace(method_call.loc.selector,
110
- inverse_methods[method].to_s)
111
- remove_end_parenthesis(corrector, node, method, method_call)
112
- end
102
+ corrector.remove(not_to_receiver(node, method_call))
103
+ corrector.replace(method_call.loc.selector, inverse_methods[method].to_s)
104
+ remove_end_parenthesis(corrector, node, method, method_call)
113
105
  end
114
106
 
115
- def correct_inverse_block(node)
107
+ def correct_inverse_block(corrector, node)
116
108
  method_call, method, block = inverse_block?(node)
117
109
 
118
- lambda do |corrector|
119
- corrector.replace(method_call.loc.selector,
120
- inverse_blocks[method].to_s)
121
- correct_inverse_selector(block, corrector)
122
- end
110
+ corrector.replace(method_call.loc.selector, inverse_blocks[method].to_s)
111
+ correct_inverse_selector(block, corrector)
123
112
  end
124
113
 
125
114
  def correct_inverse_selector(block, corrector)
@@ -139,8 +128,6 @@ module RuboCop
139
128
  end
140
129
  end
141
130
 
142
- private
143
-
144
131
  def inverse_methods
145
132
  @inverse_methods ||= cop_config['InverseMethods']
146
133
  .merge(cop_config['InverseMethods'].invert)
@@ -190,6 +177,10 @@ module RuboCop
190
177
 
191
178
  corrector.remove(end_parentheses(node, method_call))
192
179
  end
180
+
181
+ def message(method, inverse)
182
+ format(MSG, method: method, inverse: inverse)
183
+ end
193
184
  end
194
185
  end
195
186
  end