rubocop 0.89.1 → 0.90.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 (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
@@ -88,8 +88,9 @@ module RuboCop
88
88
  # # good
89
89
  # { a: 1,
90
90
  # b: 2 }
91
- class MultilineHashBraceLayout < Cop
91
+ class MultilineHashBraceLayout < Base
92
92
  include MultilineLiteralBraceLayout
93
+ extend AutoCorrector
93
94
 
94
95
  SAME_LINE_MESSAGE = 'Closing hash brace must be on the same line as ' \
95
96
  'the last hash element when opening brace is on the same line as ' \
@@ -108,10 +109,6 @@ module RuboCop
108
109
  def on_hash(node)
109
110
  check_brace_layout(node)
110
111
  end
111
-
112
- def autocorrect(node)
113
- MultilineLiteralBraceCorrector.new(node, processed_source)
114
- end
115
112
  end
116
113
  end
117
114
  end
@@ -20,8 +20,9 @@ module RuboCop
20
20
  # b: 2,
21
21
  # c: 3
22
22
  # }
23
- class MultilineHashKeyLineBreaks < Cop
23
+ class MultilineHashKeyLineBreaks < Base
24
24
  include MultilineElementLineBreaks
25
+ extend AutoCorrector
25
26
 
26
27
  MSG = 'Each key in a multi-line hash must start on a ' \
27
28
  'separate line.'
@@ -35,10 +36,6 @@ module RuboCop
35
36
  check_line_breaks(node, node.children) if node.loc.begin
36
37
  end
37
38
 
38
- def autocorrect(node)
39
- EmptyLineCorrector.insert_before(node)
40
- end
41
-
42
39
  private
43
40
 
44
41
  def starts_with_curly_brace?(node)
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # b,
20
20
  # c
21
21
  # )
22
- class MultilineMethodArgumentLineBreaks < Cop
23
- include(MultilineElementLineBreaks)
22
+ class MultilineMethodArgumentLineBreaks < Base
23
+ include MultilineElementLineBreaks
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Each argument in a multi-line method call must start ' \
26
27
  'on a separate line.'
@@ -36,16 +37,11 @@ module RuboCop
36
37
  #
37
38
  # ...then each key/value pair is treated as a method 'argument'
38
39
  # when determining where line breaks should appear.
39
- if (last_arg = args.last)
40
- args = args[0...-1] + last_arg.children if last_arg.hash_type? && !last_arg.braces?
41
- end
40
+ last_arg = args.last
41
+ args = args[0...-1] + last_arg.children if last_arg&.hash_type? && !last_arg&.braces?
42
42
 
43
43
  check_line_breaks(node, args)
44
44
  end
45
-
46
- def autocorrect(node)
47
- EmptyLineCorrector.insert_before(node)
48
- end
49
45
  end
50
46
  end
51
47
  end
@@ -88,8 +88,9 @@ module RuboCop
88
88
  # # good
89
89
  # foo(a,
90
90
  # b)
91
- class MultilineMethodCallBraceLayout < Cop
91
+ class MultilineMethodCallBraceLayout < Base
92
92
  include MultilineLiteralBraceLayout
93
+ extend AutoCorrector
93
94
 
94
95
  SAME_LINE_MESSAGE = 'Closing method call brace must be on the ' \
95
96
  'same line as the last argument when opening brace is on the same ' \
@@ -109,10 +110,6 @@ module RuboCop
109
110
  check_brace_layout(node)
110
111
  end
111
112
 
112
- def autocorrect(node)
113
- MultilineLiteralBraceCorrector.new(node, processed_source)
114
- end
115
-
116
113
  private
117
114
 
118
115
  def children(node)
@@ -100,8 +100,9 @@ module RuboCop
100
100
  # def foo(a,
101
101
  # b)
102
102
  # end
103
- class MultilineMethodDefinitionBraceLayout < Cop
103
+ class MultilineMethodDefinitionBraceLayout < Base
104
104
  include MultilineLiteralBraceLayout
105
+ extend AutoCorrector
105
106
 
106
107
  SAME_LINE_MESSAGE = 'Closing method definition brace must be on the ' \
107
108
  'same line as the last parameter when opening brace is on the same ' \
@@ -121,10 +122,6 @@ module RuboCop
121
122
  check_brace_layout(node.arguments)
122
123
  end
123
124
  alias on_defs on_def
124
-
125
- def autocorrect(node)
126
- MultilineLiteralBraceCorrector.new(node, processed_source)
127
- end
128
125
  end
129
126
  end
130
127
  end
@@ -21,8 +21,9 @@ module RuboCop
21
21
  # rescue
22
22
  # puts 'error'
23
23
  # end
24
- class RescueEnsureAlignment < Cop
24
+ class RescueEnsureAlignment < Base
25
25
  include RangeHelp
26
+ extend AutoCorrector
26
27
 
27
28
  MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
28
29
  'aligned with `%<beginning>s` at ' \
@@ -41,19 +42,7 @@ module RuboCop
41
42
  check(node)
42
43
  end
43
44
 
44
- def autocorrect(node)
45
- whitespace = whitespace_range(node)
46
- # Some inline node is sitting before current node.
47
- return nil unless whitespace.source.strip.empty?
48
-
49
- alignment_node = alignment_node(node)
50
- return false if alignment_node.nil?
51
-
52
- new_column = alignment_node.loc.column
53
- ->(corrector) { corrector.replace(whitespace, ' ' * new_column) }
54
- end
55
-
56
- def investigate(processed_source)
45
+ def on_new_investigation
57
46
  @modifier_locations =
58
47
  processed_source.tokens.each_with_object([]) do |token, locations|
59
48
  next unless token.rescue_modifier?
@@ -73,15 +62,23 @@ module RuboCop
73
62
  alignment_loc = alignment_node.loc.expression
74
63
  kw_loc = node.loc.keyword
75
64
 
76
- return if
77
- alignment_loc.column == kw_loc.column ||
78
- alignment_loc.line == kw_loc.line
65
+ return if alignment_loc.column == kw_loc.column || alignment_loc.line == kw_loc.line
79
66
 
80
67
  add_offense(
81
- node,
82
- location: kw_loc,
83
- message: format_message(alignment_node, alignment_loc, kw_loc)
84
- )
68
+ kw_loc, message: format_message(alignment_node, alignment_loc, kw_loc)
69
+ ) do |corrector|
70
+ autocorrect(corrector, node, alignment_node)
71
+ end
72
+ end
73
+
74
+ def autocorrect(corrector, node, alignment_node)
75
+ whitespace = whitespace_range(node)
76
+ # Some inline node is sitting before current node.
77
+ return nil unless whitespace.source.strip.empty?
78
+
79
+ new_column = alignment_node.loc.column
80
+
81
+ corrector.replace(whitespace, ' ' * new_column)
85
82
  end
