rubocop 0.88.0 → 0.91.1

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 (515) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/rubocop-profile +1 -0
  4. data/config/default.yml +219 -28
  5. data/lib/rubocop.rb +39 -5
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli/command.rb +1 -0
  8. data/lib/rubocop/cli/command/auto_genenerate_config.rb +2 -1
  9. data/lib/rubocop/cli/command/base.rb +2 -0
  10. data/lib/rubocop/cli/command/execute_runner.rb +10 -1
  11. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  12. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  13. data/lib/rubocop/cli/command/version.rb +3 -2
  14. data/lib/rubocop/cli/environment.rb +1 -0
  15. data/lib/rubocop/comment_config.rb +19 -12
  16. data/lib/rubocop/config.rb +20 -3
  17. data/lib/rubocop/config_loader.rb +22 -11
  18. data/lib/rubocop/config_loader_resolver.rb +4 -3
  19. data/lib/rubocop/config_obsoletion.rb +7 -1
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +5 -4
  22. data/lib/rubocop/cop/base.rb +25 -2
  23. data/lib/rubocop/cop/bundler/duplicated_gem.rb +5 -1
  24. data/lib/rubocop/cop/bundler/gem_comment.rb +8 -3
  25. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -0
  26. data/lib/rubocop/cop/commissioner.rb +47 -8
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  28. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  29. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  30. data/lib/rubocop/cop/correctors/line_break_corrector.rb +7 -7
  31. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
  32. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  33. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  36. data/lib/rubocop/cop/documentation.rb +22 -0
  37. data/lib/rubocop/cop/force.rb +1 -0
  38. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +32 -11
  39. data/lib/rubocop/cop/generator.rb +2 -1
  40. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  41. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +5 -12
  42. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  43. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  44. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +9 -8
  45. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +11 -7
  46. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +8 -8
  47. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  48. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  51. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  52. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  53. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  54. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  55. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  56. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  57. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  58. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  59. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  60. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  61. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  62. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  63. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  64. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  65. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  66. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  70. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  72. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  73. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  74. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  76. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  77. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  78. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  79. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  80. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  81. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  82. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  83. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  84. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  85. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  88. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  89. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  91. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  92. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  94. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -24
  95. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  96. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  97. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  98. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  99. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +9 -1
  103. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  104. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  105. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  106. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  107. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  108. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  109. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  110. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  111. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  112. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  113. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  114. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  115. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  116. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  117. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  119. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  120. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  121. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
  122. data/lib/rubocop/cop/lint/ambiguous_operator.rb +17 -10
  123. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
  124. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  125. data/lib/rubocop/cop/lint/big_decimal_new.rb +9 -10
  126. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
  127. data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
  128. data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
  129. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  130. data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
  131. data/lib/rubocop/cop/lint/debugger.rb +6 -1
  132. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +7 -10
  133. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +17 -13
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  136. data/lib/rubocop/cop/lint/duplicate_methods.rb +5 -4
  137. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  138. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +47 -0
  139. data/lib/rubocop/cop/lint/each_with_object_argument.rb +2 -1
  140. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  141. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  142. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  143. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  144. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  145. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  146. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  147. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  148. data/lib/rubocop/cop/lint/erb_new_arguments.rb +13 -10
  149. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  150. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  151. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  152. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -3
  153. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  154. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +2 -2
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +10 -13
  157. data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
  158. data/lib/rubocop/cop/lint/interpolation_check.rb +18 -15
  159. data/lib/rubocop/cop/lint/literal_as_condition.rb +4 -2
  160. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
  161. data/lib/rubocop/cop/lint/loop.rb +23 -2
  162. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
  163. data/lib/rubocop/cop/lint/missing_super.rb +99 -0
  164. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +3 -36
  165. data/lib/rubocop/cop/lint/multiple_comparison.rb +9 -10
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  167. data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
  168. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  169. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +27 -23
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +7 -9
  172. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
  173. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +79 -0
  174. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +4 -10
  175. data/lib/rubocop/cop/lint/percent_string_array.rb +3 -6
  176. data/lib/rubocop/cop/lint/percent_symbol_array.rb +13 -12
  177. data/lib/rubocop/cop/lint/raise_exception.rb +13 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +38 -31
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +20 -14
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -7
  182. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -9
  183. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
  184. data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
  185. data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
  186. data/lib/rubocop/cop/lint/regexp_as_condition.rb +4 -6
  187. data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
  188. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  189. data/lib/rubocop/cop/lint/rescue_type.rb +8 -9
  190. data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
  191. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
  192. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
  193. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +7 -7
  194. data/lib/rubocop/cop/lint/script_permission.rb +10 -7
  195. data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
  196. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +8 -12
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +8 -8
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +2 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +20 -11
  203. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
  204. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  205. data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
  206. data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
  207. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  208. data/lib/rubocop/cop/lint/unreachable_loop.rb +171 -0
  209. data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
  210. data/lib/rubocop/cop/lint/unused_method_argument.rb +8 -3
  211. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +4 -2
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +12 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +27 -23
  214. data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
  215. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
  216. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  219. data/lib/rubocop/cop/lint/void.rb +3 -7
  220. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  221. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  222. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  223. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  224. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  225. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  227. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  228. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  229. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +59 -5
  230. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  231. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  232. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  233. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  234. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  235. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  236. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  237. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  238. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  239. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  240. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  241. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  242. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  243. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  244. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  245. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  246. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  247. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  248. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  249. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  250. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  251. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  252. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  253. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  254. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  255. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  256. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  257. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  258. data/lib/rubocop/cop/mixin/statement_modifier.rb +43 -8
  259. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  260. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  261. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  262. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  263. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  264. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  265. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  266. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  268. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  270. data/lib/rubocop/cop/naming/file_name.rb +4 -4
  271. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  272. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  273. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  274. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  275. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  276. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  277. data/lib/rubocop/cop/offense.rb +1 -0
  278. data/lib/rubocop/cop/registry.rb +3 -3
  279. data/lib/rubocop/cop/security/eval.rb +3 -2
  280. data/lib/rubocop/cop/security/json_load.rb +7 -8
  281. data/lib/rubocop/cop/security/marshal_load.rb +3 -4
  282. data/lib/rubocop/cop/security/open.rb +3 -2
  283. data/lib/rubocop/cop/security/yaml_load.rb +7 -6
  284. data/lib/rubocop/cop/severity.rb +0 -8
  285. data/lib/rubocop/cop/style/access_modifier_declarations.rb +7 -8
  286. data/lib/rubocop/cop/style/accessor_grouping.rb +23 -21
  287. data/lib/rubocop/cop/style/alias.rb +43 -36
  288. data/lib/rubocop/cop/style/and_or.rb +9 -11
  289. data/lib/rubocop/cop/style/array_join.rb +7 -8
  290. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  291. data/lib/rubocop/cop/style/attr.rb +12 -9
  292. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  293. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  294. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  295. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -14
  296. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  297. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  298. data/lib/rubocop/cop/style/case_equality.rb +32 -5
  299. data/lib/rubocop/cop/style/case_like_if.rb +38 -19
  300. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  301. data/lib/rubocop/cop/style/class_check.rb +6 -11
  302. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  303. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  304. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  305. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  306. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  307. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  308. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  309. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  310. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  311. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  312. data/lib/rubocop/cop/style/conditional_assignment.rb +61 -63
  313. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  314. data/lib/rubocop/cop/style/copyright.rb +12 -12
  315. data/lib/rubocop/cop/style/date_time.rb +1 -1
  316. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  317. data/lib/rubocop/cop/style/dir.rb +8 -10
  318. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  319. data/lib/rubocop/cop/style/documentation.rb +6 -8
  320. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  321. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  322. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  323. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  324. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  325. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  326. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  327. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  328. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  329. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  330. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  331. data/lib/rubocop/cop/style/encoding.rb +5 -9
  332. data/lib/rubocop/cop/style/end_block.rb +4 -6
  333. data/lib/rubocop/cop/style/eval_with_location.rb +7 -7
  334. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  335. data/lib/rubocop/cop/style/expand_path_arguments.rb +22 -21
  336. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  337. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  338. data/lib/rubocop/cop/style/float_division.rb +3 -1
  339. data/lib/rubocop/cop/style/for.rb +11 -15
  340. data/lib/rubocop/cop/style/format_string.rb +18 -19
  341. data/lib/rubocop/cop/style/format_string_token.rb +5 -7
  342. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  343. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  344. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  345. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  346. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -1
  347. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  348. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  349. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  350. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  351. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  352. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  353. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -37
  354. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  355. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  356. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  357. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  358. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  359. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  360. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  361. data/lib/rubocop/cop/style/lambda.rb +7 -12
  362. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  363. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  366. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  367. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  368. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  369. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  370. data/lib/rubocop/cop/style/min_max.rb +8 -12
  371. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  372. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  373. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  374. data/lib/rubocop/cop/style/mixin_usage.rb +2 -1
  375. data/lib/rubocop/cop/style/module_function.rb +10 -13
  376. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  377. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  378. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  379. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  380. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  381. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  382. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  383. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  384. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  385. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  386. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  387. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  388. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  389. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  390. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  391. data/lib/rubocop/cop/style/next.rb +10 -14
  392. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  393. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  394. data/lib/rubocop/cop/style/not.rb +20 -26
  395. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  396. data/lib/rubocop/cop/style/numeric_predicate.rb +6 -11
  397. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  398. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  399. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  400. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +45 -0
  401. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  402. data/lib/rubocop/cop/style/parallel_assignment.rb +16 -16
  403. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  404. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +15 -21
  405. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  406. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  407. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  408. data/lib/rubocop/cop/style/proc.rb +6 -6
  409. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  410. data/lib/rubocop/cop/style/random_with_offset.rb +20 -19
  411. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  412. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  413. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  414. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  415. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  416. data/lib/rubocop/cop/style/redundant_exception.rb +2 -0
  417. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  418. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  419. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  420. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  421. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  422. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  423. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  424. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +14 -23
  425. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  426. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  427. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  428. data/lib/rubocop/cop/style/redundant_sort.rb +24 -28
  429. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  430. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  431. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  432. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  433. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  434. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  435. data/lib/rubocop/cop/style/sample.rb +12 -14
  436. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  437. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  438. data/lib/rubocop/cop/style/send.rb +4 -5
  439. data/lib/rubocop/cop/style/signal_exception.rb +25 -19
  440. data/lib/rubocop/cop/style/single_argument_dig.rb +55 -0
  441. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  442. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  443. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  444. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  445. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  446. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  447. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  448. data/lib/rubocop/cop/style/string_concatenation.rb +106 -0
  449. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  450. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  451. data/lib/rubocop/cop/style/strip.rb +9 -14
  452. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  453. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  454. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  455. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  456. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  457. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  458. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  459. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  460. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  461. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  462. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  463. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  464. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -1
  465. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  466. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  467. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  468. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  469. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  470. data/lib/rubocop/cop/style/when_then.rb +4 -6
  471. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  472. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  473. data/lib/rubocop/cop/style/word_array.rb +5 -23
  474. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  475. data/lib/rubocop/cop/style/zero_length_predicate.rb +17 -19
  476. data/lib/rubocop/cop/team.rb +2 -1
  477. data/lib/rubocop/cop/util.rb +2 -13
  478. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  479. data/lib/rubocop/cop/variable_force.rb +2 -2
  480. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  481. data/lib/rubocop/cop/variable_force/variable.rb +2 -2
  482. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  483. data/lib/rubocop/core_ext/string.rb +2 -2
  484. data/lib/rubocop/directive_comment.rb +32 -0
  485. data/lib/rubocop/error.rb +1 -0
  486. data/lib/rubocop/ext/regexp_node.rb +46 -0
  487. data/lib/rubocop/file_finder.rb +1 -0
  488. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  489. data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
  490. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  491. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  492. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  493. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  494. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  495. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  496. data/lib/rubocop/name_similarity.rb +1 -0
  497. data/lib/rubocop/options.rb +25 -4
  498. data/lib/rubocop/path_util.rb +19 -4
  499. data/lib/rubocop/rake_task.rb +1 -0
  500. data/lib/rubocop/remote_config.rb +1 -0
  501. data/lib/rubocop/result_cache.rb +31 -13
  502. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  503. data/lib/rubocop/rspec/expect_offense.rb +11 -6
  504. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  505. data/lib/rubocop/runner.rb +31 -15
  506. data/lib/rubocop/string_interpreter.rb +3 -0
  507. data/lib/rubocop/target_finder.rb +13 -9
  508. data/lib/rubocop/target_ruby.rb +6 -0
  509. data/lib/rubocop/version.rb +3 -2
  510. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  511. metadata +38 -8
  512. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  513. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  514. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  515. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -8,11 +8,20 @@ module RuboCop
