rubocop 0.89.0 → 0.89.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -46,8 +46,9 @@ module RuboCop
46
46
  # f = ->(x) do
47
47
  # x
48
48
  # end
49
- class Lambda < Cop
49
+ class Lambda < Base
50
50
  include ConfigurableEnforcedStyle
51
+ extend AutoCorrector
51
52
 
52
53
  LITERAL_MESSAGE = 'Use the `-> { ... }` lambda literal syntax for ' \
53
54
  '%<modifier>s lambdas.'
@@ -69,21 +70,15 @@ module RuboCop
69
70
 
70
71
  return unless offending_selector?(node, selector)
71
72
 
72
- add_offense(node,
73
- location: node.send_node.source_range,
74
- message: message(node, selector))
75
- end
76
- alias on_numblock on_block
77
-
78
- def autocorrect(node)
79
- if node.send_node.source == 'lambda'
80
- lambda do |corrector|
73
+ add_offense(node.send_node.source_range, message: message(node, selector)) do |corrector|
74
+ if node.send_node.source == 'lambda'
81
75
  autocorrect_method_to_literal(corrector, node)
76
+ else
77
+ LambdaLiteralToMethodCorrector.new(node).call(corrector)
82
78
  end
83
- else
84
- LambdaLiteralToMethodCorrector.new(node)
85
79
  end
86
80
  end
81
+ alias on_numblock on_block
87
82
 
88
83
  private
89
84
 
@@ -18,30 +18,31 @@ module RuboCop
18
18
  #
19
19
  # # good
20
20
  # lambda.(x, y)
21
- class LambdaCall < Cop
21
+ class LambdaCall < Base
22
22
  include ConfigurableEnforcedStyle
23
+ extend AutoCorrector
23
24
 
24
25
  def on_send(node)
25
26
  return unless node.receiver && node.method?(:call)
26
27
 
27
- if offense?(node)
28
- add_offense(node) { opposite_style_detected }
28
+ if offense?(node) && opposite_style_detected
29
+ add_offense(node) do |corrector|
30
+ autocorrect(corrector, node)
31
+ end
29
32
  else
30
33
  correct_style_detected
31
34
  end
32
35
  end
33
36
 
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- if explicit_style?
37
- receiver = node.receiver.source
38
- replacement = node.source.sub("#{receiver}.", "#{receiver}.call")
37
+ def autocorrect(corrector, node)
38
+ if explicit_style?
39
+ receiver = node.receiver.source
40
+ replacement = node.source.sub("#{receiver}.", "#{receiver}.call")
39
41
 
40
- corrector.replace(node, replacement)
41
- else
42
- add_parentheses(node, corrector) unless node.parenthesized?
43
- corrector.remove(node.loc.selector)
44
- end
42
+ corrector.replace(node, replacement)
43
+ else
44
+ add_parentheses(node, corrector) unless node.parenthesized?
45
+ corrector.remove(node.loc.selector)
45
46
  end
46
47
  end
47
48
 
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # some_str = 'ala' \
20
20
  # 'bala'
21
21
  #
22
- class LineEndConcatenation < Cop
22
+ class LineEndConcatenation < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Use `\\` instead of `+` or `<<` to concatenate ' \
26
27
  'those strings.'
@@ -36,25 +37,12 @@ module RuboCop
36
37
  [Style::RedundantInterpolation]
37
38
  end
38
39
 
39
- def investigate(processed_source)
40
+ def on_new_investigation
40
41
  processed_source.tokens.each_index do |index|
41
42
  check_token_set(index)
42
43
  end
43
44
  end
44
45
 
45
- def autocorrect(operator_range)
46
- # Include any trailing whitespace so we don't create a syntax error.
47
- operator_range = range_with_surrounding_space(range: operator_range,
48
- side: :right,
49
- newlines: false)
50
- one_more_char = operator_range.resize(operator_range.size + 1)
51
- # Don't create a double backslash at the end of the line, in case
52
- # there already was a backslash after the concatenation operator.
53
- operator_range = one_more_char if one_more_char.source.end_with?('\\')
54
-
55
- ->(corrector) { corrector.replace(operator_range, '\\') }
56
- end
57
-
58
46
  private
59
47
 
60
48
  def check_token_set(index)
@@ -68,7 +56,22 @@ module RuboCop
68
56
 
69
57
  return unless eligible_next_successor?(next_successor)
70
58
 
