rubocop 0.88.0 → 0.89.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 (239) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +96 -16
  5. data/lib/rubocop.rb +16 -4
  6. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -1
  7. data/lib/rubocop/cli/command/base.rb +1 -0
  8. data/lib/rubocop/cli/command/execute_runner.rb +1 -1
  9. data/lib/rubocop/cli/command/show_cops.rb +1 -1
  10. data/lib/rubocop/cli/command/version.rb +2 -2
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +19 -2
  13. data/lib/rubocop/config_loader.rb +1 -1
  14. data/lib/rubocop/config_loader_resolver.rb +3 -3
  15. data/lib/rubocop/config_obsoletion.rb +6 -1
  16. data/lib/rubocop/config_validator.rb +1 -3
  17. data/lib/rubocop/cop/base.rb +2 -2
  18. data/lib/rubocop/cop/commissioner.rb +0 -1
  19. data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -3
  20. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
  21. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
  22. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  23. data/lib/rubocop/cop/force.rb +1 -0
  24. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  25. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  26. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  27. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  28. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  29. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  30. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  31. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  32. data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
  33. data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
  34. data/lib/rubocop/cop/layout/extra_spacing.rb +9 -16
  35. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
  36. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  37. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  38. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
  39. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
  40. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  41. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  42. data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
  43. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  44. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  45. data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
  46. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +49 -0
  47. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  48. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  49. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  50. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  51. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  52. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  53. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  54. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  55. data/lib/rubocop/cop/lint/duplicate_methods.rb +7 -4
  56. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
  57. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  58. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  59. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  60. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  61. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  62. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  63. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  64. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  65. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  66. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  67. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  68. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  69. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  70. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  71. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  72. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  73. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  74. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  75. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  76. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  77. data/lib/rubocop/cop/lint/loop.rb +23 -2
  78. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  79. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  80. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  81. data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
  82. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  83. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  84. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  85. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  86. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  87. data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
  88. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  89. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +61 -0
  90. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  91. data/lib/rubocop/cop/lint/percent_string_array.rb +13 -12
  92. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  93. data/lib/rubocop/cop/lint/raise_exception.rb +12 -10
  94. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  95. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +2 -2
  96. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  97. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
  98. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  99. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  100. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  101. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  102. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  103. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  104. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  105. data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
  106. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  107. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  108. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  109. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  110. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  111. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  112. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
  113. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  114. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  115. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
  116. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  117. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  118. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  119. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  120. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  121. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  122. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  123. data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
  124. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  125. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  126. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
  127. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -31
  128. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  129. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  130. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  131. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  132. data/lib/rubocop/cop/lint/void.rb +3 -7
  133. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  134. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  135. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  136. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  137. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  138. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  139. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  140. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  141. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  142. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +48 -5
  143. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +52 -24
  144. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  145. data/lib/rubocop/cop/migration/department_name.rb +13 -15
  146. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  147. data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
  148. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  149. data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -0
  150. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  151. data/lib/rubocop/cop/mixin/statement_modifier.rb +35 -6
  152. data/lib/rubocop/cop/mixin/surrounding_space.rb +0 -25
  153. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  154. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  155. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  156. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  157. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  158. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  159. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  160. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  161. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  162. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  163. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  164. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  165. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  166. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  167. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  168. data/lib/rubocop/cop/registry.rb +3 -3
  169. data/lib/rubocop/cop/security/eval.rb +2 -2
  170. data/lib/rubocop/cop/security/json_load.rb +6 -8
  171. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  172. data/lib/rubocop/cop/security/open.rb +2 -2
  173. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  174. data/lib/rubocop/cop/style/access_modifier_declarations.rb +11 -1
  175. data/lib/rubocop/cop/style/accessor_grouping.rb +9 -7
  176. data/lib/rubocop/cop/style/alias.rb +7 -3
  177. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +0 -2
  178. data/lib/rubocop/cop/style/case_equality.rb +22 -3
  179. data/lib/rubocop/cop/style/case_like_if.rb +2 -2
  180. data/lib/rubocop/cop/style/colon_method_call.rb +3 -3
  181. data/lib/rubocop/cop/style/conditional_assignment.rb +11 -2
  182. data/lib/rubocop/cop/style/documentation.rb +4 -4
  183. data/lib/rubocop/cop/style/each_with_object.rb +0 -2
  184. data/lib/rubocop/cop/style/empty_method.rb +5 -5
  185. data/lib/rubocop/cop/style/eval_with_location.rb +4 -0
  186. data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -0
  187. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  188. data/lib/rubocop/cop/style/format_string.rb +4 -0
  189. data/lib/rubocop/cop/style/format_string_token.rb +1 -0
  190. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  191. data/lib/rubocop/cop/style/guard_clause.rb +2 -2
  192. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +8 -1
  193. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  194. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  195. data/lib/rubocop/cop/style/if_inside_else.rb +1 -1
  196. data/lib/rubocop/cop/style/if_unless_modifier.rb +0 -20
  197. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  198. data/lib/rubocop/cop/style/inverse_methods.rb +2 -3
  199. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +5 -0
  200. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -1
  201. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +9 -2
  202. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  203. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  204. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -0
  205. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  206. data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
  207. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
  208. data/lib/rubocop/cop/style/random_with_offset.rb +1 -0
  209. data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
  210. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  211. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -9
  212. data/lib/rubocop/cop/style/redundant_sort.rb +25 -10
  213. data/lib/rubocop/cop/style/signal_exception.rb +2 -0
  214. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  215. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  216. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  217. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  218. data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
  219. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  220. data/lib/rubocop/cop/style/zero_length_predicate.rb +10 -6
  221. data/lib/rubocop/cop/team.rb +1 -1
  222. data/lib/rubocop/cop/tokens_util.rb +84 -0
  223. data/lib/rubocop/cop/util.rb +1 -13
  224. data/lib/rubocop/cop/variable_force.rb +0 -2
  225. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  226. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  227. data/lib/rubocop/cops_documentation_generator.rb +282 -0
  228. data/lib/rubocop/error.rb +1 -0
  229. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  230. data/lib/rubocop/path_util.rb +19 -4
  231. data/lib/rubocop/rake_task.rb +1 -0
  232. data/lib/rubocop/rspec/expect_offense.rb +1 -1
  233. data/lib/rubocop/target_finder.rb +12 -9
  234. data/lib/rubocop/version.rb +2 -2
  235. metadata +19 -6
  236. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  237. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  238. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  239. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -27,13 +27,14 @@ module RuboCop
