rubocop 0.89.1 → 0.90.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/config/default.yml +79 -11
  4. data/lib/rubocop.rb +13 -0
  5. data/lib/rubocop/cached_data.rb +1 -0
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +1 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +1 -0
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +5 -0
  15. data/lib/rubocop/config_loader.rb +17 -6
  16. data/lib/rubocop/config_loader_resolver.rb +1 -0
  17. data/lib/rubocop/config_obsoletion.rb +1 -0
  18. data/lib/rubocop/config_validator.rb +3 -0
  19. data/lib/rubocop/cop/base.rb +23 -0
  20. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  21. data/lib/rubocop/cop/commissioner.rb +47 -7
  22. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  23. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  24. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  25. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
  26. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  27. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  28. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
  29. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  30. data/lib/rubocop/cop/documentation.rb +22 -0
  31. data/lib/rubocop/cop/generator.rb +1 -0
  32. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  33. data/lib/rubocop/cop/layout/class_structure.rb +10 -9
  34. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  35. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  36. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  37. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  38. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  39. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  40. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  41. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  42. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  43. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  44. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
  45. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  46. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  47. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  48. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  49. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  50. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  51. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  52. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  53. data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
  54. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  55. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  56. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  57. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  58. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  59. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  60. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  61. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  62. data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
  63. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  64. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  65. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  66. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  67. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  68. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  69. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  70. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  71. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  72. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  73. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
  74. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  75. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  76. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  77. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  78. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  79. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  80. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  81. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  82. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  83. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  84. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  85. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  86. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  87. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  88. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
  89. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  90. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  91. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
  92. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  93. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  94. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  95. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
  96. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  97. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  98. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  99. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  100. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  102. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
  103. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  104. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  105. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
  106. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
  107. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  108. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  109. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  110. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  111. data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
  112. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
  113. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  114. data/lib/rubocop/cop/mixin/alignment.rb +3 -0
  115. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  116. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  117. data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
  118. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  119. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  120. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  121. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  122. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  123. data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
  124. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  125. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
  126. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  127. data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
  128. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  129. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  130. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  131. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  132. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  133. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
  134. data/lib/rubocop/cop/offense.rb +1 -0
  135. data/lib/rubocop/cop/severity.rb +0 -8
  136. data/lib/rubocop/cop/style/case_equality.rb +8 -3
  137. data/lib/rubocop/cop/style/case_like_if.rb +20 -4
  138. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  139. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  140. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  141. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  142. data/lib/rubocop/cop/style/guard_clause.rb +1 -0
  143. data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
  144. data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
  145. data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
  146. data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
  147. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  148. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
  149. data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
  150. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  151. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  152. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  153. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  154. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
  155. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  156. data/lib/rubocop/cop/style/next.rb +10 -14
  157. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  158. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  159. data/lib/rubocop/cop/style/not.rb +19 -26
  160. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  161. data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
  162. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  163. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  164. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  165. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  166. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  167. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  168. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  169. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  170. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  171. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  172. data/lib/rubocop/cop/style/proc.rb +6 -6
  173. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  174. data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
  175. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  176. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  177. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  178. data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
  179. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  180. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
  181. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  182. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  183. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  184. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  185. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
  186. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  187. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  188. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  189. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  190. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  191. data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
  192. data/lib/rubocop/cop/style/sample.rb +10 -13
  193. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  194. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  195. data/lib/rubocop/cop/style/send.rb +2 -2
  196. data/lib/rubocop/cop/style/signal_exception.rb +21 -19
  197. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  198. data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
  199. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  200. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  201. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  202. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  203. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  204. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  205. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  206. data/lib/rubocop/cop/style/strip.rb +8 -14
  207. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  208. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  209. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  210. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  211. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  212. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  213. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  214. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  215. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  216. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  217. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  218. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  219. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  220. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  221. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  222. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  223. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  224. data/lib/rubocop/cop/style/when_then.rb +4 -6
  225. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  226. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  227. data/lib/rubocop/cop/style/word_array.rb +5 -23
  228. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  229. data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
  230. data/lib/rubocop/cop/team.rb +1 -0
  231. data/lib/rubocop/cop/util.rb +1 -1
  232. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  233. data/lib/rubocop/cop/variable_force.rb +2 -0
  234. data/lib/rubocop/cops_documentation_generator.rb +4 -2
  235. data/lib/rubocop/core_ext/string.rb +1 -1
  236. data/lib/rubocop/ext/regexp_node.rb +46 -0
  237. data/lib/rubocop/file_finder.rb +1 -0
  238. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  239. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  240. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  241. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  242. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  243. data/lib/rubocop/name_similarity.rb +1 -0
  244. data/lib/rubocop/options.rb +3 -0
  245. data/lib/rubocop/remote_config.rb +1 -0
  246. data/lib/rubocop/result_cache.rb +1 -0
  247. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  248. data/lib/rubocop/rspec/expect_offense.rb +10 -5
  249. data/lib/rubocop/rspec/shared_contexts.rb +12 -0
  250. data/lib/rubocop/runner.rb +1 -0
  251. data/lib/rubocop/string_interpreter.rb +3 -0
  252. data/lib/rubocop/target_finder.rb +1 -0
  253. data/lib/rubocop/target_ruby.rb +6 -0
  254. data/lib/rubocop/version.rb +2 -1
  255. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  256. metadata +15 -2