71
- add_offense(operator.pos, location: operator.pos)
59
+ add_offense(operator.pos) do |corrector|
60
+ autocorrect(corrector, operator.pos)
61
+ end
62
+ end
63
+
64
+ def autocorrect(corrector, operator_range)
65
+ # Include any trailing whitespace so we don't create a syntax error.
66
+ operator_range = range_with_surrounding_space(range: operator_range,
67
+ side: :right,
68
+ newlines: false)
69
+ one_more_char = operator_range.resize(operator_range.size + 1)
70
+ # Don't create a double backslash at the end of the line, in case
71
+ # there already was a backslash after the concatenation operator.
72
+ operator_range = one_more_char if one_more_char.source.end_with?('\\')
73
+
74
+ corrector.replace(operator_range, '\\')
72
75
  end
73
76
 
74
77
  def eligible_token_set?(predecessor, operator, successor)
@@ -143,10 +143,11 @@ module RuboCop
143
143
  #
144
144
  # # good
145
145
  # Array 1
146
- class MethodCallWithArgsParentheses < Cop
146
+ class MethodCallWithArgsParentheses < Base
147
147
  include ConfigurableEnforcedStyle
148
148
  include IgnoredMethods
149
149
  include IgnoredPattern
150
+ extend AutoCorrector
150
151
 
151
152
  def initialize(*)
152
153
  super
@@ -15,14 +15,7 @@ module RuboCop
15
15
  return if allowed_camel_case_method_call?(node)
16
16
  return if legitimate_call_with_parentheses?(node)
17
17
 
18
- add_offense(node, location: node.loc.begin.join(node.loc.end))
19
- end
20
- alias on_csend on_send
21
- alias on_super on_send
22
- alias on_yield on_send
23
-
24
- def autocorrect(node)
25
- lambda do |corrector|
18
+ add_offense(offense_range(node)) do |corrector|
26
19
  if parentheses_at_the_end_of_multiline_call?(node)
27
20
  corrector.replace(args_begin(node), ' \\')
28
21
  else
@@ -31,13 +24,20 @@ module RuboCop
31
24
  corrector.remove(node.loc.end)
32
25
  end
33
26
  end
27
+ alias on_csend on_send
28
+ alias on_super on_send
29
+ alias on_yield on_send
30
+
31
+ private
32
+
33
+ def offense_range(node)
34
+ node.loc.begin.join(node.loc.end)
35
+ end
34
36
 
35
- def message(_node = nil)
37
+ def message(_range = nil)
36
38
  'Omit parentheses for method calls with arguments.'
37
39
  end
38
40
 
39
- private
40
-
41
41
  def super_call_without_arguments?(node)
42
42
  node.super_type? && node.arguments.none?
43
43
  end
@@ -12,19 +12,15 @@ module RuboCop
12
12
  return if eligible_for_parentheses_omission?(node)
13
13
  return unless node.arguments? && !node.parenthesized?
14
14
 
15
- add_offense(node)
16
- end
17
- alias on_csend on_send
18
- alias on_super on_send
19
- alias on_yield on_send
20
-
21
- def autocorrect(node)
22
- lambda do |corrector|
15
+ add_offense(node) do |corrector|
23
16
  corrector.replace(args_begin(node), '(')
24
17
 
25
18
  corrector.insert_after(args_end(node), ')') unless args_parenthesized?(node)
26
19
  end
27
20
  end
21
+ alias on_csend on_send
22
+ alias on_super on_send
23
+ alias on_yield on_send
28
24
 
29
25
  def message(_node = nil)
30
26
  'Use parentheses for method calls with arguments.'
@@ -11,8 +11,9 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # object.some_method
14
- class MethodCallWithoutArgsParentheses < Cop
14
+ class MethodCallWithoutArgsParentheses < Base
15
15
  include IgnoredMethods
16
+ extend AutoCorrector
16
17
 
17
18
  MSG = 'Do not use parentheses for method calls with ' \
18
19
  'no arguments.'
@@ -23,11 +24,7 @@ module RuboCop
23
24
  return if ignored_method?(node.method_name)
24
25
  return if same_name_assignment?(node)
25
26
 
26
- add_offense(node, location: node.loc.begin.join(node.loc.end))
27
- end
28
-
29
- def autocorrect(node)
30
- lambda do |corrector|
27
+ add_offense(offense_range(node)) do |corrector|
31
28
  corrector.remove(node.loc.begin)