27
27
  # # frozen_string_literal: true
28
28
  # p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
29
29
  #
30
- class OrderedMagicComments < Cop
30
+ class OrderedMagicComments < Base
31
31
  include FrozenStringLiteral
32
+ extend AutoCorrector
32
33
 
33
34
  MSG = 'The encoding magic comment should precede all other ' \
34
35
  'magic comments.'
35
36
 
36
- def investigate(processed_source)
37
+ def on_new_investigation
37
38
  return if processed_source.buffer.source.empty?
38
39
 
39
40
  encoding_line, frozen_string_literal_line = magic_comment_lines
@@ -43,24 +44,21 @@ module RuboCop
43
44
 
44
45
  range = processed_source.buffer.line_range(encoding_line + 1)
45
46
 
46
- add_offense(range, location: range)
47
+ add_offense(range) do |corrector|
48
+ autocorrect(corrector, encoding_line, frozen_string_literal_line)
49
+ end
47
50
  end
48
51
 
49
- def autocorrect(_node)
50
- encoding_line, frozen_string_literal_line = magic_comment_lines
52
+ private
51
53
 
54
+ def autocorrect(corrector, encoding_line, frozen_string_literal_line)
52
55
  range1 = processed_source.buffer.line_range(encoding_line + 1)
53
- range2 =
54
- processed_source.buffer.line_range(frozen_string_literal_line + 1)
56
+ range2 = processed_source.buffer.line_range(frozen_string_literal_line + 1)
55
57
 
56
- lambda do |corrector|
57
- corrector.replace(range1, range2.source)
58
- corrector.replace(range2, range1.source)
59
- end
58
+ corrector.replace(range1, range2.source)
59
+ corrector.replace(range2, range1.source)
60
60
  end
61
61
 
62
- private
63
-
64
62
  def magic_comment_lines
65
63
  lines = [nil, nil]