8
8
  # when reading code.
9
9
  #
10
10
  # @example
11
- #
11
+ # # bad
12
12
  # a do
13
13
  # b
14
14
  # end.c
15
- class MethodCalledOnDoEndBlock < Cop
15
+ #
16
+ # # good
17
+ # a { b }.c
18
+ #
19
+ # # good
20
+ # foo = a do
21
+ # b
22
+ # end
23
+ # foo.c
24
+ class MethodCalledOnDoEndBlock < Base
16
25
  include RangeHelp
17
26
 
18
27
  MSG = 'Avoid chaining a method call on a do...end block.'
@@ -37,7 +46,7 @@ module RuboCop
37
46
  range = range_between(receiver.loc.end.begin_pos,
38
47
  node.source_range.end_pos)
39
48
 
40
- add_offense(nil, location: range)
49
+ add_offense(range)
41
50
  end
42
51
  alias on_csend on_send
43
52
  end
@@ -84,9 +84,10 @@ module RuboCop
84
84
  # last_descriptive_var_name)
85
85
  # do_something
86
86
  # end
87
- class MethodDefParentheses < Cop
87
+ class MethodDefParentheses < Base
88
88
  include ConfigurableEnforcedStyle
89
89
  include RangeHelp
90
+ extend AutoCorrector
90
91
 