@@ -12,7 +12,8 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # items[1..]
15
- class SlicingWithRange < Cop
15
+ class SlicingWithRange < Base
16
+ extend AutoCorrector
16
17
  extend TargetRubyVersion
17
18
 
18
19
  minimum_target_ruby_version 2.6
@@ -25,12 +26,8 @@ module RuboCop
25
26
  return unless node.method?(:[]) && node.arguments.count == 1
26
27
  return unless range_till_minus_one?(node.arguments.first)
27
28
 
28
- add_offense(node.arguments.first)
29
- end
30
-
31
- def autocorrect(node)
32
- lambda do |corrector|
33
- corrector.remove(node.end)
29
+ add_offense(node.first_argument) do |corrector|
30
+ corrector.remove(node.first_argument.end)
34
31
  end
35
32
  end
36
33
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # If the branch of a conditional consists solely of a conditional node,
7
+ # its conditions can be combined with the conditions of the outer branch.
8
+ # This helps to keep the nesting level from getting too deep.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # if condition_a
13
+ # if condition_b
14
+ # do_something
15
+ # end
16
+ # end
17
+ #
18
+ # # good
19
+ # if condition_a && condition_b
20
+ # do_something
21
+ # end
22
+ #
23
+ # @example AllowModifier: false (default)
24
+ # # bad
25
+ # if condition_a
26
+ # do_something if condition_b
27
+ # end
28
+ #
29
+ # @example AllowModifier: true
30
+ # # good
31
+ # if condition_a
32
+ # do_something if condition_b
33
+ # end
34
+ #
35
+ class SoleNestedConditional < Base
36
+ MSG = 'Consider merging nested conditions into '\
37
+ 'outer `%<conditional_type>s` conditions.'
38
+
39
+ def on_if(node)
40
+ return if node.ternary? || node.else? || node.elsif?
41
+
42
+ branch = node.if_branch
43
+ return unless offending_branch?(branch)
44
+
45
+ message = format(MSG, conditional_type: node.keyword)
46
+ add_offense(branch.loc.keyword, message: message)
47
+ end
48
+
49
+ private
50
+
51
+ def offending_branch?(branch)
52
+ return false unless branch
53
+
54
+ branch.if_type? &&
55
+ !branch.else? &&
56
+ !branch.ternary? &&
57
+ !(branch.modifier_form? && allow_modifier?)
58
+ end
59
+
60
+ def allow_modifier?
61
+ cop_config['AllowModifier']
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -56,8 +56,9 @@ module RuboCop
56
56
  # puts $'
57
57
  # puts $+
58
58
  #
59
- class SpecialGlobalVars < Cop
59
+ class SpecialGlobalVars < Base
60
60
  include ConfigurableEnforcedStyle
61
+ extend AutoCorrector
61
62
 
62
63
  MSG_BOTH = 'Prefer `%<prefer>s` from the stdlib \'English\' ' \
63
64
  'module (don\'t forget to require it) or `%<regular>s` over ' \
@@ -120,13 +121,14 @@ module RuboCop
120
121
  correct_style_detected
121
122
  else
122
123
  opposite_style_detected
123
- add_offense(node)
124
+
125
+ add_offense(node, message: message(global_var)) do |corrector|
126
+ autocorrect(corrector, node, global_var)
127
+ end
124
128
  end
