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
@@ -54,10 +54,11 @@ module RuboCop
54
54
  # # bad
55
55
  # foo = (bar = baz) ? a : b
56
56
  #
57
- class TernaryParentheses < Cop
57
+ class TernaryParentheses < Base
58
58
  include SafeAssignment
59
59
  include ConfigurableEnforcedStyle
60
60
  include SurroundingSpace
61
+ extend AutoCorrector
61
62
 
62
63
  VARIABLE_TYPES = AST::Node::VARIABLES
63
64
  NON_COMPLEX_TYPES = [*VARIABLE_TYPES, :const, :defined?, :yield].freeze
@@ -70,14 +71,20 @@ module RuboCop
70
71
  return if only_closing_parenthesis_is_last_line?(node.condition)
71
72
  return unless node.ternary? && !infinite_loop? && offense?(node)
72
73
 
73
- add_offense(node, location: node.source_range)
74
+ message = message(node)
75
+
76
+ add_offense(node.source_range, message: message) do |corrector|
77
+ autocorrect(corrector, node)
78
+ end
74
79
  end
75
80
 
76
81
  def only_closing_parenthesis_is_last_line?(condition)
77
82
  condition.source.split("\n").last == ')'
78
83
  end
79
84
 
80
- def autocorrect(node)
85
+ private
86
+
87
+ def autocorrect(corrector, node)
81
88
  condition = node.condition
82
89
 
83
90
  return nil if parenthesized?(condition) &&
@@ -85,14 +92,12 @@ module RuboCop
85
92
  unsafe_autocorrect?(condition))
86
93
 
87
94
  if parenthesized?(condition)
88
- correct_parenthesized(condition)
95
+ correct_parenthesized(corrector, condition)
89
96
  else
90
- correct_unparenthesized(condition)
97
+ correct_unparenthesized(corrector, condition)
91
98
  end
92
99
  end
93
100
 
94
- private
95
-
96
101
  def offense?(node)
97
102
  condition = node.condition
98
103
 
@@ -191,22 +196,18 @@ module RuboCop
191
196
  (send {_ nil?} $_ _ ...)}
192
197
  PATTERN
193
198
 
194
- def correct_parenthesized(condition)
195
- lambda do |corrector|
196
- corrector.remove(condition.loc.begin)
197
- corrector.remove(condition.loc.end)
199
+ def correct_parenthesized(corrector, condition)
200
+ corrector.remove(condition.loc.begin)
201
+ corrector.remove(condition.loc.end)
198
202
 
199
- # Ruby allows no space between the question mark and parentheses.
200
- # If we remove the parentheses, we need to add a space or we'll
201
- # generate invalid code.
202
- corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
203
- end
203
+ # Ruby allows no space between the question mark and parentheses.
204
+ # If we remove the parentheses, we need to add a space or we'll
205
+ # generate invalid code.
206
+ corrector.insert_after(condition.loc.end, ' ') unless whitespace_after?(condition)
204
207
  end
205
208
 
206
- def correct_unparenthesized(condition)
207
- lambda do |corrector|
208
- corrector.wrap(condition, '(', ')')
209
- end
209
+ def correct_unparenthesized(corrector, condition)
210
+ corrector.wrap(condition, '(', ')')
210
211
  end
211
212
 
212
213
  def whitespace_after?(node)
@@ -15,20 +15,17 @@ module RuboCop
15
15
  # def foo; end
16
16
  # end
17
17
  #
18
- class TrailingBodyOnClass < Cop
18
+ class TrailingBodyOnClass < Base
19
19
  include Alignment
20
20
  include TrailingBody
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Place the first line of class body on its own line.'
23
24
 
24
25
  def on_class(node)
25
26
  return unless trailing_body?(node)
26
27
 