86
83
 
87
84
  def format_message(alignment_node, alignment_loc, kw_loc)
@@ -13,7 +13,9 @@ module RuboCop
13
13
  #
14
14
  # # good
15
15
  # def f(a:, b: 2); {a: 3}; end
16
- class SpaceAfterColon < Cop
16
+ class SpaceAfterColon < Base
17
+ extend AutoCorrector
18
+
17
19
  MSG = 'Space missing after colon.'
18
20
 
19
21
  def on_pair(node)
@@ -21,7 +23,7 @@ module RuboCop
21
23
 
22
24
  colon = node.loc.operator
23
25
 
24
- add_offense(colon, location: colon) unless followed_by_space?(colon)
26
+ register_offense(colon) unless followed_by_space?(colon)
25
27
  end
26
28
 
27
29
  def on_kwoptarg(node)
@@ -29,15 +31,17 @@ module RuboCop
29
31
  # optional keyword argument's name, so must construct one.
30
32
  colon = node.loc.name.end.resize(1)
31
33
 
32
- add_offense(colon, location: colon) unless followed_by_space?(colon)
33
- end
34
-
35
- def autocorrect(range)
36
- ->(corrector) { corrector.insert_after(range, ' ') }
34
+ register_offense(colon) unless followed_by_space?(colon)
37
35
  end