32
29
  corrector.remove(node.loc.end)
33
30
  end
@@ -69,6 +66,10 @@ module RuboCop
69
66
 
70
67
  var_nodes.any? { |n| n.to_a.first == variable_name }
71
68
  end
69
+
70
+ def offense_range(node)
71
+ node.loc.begin.join(node.loc.end)
72
+ end
72
73
  end
73
74
  end
74
75
  end
@@ -12,7 +12,7 @@ module RuboCop
12
12
  # a do
13
13
  # b
14
14
  # end.c
15
- class MethodCalledOnDoEndBlock < Cop
15
+ class MethodCalledOnDoEndBlock < Base
16
16
  include RangeHelp
17
17
 
18
18
  MSG = 'Avoid chaining a method call on a do...end block.'
@@ -37,7 +37,7 @@ module RuboCop
37
37
  range = range_between(receiver.loc.end.begin_pos,
38
38
  node.source_range.end_pos)
39
39
 
40
- add_offense(nil, location: range)
40
+ add_offense(range)
41
41
  end
42
42
  alias on_csend on_send
43
43
  end
@@ -84,9 +84,10 @@ module RuboCop
84
84
  # last_descriptive_var_name)
85
85
  # do_something
86
86
  # end
87
- class MethodDefParentheses < Cop
87
+ class MethodDefParentheses < Base
88
88
  include ConfigurableEnforcedStyle
89
89
  include RangeHelp
90
+ extend AutoCorrector
90
91
 
91
92
  MSG_PRESENT = 'Use def without parentheses.'
92
93
  MSG_MISSING = 'Use def with parentheses when there are ' \
@@ -109,17 +110,6 @@ module RuboCop
109
110
  end
110
111
  alias on_defs on_def
111
112
 
112
- def autocorrect(node)
113
- lambda do |corrector|
114
- if node.args_type?
115
- # offense is registered on args node when parentheses are unwanted
116
- correct_arguments(node, corrector)
117
- else
118
- correct_definition(node, corrector)
119
- end
120
- end
121
- end
122
-
123
113
  private
124
114
 
125
115
  def correct_arguments(arg_node, corrector)
@@ -150,14 +140,19 @@ module RuboCop
150
140
  def missing_parentheses(node)
151
141
  location = node.arguments.source_range
152
142
 
153
- add_offense(node, location: location, message: MSG_MISSING) do
154
- unexpected_style_detected(:require_no_parentheses)
143
+ return unless unexpected_style_detected(:require_no_parentheses)
144
+
145
+ add_offense(location, message: MSG_MISSING) do |corrector|
146
+ correct_definition(node, corrector)
155
147
  end
156
148
  end
157
149
 
158
150
  def unwanted_parentheses(args)
159
- add_offense(args, message: MSG_PRESENT) do
160
- unexpected_style_detected(:require_parentheses)
151
+ return unless unexpected_style_detected(:require_parentheses)
152
+
153
+ add_offense(args, message: MSG_PRESENT) do |corrector|
154
+ # offense is registered on args node when parentheses are unwanted
155
+ correct_arguments(args, corrector)
161
156
  end
162
157
  end
163
158
  end
@@ -14,27 +14,23 @@ module RuboCop
14
14
  # # good
15
15
  # bar = foo.minmax
16
16
  # return foo.minmax
17
- class MinMax < Cop
17
+ class MinMax < Base
18
+ extend AutoCorrector
19
+
18
20
  MSG = 'Use `%<receiver>s.minmax` instead of `%<offender>s`.'
19
21
 
20
22
  def on_array(node)
21
23
  min_max_candidate(node) do |receiver|
22
24
  offender = offending_range(node)
23
25
 
24
- add_offense(node, location: offender,
25
- message: message(offender, receiver))
26
- end
27
- end
28
- alias on_return on_array
29
-
30
- def autocorrect(node)
31
- receiver = node.children.first.receiver
26
+ add_offense(offender, message: message(offender, receiver)) do |corrector|
27
+ receiver = node.children.first.receiver
32
28
 
33
- lambda do |corrector|
34
- corrector.replace(offending_range(node),
35
- "#{receiver.source}.minmax")
29
+ corrector.replace(offending_range(node), "#{receiver.source}.minmax")
30
+ end
36
31
  end
37
32
  end
33
+ alias on_return on_array
38
34
 
39
35
  private
40
36
 
@@ -93,7 +93,7 @@ module RuboCop
93
93
  # else