125
129
  end
126
130
 
127
- def message(node)
128
- global_var, = *node
129
-
131
+ def message(global_var)
130
132
  if style == :use_english_names
131
133
  format_english_message(global_var)
132
134
  else
@@ -136,17 +138,10 @@ module RuboCop
136
138
  end
137
139
  end
138
140
 
139
- def autocorrect(node)
140
- lambda do |corrector|
141
- global_var, = *node
141
+ def autocorrect(corrector, node, global_var)
142
+ node = node.parent while node.parent&.begin_type? && node.parent.children.one?
142
143
 
143
- while node.parent&.begin_type? &&
144
- node.parent.children.one?
145
- node = node.parent
146
- end
147
-
148
- corrector.replace(node, replacement(node, global_var))
149
- end
144
+ corrector.replace(node, replacement(node, global_var))
150
145
  end
151
146
 
152
147
  private
@@ -19,26 +19,26 @@ module RuboCop
19
19
  #
20
20
  # # good
21
21
  # ->a,b,c { a + b + c}
22
- class StabbyLambdaParentheses < Cop
22
+ class StabbyLambdaParentheses < Base
23
23
  include ConfigurableEnforcedStyle
24
+ extend AutoCorrector
24
25
 
25
26
  MSG_REQUIRE = 'Wrap stabby lambda arguments with parentheses.'
26
27
  MSG_NO_REQUIRE = 'Do not wrap stabby lambda arguments ' \
27
28
  'with parentheses.'
28
29
  def on_send(node)
29
30
  return unless stabby_lambda_with_args?(node)
30
- return unless redundant_parentheses?(node) ||
31
- missing_parentheses?(node)
31
+ return unless redundant_parentheses?(node) || missing_parentheses?(node)
32
32
 
33
- add_offense(node.block_node.arguments)
34
- end
33
+ arguments = node.block_node.arguments
35
34
 
36
- def autocorrect(node)
37
- case style
38
- when :require_parentheses
39
- missing_parentheses_corrector(node)
40
- when :require_no_parentheses
41
- unwanted_parentheses_corrector(node)
35
+ add_offense(arguments) do |corrector|
36
+ case style
37
+ when :require_parentheses
38
+ missing_parentheses_corrector(corrector, arguments)
39
+ when :require_no_parentheses
40
+ unwanted_parentheses_corrector(corrector, arguments)
41
+ end
42
42
  end
43
43
  end
44
44
 
@@ -56,19 +56,15 @@ module RuboCop
56
56
  style == :require_parentheses ? MSG_REQUIRE : MSG_NO_REQUIRE
57
57
  end
58
58
 
59
- def missing_parentheses_corrector(node)
60
- lambda do |corrector|
61
- corrector.wrap(node, '(', ')')
62
- end
59
+ def missing_parentheses_corrector(corrector, node)
60
+ corrector.wrap(node, '(', ')')
63
61
  end
64
62
 
65
- def unwanted_parentheses_corrector(node)
66
- lambda do |corrector|
67
- args_loc = node.loc
63
+ def unwanted_parentheses_corrector(corrector, node)
64
+ args_loc = node.loc
68
65
 
69
- corrector.replace(args_loc.begin, '')
70
- corrector.remove(args_loc.end)
71
- end
66
+ corrector.replace(args_loc.begin, '')
67
+ corrector.remove(args_loc.end)
72
68
  end
73
69
 
74
70
  def stabby_lambda_with_args?(node)
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # warn('hello')
16
16
  #
17
- class StderrPuts < Cop
17
+ class StderrPuts < Base
18
18
  include RangeHelp
19
+ extend AutoCorrector
19
20
 
20
21
  MSG =
21
22
  'Use `warn` instead of `%<bad>s` to allow such output to be disabled.'
@@ -30,11 +31,8 @@ module RuboCop
30
31
  def on_send(node)
31
32
  return unless stderr_puts?(node)
32
33
 
33
- add_offense(node, location: stderr_puts_range(node))
34
- end
35
-
36
- def autocorrect(node)
37
- lambda do |corrector|
34
+ message = message(node)
35
+ add_offense(stderr_puts_range(node), message: message) do |corrector|
38
36
  corrector.replace(stderr_puts_range(node), 'warn')
39
37
  end
40
38
  end
