rubocop 0.87.0 → 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 (508) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/rubocop-profile +32 -0
  4. data/config/default.yml +232 -33
  5. data/lib/rubocop.rb +36 -4
  6. data/lib/rubocop/cached_data.rb +1 -0
  7. data/lib/rubocop/cli.rb +2 -2
  8. data/lib/rubocop/cli/command.rb +1 -0
  9. data/lib/rubocop/cli/command/auto_genenerate_config.rb +4 -3
  10. data/lib/rubocop/cli/command/base.rb +2 -0
  11. data/lib/rubocop/cli/command/execute_runner.rb +2 -1
  12. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +3 -2
  14. data/lib/rubocop/cli/command/version.rb +3 -2
  15. data/lib/rubocop/cli/environment.rb +1 -0
  16. data/lib/rubocop/comment_config.rb +10 -7
  17. data/lib/rubocop/config.rb +20 -3
  18. data/lib/rubocop/config_loader.rb +39 -16
  19. data/lib/rubocop/config_loader_resolver.rb +4 -3
  20. data/lib/rubocop/config_obsoletion.rb +7 -1
  21. data/lib/rubocop/config_store.rb +4 -0
  22. data/lib/rubocop/config_validator.rb +5 -4
  23. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  24. data/lib/rubocop/cop/badge.rb +1 -1
  25. data/lib/rubocop/cop/base.rb +37 -6
  26. data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
  27. data/lib/rubocop/cop/commissioner.rb +47 -8
  28. data/lib/rubocop/cop/cop.rb +1 -1
  29. data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
  30. data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
  31. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
  32. data/lib/rubocop/cop/correctors/line_break_corrector.rb +6 -6
  33. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +34 -3
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +6 -11
  36. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  37. data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
  38. data/lib/rubocop/cop/documentation.rb +22 -0
  39. data/lib/rubocop/cop/force.rb +1 -0
  40. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +38 -12
  41. data/lib/rubocop/cop/generator.rb +1 -0
  42. data/lib/rubocop/cop/generator/configuration_injector.rb +2 -2
  43. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
  44. data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
  46. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
  47. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
  48. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
  49. data/lib/rubocop/cop/layout/block_alignment.rb +24 -20
  50. data/lib/rubocop/cop/layout/class_structure.rb +15 -53
  51. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  52. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  53. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
  55. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  56. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
  58. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  59. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
  60. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  61. data/lib/rubocop/cop/layout/empty_lines.rb +6 -9
  62. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +5 -6
  63. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  64. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
  65. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  68. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
  69. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  70. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  71. data/lib/rubocop/cop/layout/end_alignment.rb +9 -9
  72. data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  74. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  75. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +5 -9
  76. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  77. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  78. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  79. data/lib/rubocop/cop/layout/heredoc_indentation.rb +16 -13
  80. data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
  81. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  83. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  84. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  86. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  87. data/lib/rubocop/cop/layout/multiline_block_layout.rb +37 -24
  88. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  89. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  90. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  91. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  92. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  93. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -23
  94. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  95. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  96. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  97. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  98. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  99. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +3 -2
  100. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
  101. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  102. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
  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 +16 -18
  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 +16 -19
  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 +13 -16
  118. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
  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 +15 -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 +10 -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_resolution.rb +2 -2
  130. data/lib/rubocop/cop/lint/debugger.rb +7 -1
  131. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
  132. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
  133. data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
  134. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
  135. data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
  136. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
  137. data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
  138. data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
  139. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +49 -0
  140. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
  141. data/lib/rubocop/cop/lint/else_layout.rb +1 -1
  142. data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
  143. data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
  144. data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
  145. data/lib/rubocop/cop/lint/empty_file.rb +53 -0
  146. data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
  147. data/lib/rubocop/cop/lint/empty_when.rb +2 -2
  148. data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
  149. data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
  150. data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
  151. data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
  152. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  153. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +5 -4
  154. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
  155. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
  156. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
  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 +14 -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 +6 -9
  166. data/lib/rubocop/cop/lint/nested_method_definition.rb +14 -20
  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 +82 -11
  170. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
  171. data/lib/rubocop/cop/lint/number_conversion.rb +6 -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 +80 -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 +12 -10
  178. data/lib/rubocop/cop/lint/rand_one.rb +2 -2
  179. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +16 -19
  180. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
  181. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -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 -8
  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 +5 -11
  197. data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
  198. data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
  199. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -7
  200. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
  201. data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
  202. data/lib/rubocop/cop/lint/to_json.rb +4 -6
  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 +174 -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 +1 -1
  212. data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
  213. data/lib/rubocop/cop/lint/useless_access_modifier.rb +25 -15
  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 +77 -0
  217. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
  218. data/lib/rubocop/cop/lint/void.rb +3 -7
  219. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  220. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  221. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  222. data/lib/rubocop/cop/metrics/class_length.rb +2 -2
  223. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +2 -1
  224. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  225. data/lib/rubocop/cop/metrics/module_length.rb +2 -2
  226. data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
  227. data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
  228. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +50 -5
  229. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +53 -24
  230. data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
  231. data/lib/rubocop/cop/migration/department_name.rb +14 -16
  232. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  233. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  234. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  235. data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
  236. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  237. data/lib/rubocop/cop/mixin/code_length.rb +22 -5
  238. data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
  239. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  240. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  241. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
  242. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  243. data/lib/rubocop/cop/mixin/hash_transform_method.rb +22 -11
  244. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  245. data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
  246. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  247. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  248. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  249. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  250. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  251. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  252. data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
  253. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  254. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  255. data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
  256. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -29
  257. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  258. data/lib/rubocop/cop/mixin/uncommunicative_name.rb +6 -13
  259. data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
  260. data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
  261. data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
  262. data/lib/rubocop/cop/naming/ascii_identifiers.rb +3 -3
  263. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  264. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  265. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
  266. data/lib/rubocop/cop/naming/constant_name.rb +2 -2
  267. data/lib/rubocop/cop/naming/file_name.rb +3 -3
  268. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
  269. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +2 -2
  270. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
  271. data/lib/rubocop/cop/naming/method_parameter_name.rb +1 -1
  272. data/lib/rubocop/cop/naming/predicate_name.rb +3 -5
  273. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
  274. data/lib/rubocop/cop/offense.rb +1 -0
  275. data/lib/rubocop/cop/registry.rb +3 -3
  276. data/lib/rubocop/cop/security/eval.rb +2 -2
  277. data/lib/rubocop/cop/security/json_load.rb +6 -8
  278. data/lib/rubocop/cop/security/marshal_load.rb +2 -4
  279. data/lib/rubocop/cop/security/open.rb +2 -2
  280. data/lib/rubocop/cop/security/yaml_load.rb +6 -6
  281. data/lib/rubocop/cop/severity.rb +0 -8
  282. data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
  283. data/lib/rubocop/cop/style/accessor_grouping.rb +33 -20
  284. data/lib/rubocop/cop/style/alias.rb +41 -36
  285. data/lib/rubocop/cop/style/and_or.rb +9 -11
  286. data/lib/rubocop/cop/style/array_coercion.rb +63 -0
  287. data/lib/rubocop/cop/style/array_join.rb +6 -8
  288. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  289. data/lib/rubocop/cop/style/attr.rb +11 -9
  290. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
  291. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  292. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  293. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +58 -38
  294. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  295. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  296. data/lib/rubocop/cop/style/case_equality.rb +29 -5
  297. data/lib/rubocop/cop/style/case_like_if.rb +236 -0
  298. data/lib/rubocop/cop/style/class_and_module_children.rb +14 -11
  299. data/lib/rubocop/cop/style/class_check.rb +7 -9
  300. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  301. data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
  302. data/lib/rubocop/cop/style/class_vars.rb +6 -10
  303. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  304. data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
  305. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  306. data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
  307. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  308. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  309. data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
  310. data/lib/rubocop/cop/style/conditional_assignment.rb +13 -4
  311. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  312. data/lib/rubocop/cop/style/copyright.rb +12 -12
  313. data/lib/rubocop/cop/style/date_time.rb +1 -1
  314. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  315. data/lib/rubocop/cop/style/dir.rb +7 -10
  316. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  317. data/lib/rubocop/cop/style/documentation.rb +6 -8
  318. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  319. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  320. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  321. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  322. data/lib/rubocop/cop/style/each_with_object.rb +16 -19
  323. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  324. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  325. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  326. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  327. data/lib/rubocop/cop/style/empty_literal.rb +15 -16
  328. data/lib/rubocop/cop/style/empty_method.rb +10 -13
  329. data/lib/rubocop/cop/style/encoding.rb +5 -9
  330. data/lib/rubocop/cop/style/end_block.rb +4 -6
  331. data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
  332. data/lib/rubocop/cop/style/even_odd.rb +7 -11
  333. data/lib/rubocop/cop/style/expand_path_arguments.rb +21 -20
  334. data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
  335. data/lib/rubocop/cop/style/exponential_notation.rb +7 -9
  336. data/lib/rubocop/cop/style/float_division.rb +8 -11
  337. data/lib/rubocop/cop/style/for.rb +11 -15
  338. data/lib/rubocop/cop/style/format_string.rb +21 -19
  339. data/lib/rubocop/cop/style/format_string_token.rb +10 -12
  340. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  341. data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
  342. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  343. data/lib/rubocop/cop/style/guard_clause.rb +6 -6
  344. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
  345. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  346. data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
  347. data/lib/rubocop/cop/style/hash_syntax.rb +10 -8
  348. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -3
  349. data/lib/rubocop/cop/style/hash_transform_values.rb +16 -2
  350. data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
  351. data/lib/rubocop/cop/style/if_inside_else.rb +3 -3
  352. data/lib/rubocop/cop/style/if_unless_modifier.rb +19 -41
  353. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  354. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  355. data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
  356. data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
  357. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  358. data/lib/rubocop/cop/style/inverse_methods.rb +22 -32
  359. data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
  360. data/lib/rubocop/cop/style/lambda.rb +7 -12
  361. data/lib/rubocop/cop/style/lambda_call.rb +14 -13
  362. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  363. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  364. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
  365. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  366. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
  367. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  368. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  369. data/lib/rubocop/cop/style/min_max.rb +8 -12
  370. data/lib/rubocop/cop/style/missing_else.rb +11 -21
  371. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
  372. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  373. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  374. data/lib/rubocop/cop/style/module_function.rb +10 -13
  375. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  376. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  377. data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
  378. data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
  379. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +4 -6
  380. data/lib/rubocop/cop/style/multiline_when_then.rb +9 -11
  381. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  382. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  383. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  384. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  385. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  386. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  387. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  388. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  389. data/lib/rubocop/cop/style/next.rb +10 -14
  390. data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
  391. data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
  392. data/lib/rubocop/cop/style/not.rb +19 -26
  393. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  394. data/lib/rubocop/cop/style/numeric_predicate.rb +11 -15
  395. data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
  396. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  397. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  398. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
  399. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  400. data/lib/rubocop/cop/style/parallel_assignment.rb +18 -18
  401. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  402. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +14 -20
  403. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  404. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  405. data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
  406. data/lib/rubocop/cop/style/proc.rb +6 -6
  407. data/lib/rubocop/cop/style/raise_args.rb +13 -24
  408. data/lib/rubocop/cop/style/random_with_offset.rb +16 -16
  409. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
  410. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  411. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  412. data/lib/rubocop/cop/style/redundant_condition.rb +20 -9
  413. data/lib/rubocop/cop/style/redundant_exception.rb +4 -0
  414. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  415. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
  416. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
  417. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  418. data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
  419. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  420. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -25
  421. data/lib/rubocop/cop/style/redundant_self.rb +2 -2
  422. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  423. data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
  424. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  425. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  426. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  427. data/lib/rubocop/cop/style/safe_navigation.rb +17 -16
  428. data/lib/rubocop/cop/style/sample.rb +10 -13
  429. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  430. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  431. data/lib/rubocop/cop/style/send.rb +2 -2
  432. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  433. data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
  434. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  435. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  436. data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
  437. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  438. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  439. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -20
  440. data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
  441. data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
  442. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  443. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  444. data/lib/rubocop/cop/style/strip.rb +8 -14
  445. data/lib/rubocop/cop/style/struct_inheritance.rb +4 -7
  446. data/lib/rubocop/cop/style/symbol_array.rb +6 -17
  447. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  448. data/lib/rubocop/cop/style/symbol_proc.rb +15 -19
  449. data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
  450. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  451. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  452. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  453. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  454. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  455. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
  456. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  457. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
  458. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  459. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  460. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  461. data/lib/rubocop/cop/style/unpack_first.rb +4 -8
  462. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  463. data/lib/rubocop/cop/style/when_then.rb +4 -6
  464. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  465. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  466. data/lib/rubocop/cop/style/word_array.rb +5 -23
  467. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  468. data/lib/rubocop/cop/style/zero_length_predicate.rb +19 -17
  469. data/lib/rubocop/cop/team.rb +2 -1
  470. data/lib/rubocop/cop/tokens_util.rb +84 -0
  471. data/lib/rubocop/cop/util.rb +3 -13
  472. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  473. data/lib/rubocop/cop/variable_force.rb +2 -2
  474. data/lib/rubocop/cop/variable_force/branch.rb +1 -0
  475. data/lib/rubocop/cop/variable_force/variable.rb +7 -5
  476. data/lib/rubocop/cops_documentation_generator.rb +284 -0
  477. data/lib/rubocop/core_ext/string.rb +1 -1
  478. data/lib/rubocop/error.rb +1 -0
  479. data/lib/rubocop/ext/regexp_node.rb +46 -0
  480. data/lib/rubocop/file_finder.rb +13 -12
  481. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  482. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -2
  483. data/lib/rubocop/formatter/formatter_set.rb +1 -0
  484. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  485. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  486. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  487. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  488. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  489. data/lib/rubocop/name_similarity.rb +1 -0
  490. data/lib/rubocop/options.rb +9 -6
  491. data/lib/rubocop/path_util.rb +17 -17
  492. data/lib/rubocop/rake_task.rb +1 -0
  493. data/lib/rubocop/remote_config.rb +1 -0
  494. data/lib/rubocop/result_cache.rb +13 -8
  495. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  496. data/lib/rubocop/rspec/expect_offense.rb +49 -7
  497. data/lib/rubocop/rspec/shared_contexts.rb +25 -14
  498. data/lib/rubocop/runner.rb +7 -7
  499. data/lib/rubocop/string_interpreter.rb +3 -0
  500. data/lib/rubocop/target_finder.rb +14 -10
  501. data/lib/rubocop/target_ruby.rb +6 -0
  502. data/lib/rubocop/version.rb +3 -2
  503. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  504. metadata +42 -8
  505. data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
  506. data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
  507. data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -25
  508. data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