91
92
  MSG_PRESENT = 'Use def without parentheses.'
92
93
  MSG_MISSING = 'Use def with parentheses when there are ' \
@@ -109,17 +110,6 @@ module RuboCop
109
110
  end
110
111
  alias on_defs on_def
111
112
 
112
- def autocorrect(node)
113
- lambda do |corrector|
114
- if node.args_type?
115
- # offense is registered on args node when parentheses are unwanted
116
- correct_arguments(node, corrector)
117
- else
118
- correct_definition(node, corrector)
119
- end
120
- end
121
- end
122
-
123
113
  private
124
114
 
125
115
  def correct_arguments(arg_node, corrector)
@@ -150,14 +140,19 @@ module RuboCop
150
140
  def missing_parentheses(node)
151
141
  location = node.arguments.source_range
152
142
 
153
- add_offense(node, location: location, message: MSG_MISSING) do
154
- unexpected_style_detected(:require_no_parentheses)
143
+ return unless unexpected_style_detected(:require_no_parentheses)
144
+
145
+ add_offense(location, message: MSG_MISSING) do |corrector|
146
+ correct_definition(node, corrector)
155
147
  end
156
148
  end
157
149
 
158
150
  def unwanted_parentheses(args)
159
- add_offense(args, message: MSG_PRESENT) do
160
- unexpected_style_detected(:require_parentheses)
151
+ return unless unexpected_style_detected(:require_parentheses)
152
+
153
+ add_offense(args, message: MSG_PRESENT) do |corrector|
154
+ # offense is registered on args node when parentheses are unwanted
155
+ correct_arguments(args, corrector)
161
156
  end