@@ -12,7 +12,9 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # { one: 1, two: 2, three: 3 }
15
- class StringHashKeys < Cop
15
+ class StringHashKeys < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Prefer symbols instead of strings as hash keys.'
17
19
 
18
20
  def_node_matcher :string_hash_key?, <<~PATTERN
@@ -35,13 +37,10 @@ module RuboCop
35
37
  return unless string_hash_key?(node)
36
38
  return if receive_environments_method?(node)
37
39
 
38
- add_offense(node.key)
39
- end
40
+ add_offense(node.key) do |corrector|
41
+ symbol_content = node.key.str_content.to_sym.inspect
40
42
 
41
- def autocorrect(node)
42
- lambda do |corrector|
43
- symbol_content = node.str_content.to_sym.inspect
44
- corrector.replace(node, symbol_content)
43
+ corrector.replace(node.key, symbol_content)
45
44
  end
46
45
  end
47
46
  end
@@ -14,32 +14,22 @@ module RuboCop
14
14
  # # good
15
15
  # 'name'.to_sym
16
16
  # 'var'.preferred_method
17
- class StringMethods < Cop
17
+ class StringMethods < Base
18
18
  include MethodPreference
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Prefer `%<prefer>s` over `%<current>s`.'
21
22
 
22
23
  def on_send(node)
23
- return unless preferred_method(node.method_name)
24
+ return unless (preferred_method = preferred_method(node.method_name))
24
25
 
25
- add_offense(node, location: :selector)
26
- end
27
- alias on_csend on_send
26
+ message = format(MSG, prefer: preferred_method, current: node.method_name)
28
27
 
29
- def autocorrect(node)
30
- lambda do |corrector|
31
- corrector.replace(node.loc.selector,
32
- preferred_method(node.method_name))
28
+ add_offense(node.loc.selector, message: message) do |corrector|
29
+ corrector.replace(node.loc.selector, preferred_method(node.method_name))
33
30
  end
34
31
  end
35
-
36
- private
37
-
38
- def message(node)
39
- format(MSG,
40
- prefer: preferred_method(node.method_name),
41
- current: node.method_name)
42
- end
32
+ alias on_csend on_send
43
33
  end
44
34
  end
45
35
  end
@@ -13,8 +13,9 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # 'abc'.strip
16
- class Strip < Cop
16
+ class Strip < Base
17
17
  include RangeHelp
18
+ extend AutoCorrector
18
19
 
19
20
  MSG = 'Use `strip` instead of `%<methods>s`.'
20
21
 
@@ -25,20 +26,13 @@ module RuboCop
25
26
 
26
27
  def on_send(node)
27
28
  lstrip_rstrip(node) do |first_send, method_one, method_two|
28
- range = range_between(first_send.loc.selector.begin_pos,
29
- node.source_range.end_pos)
30
- add_offense(node,
31
- location: range,
32
- message: format(MSG,
33
- methods: "#{method_one}.#{method_two}"))
34
- end
35
- end
29
+ range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
30
+ message = format(MSG, methods: "#{method_one}.#{method_two}")
36
31
 
37
- def autocorrect(node)
38
- range = range_between(node.receiver.loc.selector.begin_pos,
39
- node.source_range.end_pos)
40
-
41
- ->(corrector) { corrector.replace(range, 'strip') }
32
+ add_offense(range, message: message) do |corrector|
33
+ corrector.replace(range, 'strip')
34
+ end
35
+ end
42
36
  end
43
37
  end
44
38
  end
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # 42
20
20
  # end
21
21
  # end
22
- class StructInheritance < Cop
22
+ class StructInheritance < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = "Don't extend an instance initialized by `Struct.new`. " \
26
27
  'Use a block to customize the struct.'
@@ -28,11 +29,7 @@ module RuboCop
28
29
  def on_class(node)
29
30
  return unless struct_constructor?(node.parent_class)
30
31
 
31
- add_offense(node, location: node.parent_class.source_range)
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
32
+ add_offense(node.parent_class.source_range) do |corrector|
36
33
  corrector.remove(range_with_surrounding_space(range: node.loc.keyword, newlines: false))
37
34
  corrector.replace(node.loc.operator, '=')
38
35
 
@@ -27,11 +27,12 @@ module RuboCop
27
27
  #
28
28
  # # bad
29
29
  # %i[foo bar baz]
30
- class SymbolArray < Cop
30
+ class SymbolArray < Base
31
31
  include ArrayMinSize