94
94
  # # the content of `else` branch will be determined by Style/EmptyElse
95
95
  # end
96
- class MissingElse < Cop
96
+ class MissingElse < Base
97
97
  include OnNormalIfUnless
98
98
  include ConfigurableEnforcedStyle
99
99
 
@@ -119,20 +119,20 @@ module RuboCop
119
119
  private
120
120
 
121
121
  def check(node)
122
- add_offense(node) unless node.else?
122
+ return if node.else?
123
+
124
+ add_offense(node, message: format(message_template, type: node.type))
123
125
  end
124
126
 
125
- def message(node)
126
- template = case empty_else_style
127
- when :empty
128
- MSG_NIL
129
- when :nil
130
- MSG_EMPTY
131
- else
132
- MSG
133
- end
134
-
135
- format(template, type: node.type)
127
+ def message_template
128
+ case empty_else_style
129
+ when :empty
130
+ MSG_NIL
131
+ when :nil
132
+ MSG_EMPTY
133
+ else
134
+ MSG
135
+ end
136
136
  end
137
137
 
138
138
  def if_style?
@@ -21,7 +21,7 @@ module RuboCop
21
21
  # # ...
22
22
  # end
23
23
  #
24
- class MissingRespondToMissing < Cop
24
+ class MissingRespondToMissing < Base
25
25
  MSG =
26
26
  'When using `method_missing`, define `respond_to_missing?`.'
27
27
 
@@ -30,8 +30,9 @@ module RuboCop
30
30
  # class Foo
31
31
  # extend Qox, Bar
32
32
  # end
33
- class MixinGrouping < Cop
33
+ class MixinGrouping < Base
34
34
  include ConfigurableEnforcedStyle
35
+ extend AutoCorrector
35
36
 
36
37
  MIXIN_METHODS = %i[extend include prepend].freeze
37
38
  MSG = 'Put `%<mixin>s` mixins in %<suffix>s.'
@@ -47,23 +48,6 @@ module RuboCop
47
48
 
48
49
  alias on_module on_class
49
50
 
50
- def autocorrect(node)
51
- range = node.loc.expression
52
- if separated_style?
53
- correction = separate_mixins(node)
54
- else
55
- mixins = sibling_mixins(node)
56
- if node == mixins.first
57
- correction = group_mixins(node, mixins)
58
- else
59
- range = range_to_remove_for_subsequent_mixin(mixins, node)
60
- correction = ''
61
- end
62
- end
63
-
64
- ->(corrector) { corrector.replace(range, correction) }
65
- end
66
-
67
51
  private
68
52
 
69
53
  def range_to_remove_for_subsequent_mixin(mixins, node)
@@ -89,13 +73,33 @@ module RuboCop
89
73
  def check_grouped_style(send_node)
90
74
  return if sibling_mixins(send_node).size == 1
91
75
 
92
- add_offense(send_node)
76
+ message = format(MSG, mixin: send_node.method_name, suffix: 'a single statement')
77
+
78
+ add_offense(send_node, message: message) do |corrector|
79
+ range = send_node.loc.expression
80
+ mixins = sibling_mixins(send_node)
81
+ if send_node == mixins.first
82
+ correction = group_mixins(send_node, mixins)
83
+ else
84
+ range = range_to_remove_for_subsequent_mixin(mixins, send_node)
85
+ correction = ''
86
+ end
87
+
88
+ corrector.replace(range, correction)
89
+ end
93
90
  end
94
91
 
95
92
  def check_separated_style(send_node)
96
93
  return if send_node.arguments.one?
97
94
 
98
- add_offense(send_node)
95
+ message = format(MSG, mixin: send_node.method_name, suffix: 'separate statements')
96
+
97
+ add_offense(send_node, message: message) do |corrector|
98
+ range = send_node.loc.expression
99
+ correction = separate_mixins(send_node)
100
+
101
+ corrector.replace(range, correction)
102
+ end
99
103
  end
100
104
 
101
105
  def sibling_mixins(send_node)
@@ -107,13 +111,6 @@ module RuboCop
107
111
  end
108
112
  end
109
113
 
110
- def message(send_node)
111
- suffix =
112
- separated_style? ? 'separate statements' : 'a single statement'
113
-
114
- format(MSG, mixin: send_node.method_name, suffix: suffix)
115
- end
116
-
117
114
  def grouped_style?
118
115
  style == :grouped
119
116
  end