162
157
  end
163
158
  end
@@ -14,27 +14,23 @@ module RuboCop
14
14
  # # good
15
15
  # bar = foo.minmax
16
16
  # return foo.minmax
17
- class MinMax < Cop
17
+ class MinMax < Base
18
+ extend AutoCorrector
19
+
18
20
  MSG = 'Use `%<receiver>s.minmax` instead of `%<offender>s`.'
19
21
 
20
22
  def on_array(node)
21
23
  min_max_candidate(node) do |receiver|
22
24
  offender = offending_range(node)
23
25
 
24
- add_offense(node, location: offender,
25
- message: message(offender, receiver))
26
- end
27
- end
28
- alias on_return on_array
29
-
30
- def autocorrect(node)
31
- receiver = node.children.first.receiver
26
+ add_offense(offender, message: message(offender, receiver)) do |corrector|
27
+ receiver = node.children.first.receiver
32
28
 
33
- lambda do |corrector|
34
- corrector.replace(offending_range(node),
35
- "#{receiver.source}.minmax")
29
+ corrector.replace(offending_range(node), "#{receiver.source}.minmax")
30
+ end
36
31
  end
37
32
  end
33
+ alias on_return on_array
38
34
 
39
35
  private
40
36
 
@@ -93,7 +93,7 @@ module RuboCop
93
93
  # else