32
32
  include ArraySyntax
33
33
  include ConfigurableEnforcedStyle
34
34
  include PercentArray
35
+ extend AutoCorrector
35
36
 
36
37
  PERCENT_MSG = 'Use `%i` or `%I` for an array of symbols.'
37
38
  ARRAY_MSG = 'Use `[]` for an array of symbols.'
@@ -44,22 +45,12 @@ module RuboCop
44
45
  if bracketed_array_of?(:sym, node)
45
46
  return if symbols_contain_spaces?(node)
46
47
 
47
- check_bracketed_array(node)
48
+ check_bracketed_array(node, 'i')
48
49
  elsif node.percent_literal?(:symbol)
49
50
  check_percent_array(node)
50
51
  end
51
52
  end
52
53
 
53
- def autocorrect(node)
54
- if style == :percent
55
- PercentLiteralCorrector
56
- .new(@config, @preferred_delimiters)
57
- .correct(node, 'i')
58
- else
59
- correct_bracketed(node)
60
- end
61
- end
62
-
63
54
  private
64
55
 
65
56
  def symbols_contain_spaces?(node)
@@ -69,7 +60,7 @@ module RuboCop
69
60
  end
70
61
  end
71
62
 
72
- def correct_bracketed(node)
63
+ def correct_bracketed(corrector, node)
73
64
  syms = node.children.map do |c|
74
65
  if c.dsym_type?
75
66
  string_literal = to_string_literal(c.source)
@@ -80,9 +71,7 @@ module RuboCop
80
71
  end
81
72
  end
82
73
 
83
- lambda do |corrector|
84
- corrector.replace(node, "[#{syms.join(', ')}]")
85
- end
74
+ corrector.replace(node, "[#{syms.join(', ')}]")
86
75
  end
87
76
 
88
77
  def to_symbol_literal(string)
@@ -12,17 +12,15 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # :symbol
15
- class SymbolLiteral < Cop
15
+ class SymbolLiteral < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Do not use strings for word-like symbol literals.'
17
19
 
18
20
  def on_sym(node)
19
21
  return unless /\A:["'][A-Za-z_]\w*["']\z/.match?(node.source)
20
22
 
21
- add_offense(node)
22
- end
23
-
24
- def autocorrect(node)
25
- lambda do |corrector|
23
+ add_offense(node) do |corrector|
26
24
  corrector.replace(node, node.source.delete(%q('")))
27
25
  end
28
26
  end
@@ -11,9 +11,10 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # something.map(&:upcase)
14
- class SymbolProc < Cop
14
+ class SymbolProc < Base
15
15
  include RangeHelp
16
16
  include IgnoredMethods
17
+ extend AutoCorrector
17
18
 
18
19
  MSG = 'Pass `&:%<method>s` as an argument to `%<block_method>s` ' \
19
20
  'instead of a block.'
@@ -49,30 +50,25 @@ module RuboCop
49
50
  argument_node.one? && argument_node.source.include?(',')
50
51
  end
51
52
 
52
- def autocorrect(node)
53
- lambda do |corrector|
54
- if node.send_node.arguments?
55
- autocorrect_with_args(corrector, node,
56
- node.send_node.arguments,
57
- node.body.method_name)
58
- else
59
- autocorrect_without_args(corrector, node)
60
- end
61
- end
62
- end
63
-
64
53
  private
65
54
 
66
55
  def register_offense(node, method_name, block_method_name)
67
56
  block_start = node.loc.begin.begin_pos
68
57
  block_end = node.loc.end.end_pos
69
58
  range = range_between(block_start, block_end)
59
+ message = format(MSG, method: method_name, block_method: block_method_name)
60
+
61
+ add_offense(range, message: message) do |corrector|
62
+ autocorrect(corrector, node)
63
+ end
64
+ end
70
65
 
71
- add_offense(node,
72
- location: range,
73
- message: format(MSG,
74
- method: method_name,
75
- block_method: block_method_name))
66
+ def autocorrect(corrector, node)
67
+ if node.send_node.arguments?
68
+ autocorrect_with_args(corrector, node, node.send_node.arguments, node.body.method_name)
69
+ else
70
+ autocorrect_without_args(corrector, node)
71
+ end
76
72
  end
77
73
 
78
74
  def autocorrect_without_args(corrector, node)