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
@@ -16,9 +16,10 @@ module RuboCop
16
16
  #
17
17
  # # good
18
18
  # path = __dir__
19
- class Dir < Cop
20
- MSG = 'Use `__dir__` to get an absolute path to the current ' \
21
- "file's directory."
19
+ class Dir < Base
20
+ extend AutoCorrector
21
+
22
+ MSG = "Use `__dir__` to get an absolute path to the current file's directory."
22
23
 
23
24
  def_node_matcher :dir_replacement?, <<~PATTERN
24
25
  {(send (const {nil? cbase} :File) :expand_path (send (const {nil? cbase} :File) :dirname #file_keyword?))
@@ -27,13 +28,9 @@ module RuboCop
27
28
 
28
29
  def on_send(node)
29
30
  dir_replacement?(node) do
30
- add_offense(node)
31
- end
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- corrector.replace(node, '__dir__')
31
+ add_offense(node) do |corrector|
32
+ corrector.replace(node, '__dir__')
33
+ end
37
34
  end
38
35
  end
39
36
 
@@ -20,21 +20,19 @@ module RuboCop
20
20
  # def fixed_method_name_and_no_rubocop_comments
21
21
  # end
22
22
  #
23
- class DisableCopsWithinSourceCodeDirective < Cop
23
+ class DisableCopsWithinSourceCodeDirective < Base
24
+ extend AutoCorrector
25
+
24
26
  # rubocop:enable Lint/RedundantCopDisableDirective
25
27
  MSG = 'Comment to disable/enable RuboCop.'
26
28
 
27
- def investigate(processed_source)
29
+ def on_new_investigation
28
30
  processed_source.comments.each do |comment|
29
31
  next unless rubocop_directive_comment?(comment)
30
32
 
31
- add_offense(comment)
32
- end
33
- end
34
-
35
- def autocorrect(comment)
36
- lambda do |corrector|
37
- corrector.replace(comment, '')
33
+ add_offense(comment) do |corrector|
34
+ corrector.replace(comment, '')
35
+ end
38
36
  end
39
37
  end
40
38
 
@@ -55,7 +55,7 @@ module RuboCop
55
55
  # Public = Class.new
56
56
  # end
57
57
  #
58
- class Documentation < Cop
58
+ class Documentation < Base
59
59
  include DocumentationComment
60
60
 
61
61
  MSG = 'Missing top-level %<type>s documentation comment.'
@@ -84,9 +84,7 @@ module RuboCop
84
84
  return if compact_namespace?(node) &&
85
85
  nodoc_comment?(outer_module(node).first)
86
86
 
87
- add_offense(node,
88
- location: :keyword,
89
- message: format(MSG, type: type))
87
+ add_offense(node.loc.keyword, message: format(MSG, type: type))
90
88
  end
91
89
 
92
90
  def namespace?(node)
@@ -91,7 +91,7 @@ module RuboCop
91
91
  # end
92
92
  # end
93
93
  #
94
- class DocumentationMethod < Cop
94
+ class DocumentationMethod < Base
95
95
  include DocumentationComment
96
96
  include DefNode
97
97
 
@@ -24,29 +24,26 @@ module RuboCop
24
24
  # def f # rubocop:disable Style/For, Metrics/AbcSize
25
25
  # end
26
26
  #
27
- class DoubleCopDisableDirective < Cop
27
+ class DoubleCopDisableDirective < Base
28
+ extend AutoCorrector
29
+
28
30
  # rubocop:enable Style/For, Style/DoubleCopDisableDirective
29
31
  # rubocop:enable Lint/RedundantCopDisableDirective, Metrics/AbcSize
30
32
  MSG = 'More than one disable comment on one line.'
31
33
 
32
- def investigate(processed_source)
34
+ def on_new_investigation
33
35
  processed_source.comments.each do |comment|
34
36
  next unless comment.text.scan(/# rubocop:(?:disable|todo)/).size > 1
35
37
 
36
- add_offense(comment)
37
- end
38
- end
39
-
40
- def autocorrect(comment)
41
- prefix = if comment.text.start_with?('# rubocop:disable')
42
- '# rubocop:disable'
43
- else
44
- '# rubocop:todo'
45
- end
38
+ add_offense(comment) do |corrector|
39
+ prefix = if comment.text.start_with?('# rubocop:disable')
40
+ '# rubocop:disable'
41
+ else
42
+ '# rubocop:todo'
43
+ end
46
44
 
47
- lambda do |corrector|
48
- corrector.replace(comment,
49
- comment.text[/#{prefix} \S+/])
45
+ corrector.replace(comment, comment.text[/#{prefix} \S+/])
46
+ end
50
47
  end
51
48
  end
52
49
  end
@@ -32,7 +32,7 @@ module RuboCop
32
32
  # !!something and !something.nil? are not the same thing.
33
33
  # As you're unlikely to write code that can accept values of any type
34
34
  # this is rarely a problem in practice.
35
- class DoubleNegation < Cop
35
+ class DoubleNegation < Base
36
36
  include ConfigurableEnforcedStyle
37
37
 
38
38
  MSG = 'Avoid the use of double negation (`!!`).'
@@ -43,7 +43,7 @@ module RuboCop
43
43
  return unless double_negative?(node) && node.prefix_bang?
44
44
  return if style == :allowed_in_returns && allowed_in_returns?(node)
45
45
 
46
- add_offense(node, location: :selector)
46
+ add_offense(node.loc.selector)
47
47
  end
48
48
 
49
49
  private
@@ -22,7 +22,9 @@ module RuboCop
22
22
  #
23
23
  # # good
24
24
  # 10.times {}
25
- class EachForSimpleLoop < Cop
25
+ class EachForSimpleLoop < Base
26
+ extend AutoCorrector
27
+
26
28
  MSG = 'Use `Integer#times` for a simple loop which iterates a fixed ' \
27
29
  'number of times.'
28
30
 
@@ -33,17 +35,12 @@ module RuboCop
33
35
 
34
36
  range = send_node.receiver.source_range.join(send_node.loc.selector)
35
37
 
36
- add_offense(node, location: range)
37
- end
38
-
39
- def autocorrect(node)
40
- lambda do |corrector|
38
+ add_offense(range) do |corrector|
41
39
  range_type, min, max = offending_each_range(node)
42
40
 
43
41
  max += 1 if range_type == :irange
44
42
 
45
- corrector.replace(node.send_node,
46
- "#{max - min}.times")
43
+ corrector.replace(node.send_node, "#{max - min}.times")
47
44
  end
48
45
  end
49
46
 
@@ -16,7 +16,8 @@ module RuboCop
16
16
  #
17
17
  # # good
18
18
  # [1, 2].each_with_object({}) { |e, a| a[e] = e }
19
- class EachWithObject < Cop
19
+ class EachWithObject < Base
20
+ extend AutoCorrector
20
21
  include RangeHelp
21
22
 
22
23
  MSG = 'Use `each_with_object` instead of `%<method>s`.'
@@ -36,32 +37,30 @@ module RuboCop
36
37
  return unless first_argument_returned?(args, return_value)
37
38
  return if accumulator_param_assigned_to?(body, args)
38
39
 
39
- add_offense(node, location: method.loc.selector,
40
- message: format(MSG, method: method_name))
40
+ message = format(MSG, method: method_name)
41
+ add_offense(method.loc.selector, message: message) do |corrector|
42
+ autocorrect(corrector, node, return_value)
43
+ end
41
44
  end
42
45
  end
43
46
 
44
- def autocorrect(node)
45
- lambda do |corrector|
46
- corrector.replace(node.send_node.loc.selector, 'each_with_object')
47
+ private
47
48
 
48
- first_arg, second_arg = *node.arguments
49
+ def autocorrect(corrector, node, return_value)
50
+ corrector.replace(node.send_node.loc.selector, 'each_with_object')
49
51
 
50
- corrector.replace(first_arg, second_arg.source)
51
- corrector.replace(second_arg, first_arg.source)
52
+ first_arg, second_arg = *node.arguments
52
53
 
53
- return_value = return_value(node.body)
54
+ corrector.replace(first_arg, second_arg.source)
55
+ corrector.replace(second_arg, first_arg.source)
54
56
 
55
- if return_value_occupies_whole_line?(return_value)
56
- corrector.remove(whole_line_expression(return_value))
57
- else
58
- corrector.remove(return_value)
59
- end
57
+ if return_value_occupies_whole_line?(return_value)
58
+ corrector.remove(whole_line_expression(return_value))
59
+ else
60
+ corrector.remove(return_value)
60
61
  end
61
62
  end
62
63
 
63
- private
64
-
65
64
  def simple_method_arg?(method_arg)
66
65
  method_arg&.basic_literal?
67
66
  end
@@ -35,11 +35,11 @@ module RuboCop
35
35
  # else
36
36
  # puts 'more'
37
37
  # end
38
- class EmptyCaseCondition < Cop
38
+ class EmptyCaseCondition < Base
39
39
  include RangeHelp
40
+ extend AutoCorrector
40
41
 
41
- MSG = 'Do not use empty `case` condition, instead use an `if` '\
42
- 'expression.'
42
+ MSG = 'Do not use empty `case` condition, instead use an `if` expression.'
43
43
 
44
44
  def on_case(case_node)
45
45
  return if case_node.condition
@@ -54,26 +54,26 @@ module RuboCop
54
54
  body.each_descendant.any?(&:return_type?)
55
55
  end
56
56
 
57
- add_offense(case_node, location: :keyword)
57
+ add_offense(case_node.loc.keyword) do |corrector|
58
+ autocorrect(corrector, case_node)
59
+ end
58
60
  end
59
61
 
60
- def autocorrect(case_node)
62
+ private
63
+
64
+ def autocorrect(corrector, case_node)
61
65
  when_branches = case_node.when_branches
62
66
 
63
- lambda do |corrector|
64
- correct_case_when(corrector, case_node, when_branches)
65
- correct_when_conditions(corrector, when_branches)
66
- end
67
+ correct_case_when(corrector, case_node, when_branches)
68
+ correct_when_conditions(corrector, when_branches)
67
69
  end
68
70
 
69
- private
70
-
71
71
  def correct_case_when(corrector, case_node, when_nodes)
72
72
  case_range = case_node.loc.keyword.join(when_nodes.first.loc.keyword)
73
73
 
74
74
  corrector.replace(case_range, 'if')
75
75
 
76
- keep_first_when_comment(case_node, when_nodes.first, corrector)
76
+ keep_first_when_comment(case_range, corrector)
77
77
 
78
78
  when_nodes[1..-1].each do |when_node|
79
79
  corrector.replace(when_node.loc.keyword, 'elsif')
@@ -93,15 +93,14 @@ module RuboCop
93
93
  end
94
94
  end
95
95
 
96
- def keep_first_when_comment(case_node, first_when_node, corrector)
97
- comment = processed_source.comments_before_line(
98
- first_when_node.loc.keyword.line
99
- ).map(&:text).join("\n")
100
-
101
- line = range_by_whole_lines(case_node.source_range)
96
+ def keep_first_when_comment(case_range, corrector)
97
+ indent = ' ' * case_range.column
98
+ comments = processed_source.each_comment_in_lines(
99
+ case_range.first_line...case_range.last_line
100
+ ).map { |comment| "#{indent}#{comment.text}\n" }.join
102
101
 
103
- corrector.insert_before(line, "#{comment}\n") if !comment.empty? &&
104
- !case_node.parent
102
+ line_beginning = case_range.adjust(begin_pos: -case_range.column)
103
+ corrector.insert_before(line_beginning, comments)
105
104
  end
106
105
  end
107
106
  end
@@ -89,10 +89,11 @@ module RuboCop
89
89
  # if condition
90
90
  # statement
91
91
  # end
92
- class EmptyElse < Cop
92
+ class EmptyElse < Base
93
93
  include OnNormalIfUnless
94
94
  include ConfigurableEnforcedStyle
95
95
  include RangeHelp
96
+ extend AutoCorrector
96
97
 
97
98
  MSG = 'Redundant `else`-clause.'
98
99
 
@@ -104,16 +105,6 @@ module RuboCop
104
105
  check(node)
105
106
  end
106
107
 
107
- def autocorrect(node)
108
- return false if autocorrect_forbidden?(node.type.to_s)
109
- return false if comment_in_else?(node)
110
-
111
- lambda do |corrector|
112
- end_pos = base_node(node).loc.end.begin_pos
113
- corrector.remove(range_between(node.loc.else.begin_pos, end_pos))
114
- end
115
- end
116
-
117
108
  private
118
109
 
119
110
  def check(node)
@@ -132,24 +123,31 @@ module RuboCop
132
123
  def empty_check(node)
133
124
  return unless node.else? && !node.else_branch
134
125
 
135
- add_offense(node, location: :else)
126
+ add_offense(node.loc.else) do |corrector|
127
+ autocorrect(corrector, node)
128
+ end
136
129
  end
137
130
 
138
131
  def nil_check(node)
139
132
  return unless node.else_branch&.nil_type?
140
133
 
141
- add_offense(node, location: :else)
134
+ add_offense(node.loc.else) do |corrector|
135
+ autocorrect(corrector, node)
136
+ end
142
137
  end
143
138
 
144
- def comment_in_else?(node)
145
- range = else_line_range(node.loc)
146
- processed_source.find_comment { |c| range.include?(c.loc.line) }
139
+ def autocorrect(corrector, node)
140
+ return false if autocorrect_forbidden?(node.type.to_s)
141
+ return false if comment_in_else?(node.loc)
142
+
143
+ end_pos = base_node(node).loc.end.begin_pos
144
+ corrector.remove(range_between(node.loc.else.begin_pos, end_pos))
147
145
  end
148
146
 
149
- def else_line_range(loc)
150
- return 0..0 if loc.else.nil? || loc.end.nil?
147
+ def comment_in_else?(loc)
148
+ return false if loc.else.nil? || loc.end.nil?
151
149
 
152
- loc.else.first_line..loc.end.first_line
150
+ processed_source.contains_comment?(loc.else.join(loc.end))
153
151
  end
154
152
 
155
153
  def base_node(node)
@@ -16,14 +16,14 @@ module RuboCop
16
16
  # a = []
17
17
  # h = {}
18
18
  # s = ''
19
- class EmptyLiteral < Cop
19
+ class EmptyLiteral < Base
20
20
  include FrozenStringLiteral
21
21
  include RangeHelp
22
+ extend AutoCorrector
22
23
 
23
24
  ARR_MSG = 'Use array literal `[]` instead of `Array.new`.'
24
25
  HASH_MSG = 'Use hash literal `{}` instead of `Hash.new`.'
25
- STR_MSG = 'Use string literal `%<prefer>s` instead of ' \
26
- '`String.new`.'
26
+ STR_MSG = 'Use string literal `%<prefer>s` instead of `String.new`.'
27
27
 
28
28
  def_node_matcher :array_node, '(send (const {nil? cbase} :Array) :new)'
29
29
  def_node_matcher :hash_node, '(send (const {nil? cbase} :Hash) :new)'
@@ -34,26 +34,25 @@ module RuboCop
34
34
  '(block (send (const {nil? cbase} :Hash) :new) args _)'
35
35
 
36
36
  def on_send(node)
37
- add_offense(node, message: ARR_MSG) if offense_array_node?(node)
38
- add_offense(node, message: HASH_MSG) if offense_hash_node?(node)
37
+ return unless (message = offense_message(node))
39
38
 
40
- str_node(node) do
41
- return if frozen_string_literals_enabled?
42
-
43
- add_offense(node,
44
- message: format(STR_MSG,
45
- prefer: preferred_string_literal))
46
- end
47
- end
48
-
49
- def autocorrect(node)
50
- lambda do |corrector|
39
+ add_offense(node, message: message) do |corrector|
51
40
  corrector.replace(replacement_range(node), correction(node))
52
41
  end
53
42
  end
54
43
 
55
44
  private
56
45
 
46
+ def offense_message(node)
47
+ if offense_array_node?(node)
48
+ ARR_MSG
49
+ elsif offense_hash_node?(node)
50
+ HASH_MSG
51
+ elsif str_node(node) && !frozen_string_literals_enabled?
52
+ format(STR_MSG, prefer: preferred_string_literal)
53
+ end
54
+ end
55
+
57
56
  def preferred_string_literal
58
57
  enforce_double_quotes? ? '""' : "''"
59
58
  end
@@ -40,8 +40,9 @@ module RuboCop
40
40
  #
41
41
  # def self.foo(bar)
42
42
  # end
43
- class EmptyMethod < Cop
43
+ class EmptyMethod < Base
44
44
  include ConfigurableEnforcedStyle
45
+ extend AutoCorrector
45
46
 
46
47
  MSG_COMPACT = 'Put empty method definitions on a single line.'
47
48
  MSG_EXPANDED = 'Put the `end` of empty method definitions on the ' \
@@ -51,19 +52,15 @@ module RuboCop
51
52
  return if node.body || comment_lines?(node)
52
53
  return if correct_style?(node)
53
54
 
54
- add_offense(node)
55
- end
56
- alias on_defs on_def
57
-
58
- def autocorrect(node)
59
- lambda do |corrector|
55
+ add_offense(node) do |corrector|
60
56
  corrector.replace(node, corrected(node))
61
57
  end
62
58
  end
59
+ alias on_defs on_def
63
60
 
64
61
  private
65
62
 
66
- def message(_node)
63
+ def message(_range)
67
64
  compact_style? ? MSG_COMPACT : MSG_EXPANDED
68
65
  end
69
66