94
94
  # # the content of `else` branch will be determined by Style/EmptyElse
95
95
  # end
96
- class MissingElse < Cop
96
+ class MissingElse < Base
97
97
  include OnNormalIfUnless
98
98
  include ConfigurableEnforcedStyle
99
99
 
@@ -119,20 +119,20 @@ module RuboCop
119
119
  private
120
120
 
121
121
  def check(node)
122
- add_offense(node) unless node.else?
122
+ return if node.else?
123
+
124
+ add_offense(node, message: format(message_template, type: node.type))
123
125
  end
124
126
 
125
- def message(node)
126
- template = case empty_else_style
127
- when :empty
128
- MSG_NIL
129
- when :nil
130
- MSG_EMPTY
131
- else
132
- MSG
133
- end
134
-
135
- format(template, type: node.type)
127
+ def message_template
128
+ case empty_else_style
129
+ when :empty
130
+ MSG_NIL
131
+ when :nil
132
+ MSG_EMPTY
133
+ else
134
+ MSG
135
+ end
136
136
  end
137
137
 
138
138
  def if_style?
@@ -21,7 +21,7 @@ module RuboCop
21
21
  # # ...
22
22
  # end
23
23
  #
24
- class MissingRespondToMissing < Cop
24
+ class MissingRespondToMissing < Base
25
25
  MSG =
26
26
  'When using `method_missing`, define `respond_to_missing?`.'
27
27
 
@@ -36,9 +36,16 @@ module RuboCop
36
36
  private
37
37
 
38
38
  def implements_respond_to_missing?(node)
39
- node.parent.each_child_node(node.type).any? do |sibling|
40
- sibling.method?(:respond_to_missing?)
39
+ return false unless (grand_parent = node.parent.parent)
40
+
41
+ grand_parent.each_descendant(node.type) do |descendant|
42
+ return true if descendant.method?(:respond_to_missing?)
43
+
44
+ child = descendant.children.first
45
+ return true if child.respond_to?(:method?) && child.method?(:respond_to_missing?)
41
46
  end
47
+
48
+ false
42
49
  end
43
50
  end
44
51
  end
@@ -30,8 +30,9 @@ module RuboCop
30
30
  # class Foo
31
31
  # extend Qox, Bar
32
32
  # end
33
- class MixinGrouping < Cop
33
+ class MixinGrouping < Base
34
34
  include ConfigurableEnforcedStyle
35
+ extend AutoCorrector
35
36
 
36
37
  MIXIN_METHODS = %i[extend include prepend].freeze
37
38
  MSG = 'Put `%<mixin>s` mixins in %<suffix>s.'
@@ -47,23 +48,6 @@ module RuboCop
47
48
 
48
49
  alias on_module on_class
49
50
 
50
- def autocorrect(node)
51
- range = node.loc.expression
52
- if separated_style?
53
- correction = separate_mixins(node)
54
- else
55
- mixins = sibling_mixins(node)
56
- if node == mixins.first
57
- correction = group_mixins(node, mixins)
58
- else
59
- range = range_to_remove_for_subsequent_mixin(mixins, node)
60
- correction = ''
61
- end
62
- end
63
-
64
- ->(corrector) { corrector.replace(range, correction) }
65
- end
66
-
67
51
  private
68
52
 
69
53
  def range_to_remove_for_subsequent_mixin(mixins, node)
@@ -89,13 +73,33 @@ module RuboCop
89
73
  def check_grouped_style(send_node)
90
74
  return if sibling_mixins(send_node).size == 1
91
75
 
92
- add_offense(send_node)
76
+ message = format(MSG, mixin: send_node.method_name, suffix: 'a single statement')
77
+
78
+ add_offense(send_node, message: message) do |corrector|
79
+ range = send_node.loc.expression
80
+ mixins = sibling_mixins(send_node)
81
+ if send_node == mixins.first
82
+ correction = group_mixins(send_node, mixins)
83
+ else
84
+ range = range_to_remove_for_subsequent_mixin(mixins, send_node)
85
+ correction = ''
86
+ end
87
+
88
+ corrector.replace(range, correction)
89
+ end
93
90
  end