@@ -55,6 +55,8 @@ module RuboCop
55
55
  MSG = 'Use `%<suggestion>s` instead of '\
56
56
  '`%<sorter>s...%<accessor_source>s`.'
57
57
 
58
+ SORT_METHODS = %i[sort sort_by].freeze
59
+
58
60
  def_node_matcher :redundant_sort?, <<~MATCHER
59
61
  {
60
62
  (send $(send _ $:sort ...) ${:last :first})
@@ -72,18 +74,21 @@ module RuboCop
72
74
  MATCHER
73
75
 
74
76
  def on_send(node)
75
- redundant_sort?(node) do |sort_node, sorter, accessor|
76
- range = range_between(
77
- sort_node.loc.selector.begin_pos,
78
- node.loc.expression.end_pos
79
- )
77
+ return unless sort_method?(node)
80
78
 
81
- add_offense(node,
82
- location: range,
83
- message: message(node,
84
- sorter,
85
- accessor))
79
+ if (sort_node, sorter, accessor = redundant_sort?(node.parent))
80
+ ancestor = node.parent
81
+ elsif (sort_node, sorter, accessor = redundant_sort?(node.parent&.parent))
82
+ ancestor = node.parent.parent
83
+ else
84
+ return
86
85
  end
86
+
87
+ add_offense(ancestor,
88
+ location: offense_range(sort_node, ancestor),
89
+ message: message(ancestor,
90
+ sorter,
91
+ accessor))
87
92
  end
88
93
 
89
94
  def autocorrect(node)
@@ -108,6 +113,14 @@ module RuboCop
108
113
 
109
114
  private
110
115
 
116
+ def sort_method?(node)
117
+ SORT_METHODS.include?(node.method_name)
118
+ end
119
+
120
+ def offense_range(sort_node, ancestor)
121
+ range_between(sort_node.loc.selector.begin_pos, ancestor.loc.expression.end_pos)
122
+ end
123
+
111
124
  def message(node, sorter, accessor)
112
125
  accessor_source = range_between(
113
126
  node.loc.selector.begin_pos,
@@ -135,9 +148,10 @@ module RuboCop
135
148
  end
136
149
 
137
150
  def suffix(sorter)
138
- if sorter == :sort
151
+ case sorter
152
+ when :sort
139
153
  ''
140
- elsif sorter == :sort_by
154
+ when :sort_by
141
155
  '_by'
142
156
  end
143
157
  end
@@ -81,23 +81,24 @@ module RuboCop
81
81
  # @example AllowInnerSlashes: true
82
82
  # # good
83
83
  # x =~ /home\//
84
- class RegexpLiteral < Cop
84
+ class RegexpLiteral < Base
85
85
  include ConfigurableEnforcedStyle
86
86
  include RangeHelp
87
+ extend AutoCorrector
87
88
 
88
89
  MSG_USE_SLASHES = 'Use `//` around regular expression.'
89
90
  MSG_USE_PERCENT_R = 'Use `%r` around regular expression.'
90
91
 
91
92
  def on_regexp(node)
92
- if slash_literal?(node)
93
- check_slash_literal(node)
94
- else
95
- check_percent_r_literal(node)
96
- end
97
- end
93
+ message = if slash_literal?(node)
94
+ MSG_USE_PERCENT_R unless allowed_slash_literal?(node)
95
+ else
96
+ MSG_USE_SLASHES unless allowed_percent_r_literal?(node)
97
+ end
98
+
99
+ return unless message
98
100
 
99
- def autocorrect(node)
100
- lambda do |corrector|
101
+ add_offense(node, message: message) do |corrector|
101
102
  correct_delimiters(node, corrector)
102
103
  correct_inner_slashes(node, corrector)
103
104
  end
@@ -105,18 +106,6 @@ module RuboCop
105
106
 
106
107
  private
107
108
 
108
- def check_slash_literal(node)
109
- return if allowed_slash_literal?(node)
110
-
111
- add_offense(node, message: MSG_USE_PERCENT_R)
112
- end
113
-
114
- def check_percent_r_literal(node)
115
- return if allowed_percent_r_literal?(node)
116
-
117
- add_offense(node, message: MSG_USE_SLASHES)
118
- end
119
-
120
109
  def allowed_slash_literal?(node)
121
110
  style == :slashes && !contains_disallowed_slash?(node) ||
122
111
  allowed_mixed_slash?(node)
@@ -52,20 +52,40 @@ module RuboCop
52
52
  end
53
53
 
54
54
  def autocorrect(node)
55
+ parenthesized = parenthesized?(node)
56
+ lambda do |corrector|
57
+ corrector.replace(node, corrected_block(node, parenthesized))
58
+ ParenthesesCorrector.correct(corrector, node.parent) if parenthesized
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def parenthesized?(node)
65
+ node.parent && parentheses?(node.parent)
66
+ end
67
+
68
+ def corrected_block(node, parenthesized)
55
69
  operation, rescue_modifier, = *node
56
70
  *_, rescue_args = *rescue_modifier
57
71
 
58
- indent = indentation(node)
59
- correction =
60
- "begin\n" \
61
- "#{operation.source.gsub(/^/, indent)}" \
62
- "\n#{offset(node)}rescue\n" \
63
- "#{rescue_args.source.gsub(/^/, indent)}" \
64
- "\n#{offset(node)}end"
72
+ node_indentation, node_offset = indentation_and_offset(node, parenthesized)
65
73
 
66
- lambda do |corrector|
67
- corrector.replace(node, correction)
74
+ "begin\n" \
75
+ "#{operation.source.gsub(/^/, node_indentation)}" \
76
+ "\n#{node_offset}rescue\n" \
77
+ "#{rescue_args.source.gsub(/^/, node_indentation)}" \
78
+ "\n#{node_offset}end"
79
+ end
80
+
81
+ def indentation_and_offset(node, parenthesized)
82
+ node_indentation = indentation(node)
83
+ node_offset = offset(node)
84
+ if parenthesized
85
+ node_indentation = node_indentation[0...-1]
86
+ node_offset = node_offset[0...-1]
68
87
  end
88
+ [node_indentation, node_offset]
69
89
  end
70
90
  end
71
91
  end
@@ -28,8 +28,9 @@ module RuboCop
28
28
  # def foo(arg)
29
29
  # return nil if arg
30
30
  # end
31
- class ReturnNil < Cop
31
+ class ReturnNil < Base
32
32
  include ConfigurableEnforcedStyle
33
+ extend AutoCorrector
33
34
 
34
35
  RETURN_MSG = 'Use `return` instead of `return nil`.'
35
36
  RETURN_NIL_MSG = 'Use `return nil` instead of `return`.'
@@ -54,12 +55,11 @@ module RuboCop
54
55
  return nil if chained_send?(send_node)
55
56
  end
56
57
 
57
- add_offense(node) unless correct_style?(node)
58
- end
58
+ return if correct_style?(node)
59
59
 
60
- def autocorrect(node)
61
- lambda do |corrector|
60
+ add_offense(node) do |corrector|
62
61
  corrected = style == :return ? 'return' : 'return nil'
62
+
63
63
  corrector.replace(node, corrected)
64
64
  end
65
65
  end
@@ -58,9 +58,10 @@ module RuboCop
58
58
  # foo.baz = bar if foo
59
59
  # foo.baz + bar if foo
60
60
  # foo.bar > 2 if foo
61
- class SafeNavigation < Cop
61
+ class SafeNavigation < Base
62
62
  include NilMethods
63
63
  include RangeHelp
64
+ extend AutoCorrector
64
65
 
65
66
  MSG = 'Use safe navigation (`&.`) instead of checking if an object ' \
66
67
  'exists before calling the method.'
@@ -104,29 +105,29 @@ module RuboCop
104
105
  return if chain_size(method_chain, method) > 1
105
106
  return if unsafe_method_used?(method_chain, method)
106
107
 
107
- add_offense(node)
108
+ add_offense(node) do |corrector|
109
+ autocorrect(corrector, node)
110
+ end
108
111
  end
109
112
 
110
113
  def use_var_only_in_unless_modifier?(node, variable)
111
114
  node.if_type? && node.unless? && !method_called?(variable)
112
115
  end
113
116
 
114
- def autocorrect(node)
117
+ private
118
+
119
+ def autocorrect(corrector, node)
115
120
  body = node.node_parts[1]
116
121
  method_call = method_call(node)
117
122
 
118
- lambda do |corrector|
119
- corrector.remove(begin_range(node, body))
120
- corrector.remove(end_range(node, body))
121
- corrector.insert_before(method_call.loc.dot, '&')
122
- handle_comments(corrector, node, method_call)
123
+ corrector.remove(begin_range(node, body))
124
+ corrector.remove(end_range(node, body))
125
+ corrector.insert_before(method_call.loc.dot, '&')
126
+ handle_comments(corrector, node, method_call)
123
127
 
124
- add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
125
- end
128
+ add_safe_nav_to_all_methods_in_chain(corrector, method_call, body)
126
129
  end
127
130
 
128
- private
129
-
130
131
  def handle_comments(corrector, node, method_call)
131
132
  comments = comments(node)
132
133
  return if comments.empty?
@@ -136,10 +137,10 @@ module RuboCop
136
137
  end
137
138
 
138
139
  def comments(node)
139
- processed_source.comments.select do |comment|
140
- comment.loc.first_line > node.loc.first_line &&
141
- comment.loc.last_line < node.loc.last_line
142
- end
140
+ processed_source.each_comment_in_lines(
141
+ node.loc.first_line...
142
+ node.loc.last_line
143
+ ).to_a
143
144
  end
144
145
 
145
146
  def allowed_if_condition?(node)
@@ -27,7 +27,9 @@ module RuboCop
27
27
  # [1, 2, 3].shuffle[1..3] # sample(3) might return a longer Array
28
28
  # [1, 2, 3].shuffle[foo, bar]
29
29
  # [1, 2, 3].shuffle(random: Random.new)
30
- class Sample < Cop
30
+ class Sample < Base
31
+ extend AutoCorrector
32
+
31
33
  MSG = 'Use `%<correct>s` instead of `%<incorrect>s`.'
32
34
 
33
35
  def_node_matcher :sample_candidate?, <<~PATTERN
@@ -35,22 +37,17 @@ module RuboCop
35
37
  PATTERN
36
38
 
37
39
  def on_send(node)
38
- sample_candidate?(node) do |shuffle, shuffle_arg, method, method_args|
40
+ sample_candidate?(node) do |shuffle_node, shuffle_arg, method, method_args|
39
41
  return unless offensive?(method, method_args)
40
42
 
41
- range = source_range(shuffle, node)
43
+ range = source_range(shuffle_node, node)
42
44
  message = message(shuffle_arg, method, method_args, range)
43
- add_offense(node, location: range, message: message)
44
- end
45
- end
46
-
47
- def autocorrect(node)
48
- shuffle_node, shuffle_arg, method, method_args =
49
- sample_candidate?(node)
50
45
 
51
- lambda do |corrector|
52
- corrector.replace(source_range(shuffle_node, node),
53
- correction(shuffle_arg, method, method_args))
46
+ add_offense(range, message: message) do |corrector|
47
+ corrector.replace(
48
+ source_range(shuffle_node, node), correction(shuffle_arg, method, method_args)
49
+ )
50
+ end
54
51
  end
55
52
  end
56
53
 
@@ -12,7 +12,9 @@ module RuboCop
12
12
  #
13
13
  # # good
14
14
  # x += 1
15
- class SelfAssignment < Cop
15
+ class SelfAssignment < Base
16
+ extend AutoCorrector
17
+
16
18
  MSG = 'Use self-assignment shorthand `%<method>s=`.'
17
19
  OPS = %i[+ - * ** / | &].freeze
18
20
 
@@ -32,16 +34,6 @@ module RuboCop
32
34
  check(node, :cvar)
33
35
  end
34
36
 
35
- def autocorrect(node)
36
- _var_name, rhs = *node
37
-
38
- if rhs.send_type?
39
- autocorrect_send_node(node, rhs)
40
- elsif %i[and or].include?(rhs.type)
41
- autocorrect_boolean_node(node, rhs)
42
- end
43
- end
44
-
45
37
  private
46
38
 
47
39
  def check(node, var_type)
@@ -62,7 +54,9 @@ module RuboCop
62
54
  target_node = s(var_type, var_name)
63
55
  return unless receiver == target_node
64
56
 
65
- add_offense(node, message: format(MSG, method: method_name))
57
+ add_offense(node, message: format(MSG, method: method_name)) do |corrector|
58
+ autocorrect(corrector, node)
59
+ end
66
60
  end
67
61
 
68
62
  def check_boolean_node(node, rhs, var_name, var_type)
@@ -72,24 +66,34 @@ module RuboCop
72
66
  return unless first_operand == target_node
73
67
 
74
68
  operator = rhs.loc.operator.source
75
- add_offense(node, message: format(MSG, method: operator))
69
+ add_offense(node, message: format(MSG, method: operator)) do |corrector|
70
+ autocorrect(corrector, node)
71
+ end
76
72
  end
77
73
 
78
- def autocorrect_send_node(node, rhs)
74
+ def autocorrect(corrector, node)
75
+ _var_name, rhs = *node
76
+
77
+ if rhs.send_type?
78
+ autocorrect_send_node(corrector, node, rhs)
79
+ elsif %i[and or].include?(rhs.type)
80
+ autocorrect_boolean_node(corrector, node, rhs)
81
+ end
82
+ end
83
+
84
+ def autocorrect_send_node(corrector, node, rhs)
79
85
  _receiver, method_name, args = *rhs
80
- apply_autocorrect(node, rhs, method_name.to_s, args)
86
+ apply_autocorrect(corrector, node, rhs, method_name.to_s, args)
81
87
  end
82
88
 
83
- def autocorrect_boolean_node(node, rhs)
89
+ def autocorrect_boolean_node(corrector, node, rhs)
84
90
  _first_operand, second_operand = *rhs
85
- apply_autocorrect(node, rhs, rhs.loc.operator.source, second_operand)
91
+ apply_autocorrect(corrector, node, rhs, rhs.loc.operator.source, second_operand)
86
92
  end
87
93
 
88
- def apply_autocorrect(node, rhs, operator, new_rhs)
89
- lambda do |corrector|
90
- corrector.insert_before(node.loc.operator, operator)
91
- corrector.replace(rhs, new_rhs.source)
92
- end
94
+ def apply_autocorrect(corrector, node, rhs, operator, new_rhs)
95
+ corrector.insert_before(node.loc.operator, operator)
96
+ corrector.replace(rhs, new_rhs.source)
93
97
  end
94
98
  end
95
99
  end
@@ -26,12 +26,13 @@ module RuboCop
26
26
  # @example AllowAsExpressionSeparator: true
27
27
  # # good
28
28
  # foo = 1; bar = 2
29
- class Semicolon < Cop
29
+ class Semicolon < Base
30
30
  include RangeHelp
31
+ extend AutoCorrector
31
32
 
32
33
  MSG = 'Do not use semicolons to terminate expressions.'
33
34
 
34
- def investigate(processed_source)
35
+ def on_new_investigation
35
36
  return if processed_source.blank?
36
37
 
37
38
  @processed_source = processed_source
@@ -66,12 +67,6 @@ module RuboCop
66
67
  end
67
68
  end
68
69
 
69
- def autocorrect(range)
70
- return unless range
71
-
72
- ->(corrector) { corrector.remove(range) }
73
- end
74
-
75
70
  private
76
71
 
77
72
  def check_for_line_terminator_or_opener
@@ -93,7 +88,9 @@ module RuboCop
93
88
  range = source_range(@processed_source.buffer, line, column)
94
89
  # Don't attempt to autocorrect if semicolon is separating statements
95
90
  # on the same line
96
- add_offense(autocorrect ? range : nil, location: range)
91
+ add_offense(range) do |corrector|
92
+ corrector.remove(range) if autocorrect
93
+ end
97
94
  end
98
95
  end
99
96
  end
@@ -13,7 +13,7 @@ module RuboCop
13
13
  # # good
14
14
  # Foo.__send__(:bar)
15
15
  # quuz.public_send(:fred)
16
- class Send < Cop
16
+ class Send < Base
17
17
  MSG = 'Prefer `Object#__send__` or `Object#public_send` to ' \
18
18
  '`send`.'
19
19
 
@@ -22,7 +22,7 @@ module RuboCop
22
22
  def on_send(node)
23
23
  return unless sending?(node) && node.arguments?
24
24
 
25
- add_offense(node, location: :selector)
25
+ add_offense(node.loc.selector)
26
26
  end
27
27
  alias on_csend on_send
28
28
  end
@@ -104,8 +104,9 @@ module RuboCop
104
104
  #
105
105
  # explicit_receiver.fail
106
106
  # explicit_receiver.raise
107
- class SignalException < Cop
107
+ class SignalException < Base
108
108
  include ConfigurableEnforcedStyle
109
+ extend AutoCorrector
109
110
 
110
111
  FAIL_MSG = 'Use `fail` instead of `raise` to signal exceptions.'
111
112
  RAISE_MSG = 'Use `raise` instead of `fail` to ' \
@@ -115,7 +116,7 @@ module RuboCop
115
116
  def_node_search :custom_fail_methods,
116
117
  '{(def :fail ...) (defs _ :fail ...)}'
117
118
 
118
- def investigate(processed_source)
119
+ def on_new_investigation
119
120
  ast = processed_source.ast
120
121
  @custom_fail_defined = ast && custom_fail_methods(ast).any?
121
122
  end
@@ -145,20 +146,6 @@ module RuboCop
145
146
  end
146
147
  end
147
148
 
148
- def autocorrect(node)
149
- lambda do |corrector|
150
- name =
151
- case style
152
- when :semantic
153
- command_or_kernel_call?(:raise, node) ? 'fail' : 'raise'
154
- when :only_raise then 'raise'
155
- when :only_fail then 'fail'
156
- end
157
-
158
- corrector.replace(node.loc.selector, name)
159
- end
160
- end
161
-
162
149
  private
163
150
 
164
151
  def message(method_name)
@@ -178,8 +165,9 @@ module RuboCop
178
165
  each_command_or_kernel_call(method_name, node) do |send_node|
179
166
  next if ignored_node?(send_node)
180
167
 
181
- add_offense(send_node,
182
- location: :selector, message: message(method_name))
168
+ add_offense(send_node.loc.selector, message: message(method_name)) do |corrector|
169
+ autocorrect(corrector, send_node)
170
+ end
183
171
  ignore_node(send_node)
184
172
  end
185
173
  end
@@ -187,10 +175,26 @@ module RuboCop
187
175
  def check_send(method_name, node)
188
176
  return unless node && command_or_kernel_call?(method_name, node)
189
177
 
190
- add_offense(node, location: :selector, message: message(method_name))
178
+ add_offense(node.loc.selector, message: message(method_name)) do |corrector|
179
+ autocorrect(corrector, node)
180
+ end
181
+ end
182
+
183
+ def autocorrect(corrector, node)
184
+ name =
185
+ case style
186
+ when :semantic
187
+ command_or_kernel_call?(:raise, node) ? 'fail' : 'raise'
188
+ when :only_raise then 'raise'
189
+ when :only_fail then 'fail'
190
+ end
191
+
192
+ corrector.replace(node.loc.selector, name)
191
193
  end
192
194
 
193
195
  def command_or_kernel_call?(name, node)
196
+ return unless node.method?(name)
197
+
194
198
  node.command?(name) || kernel_call?(node, name)
195
199
  end
196
200