66
64
 
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # This cops looks for references of Regexp captures that are out of range
7
+ # and thus always returns nil.
8
+ #
9
+ # @example
10
+ #
11
+ # /(foo)bar/ =~ 'foobar'
12
+ #
13
+ # # bad - always returns nil
14
+ #
15
+ # puts $2 # => nil
16
+ #
17
+ # # good
18
+ #
19
+ # puts $1 # => foo
20
+ #
21
+ class OutOfRangeRegexpRef < Base
22
+ MSG = 'Do not use out of range reference for the Regexp.'
23
+
24
+ def on_new_investigation
25
+ @valid_ref = 0
26
+ end
27
+
28
+ def on_regexp(node)
29
+ @valid_ref = nil
30
+ return if contain_non_literal?(node)
31
+
32
+ tree = Regexp::Parser.parse(node.content)
33
+ @valid_ref = regexp_captures(tree)
34
+ end
35
+
36
+ def on_nth_ref(node)
37
+ backref, = *node
38
+ return if @valid_ref.nil?
39
+
40
+ add_offense(node) if backref > @valid_ref
41
+ end
42
+
43
+ private
44
+
45
+ def contain_non_literal?(node)
46
+ node.children.size != 2 || !node.children.first.str_type?
47
+ end
48
+
49
+ def regexp_captures(tree)
50
+ named_capture = numbered_capture = 0
51
+ tree.each_expression do |e|
52
+ if e.type?(:group)
53
+ e.respond_to?(:name) ? named_capture += 1 : numbered_capture += 1
54
+ end
55
+ end
56
+ named_capture.positive? ? named_capture : numbered_capture
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -15,8 +15,9 @@ module RuboCop
15
15
  # do_something(foo)
16
16
  # do_something (2 + 3) * 4
17
17
  # do_something (foo * bar).baz
18
- class ParenthesesAsGroupedExpression < Cop
18
+ class ParenthesesAsGroupedExpression < Base
19
19
  include RangeHelp
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = '`(...)` interpreted as grouped expression.'
22
23
 
@@ -28,18 +29,11 @@ module RuboCop
28
29
 
29
30
  range = space_range(node.first_argument.source_range, space_length)
30
31
 
31
- add_offense(node, location: range)
32
- end
33
- alias on_csend on_send
34
-
35
- def autocorrect(node)
36
- space_length = spaces_before_left_parenthesis(node)
37
- range = space_range(node.first_argument.source_range, space_length)
38
-
39
- lambda do |corrector|
32
+ add_offense(range) do |corrector|
40
33
  corrector.remove(range)
41
34
  end
42
35
  end
36
+ alias on_csend on_send
43
37
 
44
38
  private
45
39
 
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # good
21
21
  #
22
22
  # %w(foo bar)
23
- class PercentStringArray < Cop
23
+ class PercentStringArray < Base
24
24
  include PercentLiteral
25
+ extend AutoCorrector
25
26
 
26
27
  QUOTES_AND_COMMAS = [/,$/, /^'.*'$/, /^".*"$/].freeze