94
91
 
95
92
  def check_separated_style(send_node)
96
93
  return if send_node.arguments.one?
97
94
 
98
- add_offense(send_node)
95
+ message = format(MSG, mixin: send_node.method_name, suffix: 'separate statements')
96
+
97
+ add_offense(send_node, message: message) do |corrector|
98
+ range = send_node.loc.expression
99
+ correction = separate_mixins(send_node)
100
+
101
+ corrector.replace(range, correction)
102
+ end
99
103
  end
100
104
 
101
105
  def sibling_mixins(send_node)
@@ -107,13 +111,6 @@ module RuboCop
107
111
  end
108
112
  end
109
113
 
110
- def message(send_node)
111
- suffix =
112
- separated_style? ? 'separate statements' : 'a single statement'
113
-
114
- format(MSG, mixin: send_node.method_name, suffix: suffix)
115
- end
116
-
117
114
  def grouped_style?
118
115
  style == :grouped
119
116
  end
@@ -40,9 +40,10 @@ module RuboCop
40
40
  # class C
41
41
  # prepend M
42
42
  # end
43
- class MixinUsage < Cop
43
+ class MixinUsage < Base
44
44
  MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \
45
45
  'or `module`.'
46
+ RESTRICT_ON_SEND = %i[include extend prepend].freeze
46
47
 
47
48
  def_node_matcher :include_statement, <<~PATTERN