27
- add_offense(node, location: first_part_of(node.to_a.last))
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(first_part_of(node.to_a.last)) do |corrector|
32
29
  LineBreakCorrector.correct_trailing_body(
33
30
  configured_width: configured_indentation_width,
34
31
  corrector: corrector,
@@ -24,9 +24,10 @@ module RuboCop
24
24
  # b[c: x]
25
25
  # end
26
26
  #
27
- class TrailingBodyOnMethodDefinition < Cop
27
+ class TrailingBodyOnMethodDefinition < Base
28
28
  include Alignment
29
29
  include TrailingBody
30
+ extend AutoCorrector
30
31
 
31
32
  MSG = "Place the first line of a multi-line method definition's " \
32
33
  'body on its own line.'
@@ -34,12 +35,7 @@ module RuboCop
34
35
  def on_def(node)
35
36
  return unless trailing_body?(node)
36
37
 
37
- add_offense(node, location: first_part_of(node.body))
38
- end
39
- alias on_defs on_def
40
-
41
- def autocorrect(node)
42
- lambda do |corrector|
38
+ add_offense(first_part_of(node.body)) do |corrector|
43
39
  LineBreakCorrector.correct_trailing_body(
44
40
  configured_width: configured_indentation_width,
45
41
  corrector: corrector,
@@ -48,6 +44,7 @@ module RuboCop
48
44
  )
49
45
  end
50
46
  end
47
+ alias on_defs on_def
51
48
  end
52
49
  end
53
50
  end
@@ -15,20 +15,17 @@ module RuboCop
15
15
  # extend self
16
16
  # end
17
17
  #
18
- class TrailingBodyOnModule < Cop
18
+ class TrailingBodyOnModule < Base
19
19
  include Alignment
20
20
  include TrailingBody
21
+ extend AutoCorrector
21
22
 
22
23
  MSG = 'Place the first line of module body on its own line.'
23
24
 
24
25
  def on_module(node)
25
26
  return unless trailing_body?(node)
26
27
 
27
- add_offense(node, location: first_part_of(node.to_a.last))
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(first_part_of(node.to_a.last)) do |corrector|
32
29
  LineBreakCorrector.correct_trailing_body(
33
30
  configured_width: configured_indentation_width,
34
31
  corrector: corrector,
@@ -84,8 +84,9 @@ module RuboCop
84
84
  # 1,
85
85
  # 2
86
86
  # )
87
- class TrailingCommaInArguments < Cop
87
+ class TrailingCommaInArguments < Base
88
88
  include TrailingComma
89
+ extend AutoCorrector
89
90
 
90
91
  def on_send(node)
91
92
  return unless node.arguments? && node.parenthesized?
@@ -96,10 +97,6 @@ module RuboCop
96
97
  end
97
98
  alias on_csend on_send
98
99
 
99
- def autocorrect(range)
100
- PunctuationCorrector.swap_comma(range)
101
- end
102
-
103
100
  def self.autocorrect_incompatible_with
104
101
  [Layout::HeredocArgumentClosingParenthesis]
105
102
  end
@@ -81,18 +81,15 @@ module RuboCop
81
81
  # 1,
82
82
  # 2
83
83
  # ]
84
- class TrailingCommaInArrayLiteral < Cop
84
+ class TrailingCommaInArrayLiteral < Base
85
85
  include TrailingComma
86
+ extend AutoCorrector
86
87
 
87
88
  def on_array(node)
88
89
  return unless node.square_brackets?
89
90
 
90
91
  check_literal(node, 'item of %<article>s array')
91
92
  end
92
-
93
- def autocorrect(range)
94
- PunctuationCorrector.swap_comma(range)
95
- end
96
93
  end
97
94
  end
98
95
  end
@@ -40,20 +40,21 @@ module RuboCop
40
40
  # add do
41
41
  # foo + bar
42
42
  # end
43
- class TrailingCommaInBlockArgs < Cop
43
+ class TrailingCommaInBlockArgs < Base
44
+ extend AutoCorrector
45
+
44
46
  MSG = 'Useless trailing comma present in block arguments.'
45
47
 
46
48
  def on_block(node)
47
49
  # lambda literal (`->`) never has block arguments.
48
50
  return if node.send_node.lambda_literal?
49
-
50
51
  return unless useless_trailing_comma?(node)
51
52
 
52
- add_offense(node, location: last_comma(node).pos)
53
- end
53
+ last_comma_pos = last_comma(node).pos
54
54
 
55
- def autocorrect(node)
56
- ->(corrector) { corrector.replace(last_comma(node).pos, '') }
55
+ add_offense(last_comma_pos) do |corrector|
56
+ corrector.replace(last_comma_pos, '')
57
+ end
57
58
  end
58
59
 
59
60
  private
@@ -84,16 +84,13 @@ module RuboCop
84
84
  # foo: 1,
85
85
  # bar: 2
86
86
  # }
87
- class TrailingCommaInHashLiteral < Cop
87
+ class TrailingCommaInHashLiteral < Base
88
88
  include TrailingComma
89
+ extend AutoCorrector
89
90
 
90
91
  def on_hash(node)
91
92
  check_literal(node, 'item of %<article>s hash')
92
93
  end
93
-
94
- def autocorrect(range)
95
- PunctuationCorrector.swap_comma(range)
96
- end
97
94
  end
98
95
  end
99
96
  end
@@ -28,9 +28,10 @@ module RuboCop
28
28
  # # bad
29
29
  # a, b, _something = foo()
30
30
  #
31
- class TrailingUnderscoreVariable < Cop
31
+ class TrailingUnderscoreVariable < Base
32
32
  include SurroundingSpace
33
33
  include RangeHelp
34
+ extend AutoCorrector
34
35
 
35
36
  MSG = 'Do not use trailing `_`s in parallel assignment. ' \
36
37
  'Prefer `%<code>s`.'
@@ -44,17 +45,9 @@ module RuboCop
44
45
  offset = range.begin_pos - node.source_range.begin_pos
45
46
  good_code[offset, range.size] = ''
46
47
 
47
- add_offense(node,
48
- location: range,
49
- message: format(MSG, code: good_code))
50
- end
51
- end
52
-
53
- def autocorrect(node)
54
- ranges = unneeded_ranges(node)
55
-
56
- lambda do |corrector|
57
- ranges.each { |range| corrector.remove(range) if range }
48
+ add_offense(range, message: format(MSG, code: good_code)) do |corrector|
49
+ corrector.remove(range)
50
+ end
58
51
  end
59
52
  end
60
53
 
@@ -75,11 +68,9 @@ module RuboCop
75
68
 
76
69
  var, = *variable
77
70
  var, = *var
78
- if allow_named_underscore_variables
79
- break offense unless var == :_
80
- else
81
- break offense unless var.to_s.start_with?(UNDERSCORE)
82
- end
71
+
72
+ break offense if (allow_named_underscore_variables && var != :_) ||
73
+ !var.to_s.start_with?(UNDERSCORE)
83
74
 
84
75
  variable
85
76
  end
@@ -27,8 +27,9 @@ module RuboCop
27
27
  # class << self
28
28
  # attr_reader :baz
29
29
  # end
30
- class TrivialAccessors < Cop
30
+ class TrivialAccessors < Base
31
31
  include AllowedMethods
32
+ extend AutoCorrector
32
33
 
33
34
  MSG = 'Use `attr_%<kind>s` to define trivial %<kind>s methods.'
34
35
 
@@ -41,17 +42,6 @@ module RuboCop
41
42
  end
42
43
  alias on_defs on_def
43
44
 
44
- def autocorrect(node)
45
- parent = node.parent
46
- return if parent&.send_type?
47
-
48
- if node.def_type?
49
- autocorrect_instance(node)
50
- elsif node.defs_type? && node.children.first.self_type?
51
- autocorrect_class(node)
52
- end
53
- end
54
-
55
45
  private
56
46
 
57
47
  def in_module_or_instance_eval?(node)
@@ -76,9 +66,20 @@ module RuboCop
76
66
  end
77
67
  return unless kind
78
68
 
79
- add_offense(node,
80
- location: :keyword,
81
- message: format(MSG, kind: kind))
69
+ add_offense(node.loc.keyword, message: format(MSG, kind: kind)) do |corrector|
70
+ autocorrect(corrector, node)
71
+ end
72
+ end
73
+
74
+ def autocorrect(corrector, node)
75
+ parent = node.parent
76
+ return if parent&.send_type?
77
+
78
+ if node.def_type?
79
+ autocorrect_instance(corrector, node)
80
+ elsif node.defs_type? && node.children.first.self_type?
81
+ autocorrect_class(corrector, node)
82
+ end
82
83
  end
83
84
 
84
85
  def exact_name_match?
@@ -156,31 +157,26 @@ module RuboCop
156
157
  "attr_#{kind} :#{method_name.to_s.chomp('=')}"
157
158
  end
158
159
 
159
- def autocorrect_instance(node)
160
+ def autocorrect_instance(corrector, node)
160
161
  kind = trivial_accessor_kind(node)
161
162
 
162
163
  return unless names_match?(node) && !node.predicate_method? && kind
163
164
 
164
- lambda do |corrector|
165
- corrector.replace(node,
166
- accessor(kind, node.method_name))
167
- end
165
+ corrector.replace(node, accessor(kind, node.method_name))
168
166
  end
169
167
 
170
- def autocorrect_class(node)
168
+ def autocorrect_class(corrector, node)
171
169
  kind = trivial_accessor_kind(node)
172
170
 
173
171
  return unless names_match?(node) && kind
174
172
 
175
- lambda do |corrector|
176
- indent = ' ' * node.loc.column
177
- corrector.replace(
178
- node.source_range,
179
- ['class << self',
180
- "#{indent} #{accessor(kind, node.method_name)}",
181
- "#{indent}end"].join("\n")
182
- )
183
- end
173
+ indent = ' ' * node.loc.column
174
+ corrector.replace(
175
+ node.source_range,
176
+ ['class << self',
177
+ "#{indent} #{accessor(kind, node.method_name)}",
178
+ "#{indent}end"].join("\n")
179
+ )
184
180
  end
185
181
 
186
182
  def top_level_node?(node)
@@ -19,8 +19,9 @@ module RuboCop
19
19
  # else
20
20
  # # do a different thing...
21
21
  # end
22
- class UnlessElse < Cop
22
+ class UnlessElse < Base
23
23
  include RangeHelp
24
+ extend AutoCorrector
24
25
 
25
26
  MSG = 'Do not use `unless` with `else`. Rewrite these with the ' \
26
27
  'positive case first.'
@@ -28,14 +29,10 @@ module RuboCop
28
29
  def on_if(node)
29
30
  return unless node.unless? && node.else?
30
31
 
31
- add_offense(node)
32
- end
33
-
34
- def autocorrect(node)
35
- body_range = range_between_condition_and_else(node, node.condition)
36
- else_range = range_between_else_and_end(node)
32
+ add_offense(node) do |corrector|
33
+ body_range = range_between_condition_and_else(node, node.condition)
34
+ else_range = range_between_else_and_end(node)
37
35
 
38
- lambda do |corrector|
39
36
  corrector.replace(node.loc.keyword, 'if')
40
37
  corrector.replace(body_range, else_range.source)
41
38
  corrector.replace(else_range, body_range.source)
@@ -17,7 +17,9 @@ module RuboCop
17
17
  # # good
18
18
  # 'foo'.unpack1('h*')
19
19
  #
20
- class UnpackFirst < Cop
20
+ class UnpackFirst < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Use `%<receiver>s.unpack1(%<format>s)` instead of '\
22
24
  '`%<receiver>s.unpack(%<format>s)%<method>s`.'
23
25
 
@@ -35,13 +37,7 @@ module RuboCop
35
37
  receiver: unpack_call.receiver.source,
36
38
  format: unpack_arg.source,
37
39
  method: range.source)
38
- add_offense(node, message: message)
39
- end
40
- end
41
-
42
- def autocorrect(node)
43
- unpack_and_first_element?(node) do |unpack_call, _unpack_arg|
44
- lambda do |corrector|
40
+ add_offense(node, message: message) do |corrector|
45
41
  corrector.remove(first_element_range(node, unpack_call))
46
42
  corrector.replace(unpack_call.loc.selector, 'unpack1')
47
43
  end