38
36
 
39
37
  private
40
38
 
39
+ def register_offense(colon)
40
+ add_offense(colon) do |corrector|
41
+ corrector.insert_after(colon, ' ')
42
+ end
43
+ end
44
+
41
45
  def followed_by_space?(colon)
42
46
  /\s/.match?(colon.source_buffer.source[colon.end_pos])
43
47
  end
@@ -14,12 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # [1, 2]
16
16
  # { foo:bar, }
17
- class SpaceAfterComma < Cop
17
+ class SpaceAfterComma < Base
18
18
  include SpaceAfterPunctuation
19
-
20
- def autocorrect(comma)
21
- PunctuationCorrector.add_space(comma)
22
- end
19
+ extend AutoCorrector
23
20
 
24
21
  def space_style_before_rcurly
25
22
  cfg = config.for_cop('Layout/SpaceInsideHashLiteralBraces')
@@ -14,8 +14,9 @@ module RuboCop
14
14
  # # good
15
15
  # def func(x) end
16
16
  # def method=(y) end
17
- class SpaceAfterMethodName < Cop
17
+ class SpaceAfterMethodName < Base
18
18
  include RangeHelp
19
+ extend AutoCorrector
19
20
 
20
21
  MSG = 'Do not put a space between a method name and the opening ' \
21
22
  'parenthesis.'
@@ -29,13 +30,11 @@ module RuboCop
29
30
  expr.begin_pos)
30
31
  return unless pos_before_left_paren.source.start_with?(' ')
31
32
 
32
- add_offense(pos_before_left_paren, location: pos_before_left_paren)
33
+ add_offense(pos_before_left_paren) do |corrector|
34
+ corrector.remove(pos_before_left_paren)
35
+ end
33
36
  end
34
37
  alias on_defs on_def
35
-
36
- def autocorrect(pos_before_left_paren)
37
- ->(corrector) { corrector.remove(pos_before_left_paren) }
38
- end
39
38
  end
40
39
  end
41
40
  end
@@ -11,29 +11,27 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # !something
14
- class SpaceAfterNot < Cop
14
+ class SpaceAfterNot < Base
15
15
  include RangeHelp
16
+ extend AutoCorrector
16
17
 
17
18
  MSG = 'Do not leave space between `!` and its argument.'
18
19
 
19
20
  def on_send(node)
20
21
  return unless node.prefix_bang? && whitespace_after_operator?(node)
21
22
 
22
- add_offense(node)
23
+ add_offense(node) do |corrector|
24
+ corrector.remove(
25
+ range_between(node.loc.selector.end_pos, node.receiver.source_range.begin_pos)
26
+ )
27
+ end
23
28
  end
24
29
 
30
+ private
31
+
25
32
  def whitespace_after_operator?(node)
26
33
  node.receiver.loc.column - node.loc.column > 1
27
34
  end
28
-
29
- def autocorrect(node)
30
- lambda do |corrector|
31
- corrector.remove(
32
- range_between(node.loc.selector.end_pos,
33
- node.receiver.source_range.begin_pos)
34
- )
35
- end
36
- end
37
35
  end
38
36
  end
39
37
  end
@@ -11,12 +11,9 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # x = 1; y = 2
14
- class SpaceAfterSemicolon < Cop
14
+ class SpaceAfterSemicolon < Base
15
15
  include SpaceAfterPunctuation
16
-
17
- def autocorrect(semicolon)
18
- PunctuationCorrector.add_space(semicolon)
19
- end
16
+ extend AutoCorrector
20
17
 
21
18
  def space_style_before_rcurly