48
49
  (send nil? ${:include :extend :prepend}
@@ -71,8 +71,9 @@ module RuboCop
71
71
  #
72
72
  # These offenses are not safe to auto-correct since there are different
73
73
  # implications to each approach.
74
- class ModuleFunction < Cop
74
+ class ModuleFunction < Base
75
75
  include ConfigurableEnforcedStyle
76
+ extend AutoCorrector
76
77
 
77
78
  MODULE_FUNCTION_MSG =
78
79
  'Use `module_function` instead of `extend self`.'
@@ -89,18 +90,14 @@ module RuboCop
89
90
  return unless node.body&.begin_type?
90
91
 
91
92
  each_wrong_style(node.body.children) do |child_node|
92
- add_offense(child_node)
93
- end
94
- end
95
-
96
- def autocorrect(node)
97
- return if style == :forbidden
93
+ add_offense(child_node) do |corrector|
94
+ next if style == :forbidden
98
95
 
99
- lambda do |corrector|
100
- if extend_self_node?(node)
101
- corrector.replace(node, 'module_function')
102
- else
103
- corrector.replace(node, 'extend self')
96
+ if extend_self_node?(child_node)
97
+ corrector.replace(child_node, 'module_function')
98
+ else
99
+ corrector.replace(child_node, 'extend self')
100
+ end
104
101
  end
105
102
  end
106
103
  end
@@ -139,7 +136,7 @@ module RuboCop
139
136
  end
140
137
  end
141
138
 
142
- def message(_node)
139
+ def message(_range)
143
140
  return FORBIDDEN_MSG if style == :forbidden
144
141
 
145
142
  style == :module_function ? MODULE_FUNCTION_MSG : EXTEND_SELF_MSG
@@ -22,7 +22,7 @@ module RuboCop
22
22
  # alive_threads.map do |t|
23
23
  # t.object_id
24
24
  # end
25
- class MultilineBlockChain < Cop
25
+ class MultilineBlockChain < Base
26
26
  include RangeHelp
27
27
 
28
28
  MSG = 'Avoid multi-line chains of blocks.'
@@ -36,7 +36,7 @@ module RuboCop
36
36
  range = range_between(receiver.loc.end.begin_pos,
37
37
  node.send_node.source_range.end_pos)
38
38
 
39
- add_offense(nil, location: range)
39
+ add_offense(range)
40
40
 
41
41
  # Done. If there are more blocks in the chain, they will be
42
42
  # found by subsequent calls to on_block.
@@ -14,9 +14,10 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # { result: 'ok' } if cond
17
- class MultilineIfModifier < Cop
17
+ class MultilineIfModifier < Base
18
18
  include StatementModifier
19
19
  include Alignment
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Favor a normal %<keyword>s-statement over a modifier' \
22
23
  ' clause in a multiline statement.'
@@ -24,21 +25,13 @@ module RuboCop
24
25
  def on_if(node)
25
26
  return unless node.modifier_form? && node.body.multiline?
26
27
 
27
- add_offense(node)
28
- end
29
-
30
- def autocorrect(node)
31
- lambda do |corrector|
28
+ add_offense(node, message: format(MSG, keyword: node.keyword)) do |corrector|
32
29
  corrector.replace(node, to_normal_if(node))
33
30
  end
34
31
  end
35
32
 
36
33
  private
37
34
 
38
- def message(node)
39
- format(MSG, keyword: node.keyword)
40
- end
41
-
42
35
  def to_normal_if(node)
43
36
  indented_body = indented_body(node.body, node)
44
37
  condition = "#{node.keyword} #{node.condition.source}"
@@ -16,9 +16,10 @@ module RuboCop
16
16
  # if cond then a
17
17
  # elsif cond then b
18
18
  # end
19
- class MultilineIfThen < Cop
19
+ class MultilineIfThen < Base
20
20
  include OnNormalIfUnless
21
21
  include RangeHelp
22
+ extend AutoCorrector
22
23
 
23
24
  NON_MODIFIER_THEN = /then\s*(#.*)?$/.freeze
24
25
 
@@ -27,15 +28,8 @@ module RuboCop
27
28
  def on_normal_if_unless(node)
28
29
  return unless non_modifier_then?(node)
29
30
 
30
- add_offense(node, location: :begin,
31
- message: format(MSG, keyword: node.keyword))
32
- end
33
-
34
- def autocorrect(node)
35
- lambda do |corrector|
36
- corrector.remove(
37
- range_with_surrounding_space(range: node.loc.begin, side: :left)
38
- )
31
+ add_offense(node.loc.begin, message: format(MSG, keyword: node.keyword)) do |corrector|
32
+ corrector.remove(range_with_surrounding_space(range: node.loc.begin, side: :left))
39
33
  end
40
34
  end
41
35
 
@@ -30,30 +30,32 @@ module RuboCop
30
30
  # bar
31
31
  # baz
32
32
  # )
33
- class MultilineMemoization < Cop
33
+ class MultilineMemoization < Base
34
34
  include ConfigurableEnforcedStyle
35
+ extend AutoCorrector
35
36
 
36
- MSG = 'Wrap multiline memoization blocks in `begin` and `end`.'
37
+ KEYWORD_MSG = 'Wrap multiline memoization blocks in `begin` and `end`.'
38
+ BRACES_MSG = 'Wrap multiline memoization blocks in `(` and `)`.'
37
39
 
38
40
  def on_or_asgn(node)
39
41
  _lhs, rhs = *node
40
42
 
41
43
  return unless bad_rhs?(rhs)
42
44
 
43
- add_offense(rhs, location: node.source_range)
44
- end
45
-
46
- def autocorrect(node)
47
- lambda do |corrector|
45
+ add_offense(node.source_range) do |corrector|
48
46
  if style == :keyword
49
- keyword_autocorrect(node, corrector)
47
+ keyword_autocorrect(rhs, corrector)
50
48
  else
51
- corrector.replace(node.loc.begin, '(')
52
- corrector.replace(node.loc.end, ')')
49
+ corrector.replace(rhs.loc.begin, '(')
50
+ corrector.replace(rhs.loc.end, ')')
53
51
  end
54
52
  end
55
53
  end
56
54
 
55
+ def message(_node)
56
+ style == :braces ? BRACES_MSG : KEYWORD_MSG
57
+ end
58
+
57
59
  private
58
60
 
59
61
  def bad_rhs?(rhs)
@@ -77,13 +79,13 @@ module RuboCop
77
79
  if node_buf.source[node.loc.begin.end_pos] == "\n"
78
80
  'begin'
79
81
  else
80
- "begin\n" + (' ' * (node.loc.column + indent))
82
+ "begin\n#{' ' * (node.loc.column + indent)}"
81
83
  end
82
84
  end
83
85
 
84
86
  def keyword_end_str(node, node_buf)
85
87
  if /[^\s)]/.match?(node_buf.source_line(node.loc.end.line))
86
- "\n" + (' ' * node.loc.column) + 'end'
88
+ "\n#{' ' * node.loc.column}end"
87
89
  else
88
90
  'end'
89
91
  end