27
28
  LEADING_QUOTE = /^['"]/.freeze
@@ -37,24 +38,24 @@ module RuboCop
37
38
  def on_percent_literal(node)
38
39
  return unless contains_quotes_or_commas?(node)
39
40
 
40
- add_offense(node)
41
+ add_offense(node) do |corrector|
42
+ autocorrect(corrector, node)
43
+ end
41
44
  end
42
45
 
43
- def autocorrect(node)
44
- lambda do |corrector|
45
- node.each_value do |value|
46
- range = value.loc.expression
46
+ private
47
+
48
+ def autocorrect(corrector, node)
49
+ node.each_value do |value|
50
+ range = value.loc.expression
47
51
 
48
- match = range.source.match(TRAILING_QUOTE)
49
- corrector.remove_trailing(range, match[0].length) if match
52
+ match = range.source.match(TRAILING_QUOTE)
53
+ corrector.remove_trailing(range, match[0].length) if match
50
54
 
51
- corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
52
- end
55
+ corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
53
56
  end
54
57
  end
55
58
 
56
- private
57
-
58
59
  def contains_quotes_or_commas?(node)
59
60
  node.values.any? do |value|
60
61
  literal = value.children.first.to_s.scrub
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # # good
21
21
  #
22
22
  # %i(foo bar)
23
- class PercentSymbolArray < Cop
23
+ class PercentSymbolArray < Base
24
24
  include PercentLiteral
25
+ extend AutoCorrector
25
26
 
26
27
  MSG = "Within `%i`/`%I`, ':' and ',' are unnecessary and may be " \
27
28
  'unwanted in the resulting symbols.'
@@ -33,23 +34,23 @@ module RuboCop
33
34
  def on_percent_literal(node)
34
35
  return unless contains_colons_or_commas?(node)
35
36
 
36
- add_offense(node)
37
+ add_offense(node) do |corrector|
38
+ autocorrect(corrector, node)
39
+ end
37
40
  end
38
41
 
39
- def autocorrect(node)
40
- lambda do |corrector|
41
- node.children.each do |child|
42
- range = child.loc.expression
42
+ private
43
+
44
+ def autocorrect(corrector, node)
45
+ node.children.each do |child|
46
+ range = child.loc.expression
43
47
 
44
- corrector.remove_trailing(range, 1) if range.source.end_with?(',')
45
- corrector.remove_leading(range, 1) if
46
- range.source.start_with?(':')
47
- end
48
+ corrector.remove_trailing(range, 1) if range.source.end_with?(',')
49
+ corrector.remove_leading(range, 1) if
50
+ range.source.start_with?(':')
48
51
  end
49
52
  end
50
53
 
51
- private
52
-
53
54
  def contains_colons_or_commas?(node)
54
55
  node.children.any? do |child|
55
56
  literal = child.children.first.to_s
@@ -27,7 +27,9 @@ module RuboCop
27
27
  # raise Exception # This exception means `Gem::Exception`.
28
28
  # end
29
29
  # end
30
- class RaiseException < Cop
30
+ class RaiseException < Base
31
+ extend AutoCorrector
32
+
31
33
  MSG = 'Use `StandardError` over `Exception`.'
32
34
 
33
35
  def_node_matcher :exception?, <<~PATTERN
@@ -44,21 +46,21 @@ module RuboCop
44
46
  exception_new_with_message?(node, &check(node))
45
47
  end
46
48
 
47
- def autocorrect(node)
48
- lambda do |corrector|
49
- exception_class = node.children.first&.cbase_type? ? '::StandardError' : 'StandardError'
50
-
51
- corrector.replace(node, exception_class)
52
- end
53
- end
54
-
55
49
  private
56
50
 
57
51
  def check(node)
58
52
  lambda do |exception_class, cbase|
59
53
  return if cbase.nil? && implicit_namespace?(node)
60
54
 
61
- add_offense(exception_class)
55
+ add_offense(exception_class) do |corrector|
56
+ prefer_exception = if exception_class.children.first&.cbase_type?
57
+ '::StandardError'
58
+ else
59
+ 'StandardError'
60
+ end
61
+
62
+ corrector.replace(exception_class, prefer_exception)
63
+ end
62
64
  end
63
65
  end
64
66
 
@@ -20,7 +20,7 @@ module RuboCop
20
20
  # # good
21
21
  #
22
22
  # 0 # just use 0 instead
23
- class RandOne < Cop
23
+ class RandOne < Base
24
24
  MSG = '`%<method>s` always returns `0`. ' \
25
25
  'Perhaps you meant `rand(2)` or `rand`?'
26
26
 
@@ -29,7 +29,7 @@ module RuboCop
29
29
  PATTERN
30
30
 
31
31
  def on_send(node)
32
- return unless rand_one?(node)
32
+ return unless node.method?(:rand) && rand_one?(node)
33
33
 
34
34
  add_offense(node)
35
35
  end
@@ -135,7 +135,7 @@ module RuboCop
135
135
  end
136
136
  end
137
137
 
138
- # rubocop:todo Metrics/CyclomaticComplexity
138
+ # rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
139
139
  def find_redundant(comment, offenses, cop, line_range, next_line_range)
140
140
  if all_disabled?(comment)
141
141
  # If there's a disable all comment followed by a comment
@@ -153,7 +153,7 @@ module RuboCop
153
153
  cop if cop_offenses.none? { |o| line_range.cover?(o.line) }
154
154
  end
155
155
  end
156
- # rubocop:enable Metrics/CyclomaticComplexity
156
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
157
157
 
158
158
  def all_disabled?(comment)
159
159
  /rubocop\s*:\s*(?:disable|todo)\s+all\b/.match?(comment.text)
@@ -34,28 +34,24 @@ module RuboCop
34
34
  # foo = "1"
35
35
  # # rubocop:enable all
36
36
  # baz
37
- class RedundantCopEnableDirective < Cop
37
+ class RedundantCopEnableDirective < Base
38
38
  include RangeHelp
39
39
  include SurroundingSpace
40
+ extend AutoCorrector
40
41
 
41
42
  MSG = 'Unnecessary enabling of %<cop>s.'
42
43
 
43
- def investigate(processed_source)
44
+ def on_new_investigation
44
45
  return if processed_source.blank?
45
46
 
46
47
  offenses = processed_source.comment_config.extra_enabled_comments
47
48
  offenses.each do |comment, name|
48
49
  add_offense(
49
- [comment, name],
50
- location: range_of_offense(comment, name),
50
+ range_of_offense(comment, name),
51
51
  message: format(MSG, cop: all_or_name(name))
52
- )
53
- end
54
- end
55
-
56
- def autocorrect(comment_and_name)
57
- lambda do |corrector|
58
- corrector.remove(range_with_comma(*comment_and_name))
52
+ ) do |corrector|
53
+ corrector.remove(range_with_comma(comment, name))
54
+ end
59
55
  end