22
19
  cfg = config.for_cop('Layout/SpaceInsideBlockBraces')
@@ -27,10 +27,11 @@ module RuboCop
27
27
  # def some_method(arg1=:default, arg2=nil, arg3=[])
28
28
  # # do something...
29
29
  # end
30
- class SpaceAroundEqualsInParameterDefault < Cop
30
+ class SpaceAroundEqualsInParameterDefault < Base
31
31
  include SurroundingSpace
32
32
  include ConfigurableEnforcedStyle
33
33
  include RangeHelp
34
+ extend AutoCorrector
34
35
 
35
36
  MSG = 'Surrounding space %<type>s in default value assignment.'
36
37
 
@@ -40,13 +41,6 @@ module RuboCop
40
41
  check_optarg(arg, equals, value)
41
42
  end
42
43
 
43
- def autocorrect(range)
44
- m = range.source.match(/=\s*(\S+)/)
45
- rest = m ? m.captures[0] : ''
46
- replacement = style == :space ? ' = ' : '='
47
- ->(corrector) { corrector.replace(range, replacement + rest) }
48
- end
49
-
50
44
  private
51
45
 
52
46
  def check_optarg(arg, equals, value)
@@ -65,14 +59,25 @@ module RuboCop
65
59
  def incorrect_style_detected(arg, value, space_on_both_sides,
66
60
  no_surrounding_space)
67
61
  range = range_between(arg.end_pos, value.begin_pos)
68
- add_offense(range, location: range) do
69
- if style == :space && no_surrounding_space ||
70
- style == :no_space && space_on_both_sides
71
- opposite_style_detected
72
- else
73
- unrecognized_style_detected
74
- end
62
+
63
+ if style == :space && no_surrounding_space ||
64
+ style == :no_space && space_on_both_sides
65
+ return unless opposite_style_detected
66
+ else
67
+ return unless unrecognized_style_detected
75
68
  end
69
+
70
+ add_offense(range) do |corrector|
71
+ autocorrect(corrector, range)
72
+ end
73
+ end
74
+
75
+ def autocorrect(corrector, range)
76
+ m = range.source.match(/=\s*(\S+)/)
77
+ rest = m ? m.captures[0] : ''
78
+ replacement = style == :space ? ' = ' : '='
79
+
80
+ corrector.replace(range, replacement + rest)
76
81
  end
77
82
 
78
83
  def space_on_both_sides?(arg, equals)
@@ -24,7 +24,9 @@ module RuboCop
24
24
  # end
25
25
  #
26
26
  # something = 123 if test
27
- class SpaceAroundKeyword < Cop
27
+ class SpaceAroundKeyword < Base
28
+ extend AutoCorrector
29
+
28
30
  MSG_BEFORE = 'Space before keyword `%<range>s` is missing.'
29
31
  MSG_AFTER = 'Space after keyword `%<range>s` is missing.'
30
32
 
@@ -129,14 +131,6 @@ module RuboCop
129
131
  check(node, [:keyword].freeze)
130
132
  end
131
133
 
132
- def autocorrect(range)
133
- if space_before_missing?(range)
134
- ->(corrector) { corrector.insert_before(range, ' ') }
135
- else
136
- ->(corrector) { corrector.insert_after(range, ' ') }
137
- end
138
- end
139
-
140
134
  private
141
135
 
142
136
  def check(node, locations, begin_keyword = DO)
@@ -162,8 +156,11 @@ module RuboCop
162
156
 
163
157
  def check_end(node, range, begin_keyword)
164
158
  return if begin_keyword == DO && !do?(node)
159
+ return unless space_before_missing?(range)
165
160
 
166
- offense(range, MSG_BEFORE) if space_before_missing?(range)
161
+ add_offense(range, message: format(MSG_BEFORE, range: range.source)) do |corrector|
162
+ corrector.insert_before(range, ' ')
163
+ end
167
164
  end
168
165
 
169
166
  def do?(node)
@@ -171,15 +168,17 @@ module RuboCop
171
168
  end
172
169
 
173
170
  def check_keyword(node, range)
174
- offense(range, MSG_BEFORE) if space_before_missing?(range) &&
175
- !preceded_by_operator?(node, range)
176
- offense(range, MSG_AFTER) if space_after_missing?(range)
177
- end
171
+ if space_before_missing?(range) && !preceded_by_operator?(node, range)
172
+ add_offense(range, message: format(MSG_BEFORE, range: range.source)) do |corrector|
173
+ corrector.insert_before(range, ' ')
174
+ end
175
+ end
178
176
 
179
- def offense(range, msg)
180
- add_offense(range,
181
- location: range,
182
- message: format(msg, range: range.source))
177
+ return unless space_after_missing?(range)
178
+
179
+ add_offense(range, message: format(MSG_AFTER, range: range.source)) do |corrector|
180
+ corrector.insert_after(range, ' ')
181
+ end
183
182
  end
184
183
 
185
184
  def space_before_missing?(range)
@@ -48,10 +48,11 @@ module RuboCop
48
48
  #
49
49
  # # good
50
50
  # a ** b
51
- class SpaceAroundOperators < Cop
51
+ class SpaceAroundOperators < Base
52
52
  include PrecedingFollowingAlignment
53
53
  include RangeHelp
54
54
  include RationalLiteral
55
+ extend AutoCorrector
55
56
 
56
57
  IRREGULAR_METHODS = %i[[] ! []=].freeze
57
58
  EXCESSIVE_SPACE = ' '
@@ -132,18 +133,6 @@ module RuboCop
132
133
  alias on_and_asgn on_assignment
133
134
  alias on_op_asgn on_special_asgn
134
135
 
135
- def autocorrect(range)
136
- lambda do |corrector|
137
- if /\*\*/.match?(range.source) && !space_around_exponent_operator?
138
- corrector.replace(range, '**')
139
- elsif range.source.end_with?("\n")
140
- corrector.replace(range, " #{range.source.strip}\n")
141
- else
142
- enclose_operator_with_space(corrector, range)
143
- end
144
- end
145
- end
146
-
147
136
  private
148
137
 
149
138
  def regular_operator?(send_node)
@@ -161,7 +150,9 @@ module RuboCop
161
150
  return if with_space.source.start_with?("\n")
162
151
 
163
152
  offense(type, operator, with_space, right_operand) do |msg|
164
- add_offense(with_space, location: operator, message: msg)
153
+ add_offense(operator, message: msg) do |corrector|
154
+ autocorrect(corrector, with_space)
155
+ end
165
156
  end
166
157
  end
167
158
 
@@ -170,14 +161,24 @@ module RuboCop
170
161
  yield msg if msg
171
162
  end
172
163
 
164
+ def autocorrect(corrector, range)
165
+ if /\*\*/.match?(range.source) && !space_around_exponent_operator?
166
+ corrector.replace(range, '**')
167
+ elsif range.source.end_with?("\n")
168
+ corrector.replace(range, " #{range.source.strip}\n")
169
+ else
170
+ enclose_operator_with_space(corrector, range)
171
+ end
172
+ end
173
+
173
174
  def enclose_operator_with_space(corrector, range)
174
175
  operator = range.source
175
176
 
176
177
  # If `ForceEqualSignAlignment` is true, `Layout/ExtraSpacing` cop
177
178
  # inserts spaces before operator. If `Layout/SpaceAroundOperators` cop
178
179
  # inserts a space, it collides and raises the infinite loop error.
179
- if force_equal_sign_alignment?
180
- corrector.insert_after(range, ' ') unless operator.end_with?(' ')
180
+ if force_equal_sign_alignment? && !operator.end_with?(' ')
181
+ corrector.insert_after(range, ' ')
181
182
  else
182
183
  corrector.replace(range, " #{operator.strip} ")
183
184
  end