60
56
  end
61
57
 
@@ -21,8 +21,9 @@ module RuboCop
21
21
  #
22
22
  # # good
23
23
  # require 'unloaded_feature'
24
- class RedundantRequireStatement < Cop
24
+ class RedundantRequireStatement < Base
25
25
  include RangeHelp
26
+ extend AutoCorrector
26
27
 
27
28
  MSG = 'Remove unnecessary `require` statement.'
28
29
 
@@ -34,13 +35,9 @@ module RuboCop
34
35
  def on_send(node)
35
36
  return unless unnecessary_require_statement?(node)
36
37
 
37
- add_offense(node)
38
- end
38
+ add_offense(node) do |corrector|
39
+ range = range_with_surrounding_space(range: node.loc.expression, side: :right)
39
40
 
40
- def autocorrect(node)
41
- lambda do |corrector|
42
- range = range_with_surrounding_space(range: node.loc.expression,
43
- side: :right)
44
41
  corrector.remove(range)
45
42
  end
46
43
  end
@@ -49,7 +49,9 @@ module RuboCop
49
49
  # else
50
50
  # baz
51
51
  # end
52
- class RedundantSplatExpansion < Cop
52
+ class RedundantSplatExpansion < Base
53
+ extend AutoCorrector
54
+
53
55
  MSG = 'Replace splat expansion with comma separated values.'
54
56
  ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
55
57
  PERCENT_W = '%w'
@@ -73,23 +75,25 @@ module RuboCop
73
75
  redundant_splat_expansion(node) do
74
76
  if array_splat?(node) &&
75
77
  (method_argument?(node) || part_of_an_array?(node))
76
- add_offense(node, message: ARRAY_PARAM_MSG)
78
+ add_offense(node, message: ARRAY_PARAM_MSG) do |corrector|
79
+ autocorrect(corrector, node)
80
+ end
77
81
  else
78
- add_offense(node)
82
+ add_offense(node) do |corrector|
83
+ autocorrect(corrector, node)
84
+ end
79
85
  end
80
86
  end
81
87
  end
82
88
 
83
- def autocorrect(node)
89
+ private
90
+
91
+ def autocorrect(corrector, node)
84
92
  range, content = replacement_range_and_content(node)
85
93
 
86
- lambda do |corrector|
87
- corrector.replace(range, content)
88
- end
94
+ corrector.replace(range, content)
89
95
  end
90
96
 
91
- private
92
-
93
97
  def redundant_splat_expansion(node)
94
98
  literal_expansion(node) do |expanded_item|
95
99
  if expanded_item.send_type?
@@ -17,8 +17,9 @@ module RuboCop
17
17
  # # good
18
18
  #
19
19
  # "result is #{something}"
20
- class RedundantStringCoercion < Cop
20
+ class RedundantStringCoercion < Base
21
21
  include Interpolation
22
+ extend AutoCorrector
22
23
 
23
24
  MSG_DEFAULT = 'Redundant use of `Object#to_s` in interpolation.'
24
25
  MSG_SELF = 'Use `self` instead of `Object#to_s` in ' \
@@ -31,14 +32,12 @@ module RuboCop
31
32
 
32
33
  return unless to_s_without_args?(final_node)
33
34
 
34
- add_offense(final_node, location: :selector)
35
- end
35
+ message = final_node.receiver ? MSG_DEFAULT : MSG_SELF
36
36
 
37
- def autocorrect(node)
38
- lambda do |corrector|
39
- receiver = node.receiver
37
+ add_offense(final_node.loc.selector, message: message) do |corrector|
38
+ receiver = final_node.receiver
40
39
  corrector.replace(
41
- node,
40
+ final_node,
42
41
  if receiver
43
42
  receiver.source
44
43
  else
@@ -47,12 +46,6 @@ module RuboCop
47
46
  )
48
47
  end
49
48
  end
50
-
51
- private
52
-
53
- def message(node)
54
- node.receiver ? MSG_DEFAULT : MSG_SELF
55
- end
56
49
  end
57
50
  end
58
51
  end