rubocop 0.89.0 → 0.92.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 (416) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/config/default.yml +128 -14
  4. data/lib/rubocop.rb +30 -4
  5. data/lib/rubocop/cached_data.rb +1 -0
  6. data/lib/rubocop/cli/command.rb +1 -0
  7. data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
  8. data/lib/rubocop/cli/command/base.rb +1 -0
  9. data/lib/rubocop/cli/command/execute_runner.rb +9 -0
  10. data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
  11. data/lib/rubocop/cli/command/show_cops.rb +2 -1
  12. data/lib/rubocop/cli/command/version.rb +1 -0
  13. data/lib/rubocop/cli/environment.rb +1 -0
  14. data/lib/rubocop/comment_config.rb +17 -10
  15. data/lib/rubocop/config.rb +1 -1
  16. data/lib/rubocop/config_loader.rb +21 -10
  17. data/lib/rubocop/config_loader_resolver.rb +1 -0
  18. data/lib/rubocop/config_obsoletion.rb +1 -0
  19. data/lib/rubocop/config_regeneration.rb +33 -0
  20. data/lib/rubocop/config_store.rb +3 -3
  21. data/lib/rubocop/config_validator.rb +4 -1
  22. data/lib/rubocop/cop/base.rb +23 -0
  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 -7
  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 +4 -4
  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 +5 -10
  34. data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
  35. data/lib/rubocop/cop/documentation.rb +22 -0
  36. data/lib/rubocop/cop/generator.rb +2 -1
  37. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +1 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -0
  39. data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +1 -0
  40. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
  41. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -0
  42. data/lib/rubocop/cop/layout/array_alignment.rb +1 -0
  43. data/lib/rubocop/cop/layout/begin_end_alignment.rb +77 -0
  44. data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
  45. data/lib/rubocop/cop/layout/case_indentation.rb +4 -7
  46. data/lib/rubocop/cop/layout/class_structure.rb +14 -17
  47. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
  48. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/condition_position.rb +13 -15
  50. data/lib/rubocop/cop/layout/def_end_alignment.rb +8 -5
  51. data/lib/rubocop/cop/layout/dot_position.rb +21 -17
  52. data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
  53. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +21 -18
  54. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
  55. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +136 -0
  56. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
  57. data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
  58. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +18 -14
  59. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
  60. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +4 -7
  61. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
  62. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
  63. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
  64. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -7
  65. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
  66. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
  67. data/lib/rubocop/cop/layout/end_alignment.rb +11 -17
  68. data/lib/rubocop/cop/layout/extra_spacing.rb +14 -21
  69. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
  70. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
  71. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
  72. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
  73. data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
  74. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
  75. data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
  76. data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
  77. data/lib/rubocop/cop/layout/leading_comment_space.rb +12 -10
  78. data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
  79. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
  80. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
  81. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
  82. data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
  83. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
  84. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
  85. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
  86. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
  87. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
  88. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +41 -22
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
  90. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
  92. data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
  93. data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
  94. data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +22 -17
  95. data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
  96. data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
  97. data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
  98. data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
  99. data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
  100. data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
  101. data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
  102. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
  103. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +20 -23
  104. data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
  105. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
  106. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +19 -37
  107. data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
  108. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
  109. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
  110. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +16 -24
  111. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +12 -13
  112. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
  113. data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
  114. data/lib/rubocop/cop/lint/ambiguous_operator.rb +2 -0
  115. data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -2
  116. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -1
  117. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +74 -0
  118. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  119. data/lib/rubocop/cop/lint/debugger.rb +2 -3
  120. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -3
  121. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -4
  122. data/lib/rubocop/cop/lint/duplicate_require.rb +46 -0
  123. data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +2 -15
  124. data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
  125. data/lib/rubocop/cop/lint/empty_file.rb +50 -0
  126. data/lib/rubocop/cop/lint/erb_new_arguments.rb +2 -0
  127. data/lib/rubocop/cop/lint/float_comparison.rb +2 -2
  128. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  129. data/lib/rubocop/cop/lint/identity_comparison.rb +51 -0
  130. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +2 -5
  131. data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
  132. data/lib/rubocop/cop/lint/missing_super.rb +11 -11
  133. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
  134. data/lib/rubocop/cop/lint/multiple_comparison.rb +3 -1
  135. data/lib/rubocop/cop/lint/number_conversion.rb +1 -0
  136. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +33 -15
  137. data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
  138. data/lib/rubocop/cop/lint/raise_exception.rb +1 -0
  139. data/lib/rubocop/cop/lint/rand_one.rb +2 -1
  140. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +36 -29
  141. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +14 -4
  142. data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
  143. data/lib/rubocop/cop/lint/rescue_type.rb +0 -1
  144. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -1
  145. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -6
  146. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
  147. data/lib/rubocop/cop/lint/struct_new_override.rb +1 -0
  148. data/lib/rubocop/cop/lint/to_json.rb +16 -5
  149. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  150. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
  151. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -6
  152. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +3 -1
  153. data/lib/rubocop/cop/lint/uri_regexp.rb +10 -25
  154. data/lib/rubocop/cop/lint/useless_access_modifier.rb +3 -9
  155. data/lib/rubocop/cop/lint/useless_method_definition.rb +70 -0
  156. data/lib/rubocop/cop/lint/useless_times.rb +106 -0
  157. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +27 -16
  158. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
  159. data/lib/rubocop/cop/migration/department_name.rb +2 -2
  160. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  161. data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
  162. data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
  163. data/lib/rubocop/cop/mixin/check_line_breakable.rb +17 -8
  164. data/lib/rubocop/cop/mixin/comments_help.rb +48 -0
  165. data/lib/rubocop/cop/mixin/configurable_naming.rb +2 -2
  166. data/lib/rubocop/cop/mixin/configurable_numbering.rb +3 -3
  167. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
  168. data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
  169. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +12 -1
  170. data/lib/rubocop/cop/mixin/enforce_superclass.rb +0 -2
  171. data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
  172. data/lib/rubocop/cop/mixin/hash_transform_method.rb +31 -12
  173. data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
  174. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
  175. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +13 -12
  176. data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
  177. data/lib/rubocop/cop/mixin/percent_array.rb +16 -9
  178. data/lib/rubocop/cop/mixin/range_help.rb +18 -4
  179. data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
  180. data/lib/rubocop/cop/mixin/rescue_node.rb +11 -1
  181. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
  182. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
  183. data/lib/rubocop/cop/mixin/statement_modifier.rb +12 -6
  184. data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
  185. data/lib/rubocop/cop/mixin/trailing_comma.rb +9 -11
  186. data/lib/rubocop/cop/mixin/visibility_help.rb +4 -16
  187. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  188. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  189. data/lib/rubocop/cop/offense.rb +1 -0
  190. data/lib/rubocop/cop/security/eval.rb +1 -0
  191. data/lib/rubocop/cop/security/json_load.rb +1 -0
  192. data/lib/rubocop/cop/security/marshal_load.rb +1 -0
  193. data/lib/rubocop/cop/security/open.rb +1 -0
  194. data/lib/rubocop/cop/security/yaml_load.rb +1 -0
  195. data/lib/rubocop/cop/severity.rb +0 -8
  196. data/lib/rubocop/cop/style/access_modifier_declarations.rb +8 -19
  197. data/lib/rubocop/cop/style/accessor_grouping.rb +20 -20
  198. data/lib/rubocop/cop/style/alias.rb +36 -33
  199. data/lib/rubocop/cop/style/and_or.rb +9 -11
  200. data/lib/rubocop/cop/style/array_coercion.rb +4 -0
  201. data/lib/rubocop/cop/style/array_join.rb +7 -8
  202. data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
  203. data/lib/rubocop/cop/style/attr.rb +12 -9
  204. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +4 -5
  205. data/lib/rubocop/cop/style/bare_percent_literals.rb +10 -12
  206. data/lib/rubocop/cop/style/begin_block.rb +2 -2
  207. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +9 -12
  208. data/lib/rubocop/cop/style/block_comments.rb +14 -18
  209. data/lib/rubocop/cop/style/block_delimiters.rb +23 -23
  210. data/lib/rubocop/cop/style/case_equality.rb +11 -3
  211. data/lib/rubocop/cop/style/case_like_if.rb +37 -18
  212. data/lib/rubocop/cop/style/class_and_module_children.rb +16 -11
  213. data/lib/rubocop/cop/style/class_check.rb +6 -11
  214. data/lib/rubocop/cop/style/class_methods.rb +7 -11
  215. data/lib/rubocop/cop/style/class_methods_definitions.rb +157 -0
  216. data/lib/rubocop/cop/style/class_vars.rb +7 -12
  217. data/lib/rubocop/cop/style/collection_methods.rb +11 -17
  218. data/lib/rubocop/cop/style/colon_method_call.rb +6 -7
  219. data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
  220. data/lib/rubocop/cop/style/combinable_loops.rb +84 -0
  221. data/lib/rubocop/cop/style/command_literal.rb +23 -24
  222. data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
  223. data/lib/rubocop/cop/style/commented_keyword.rb +8 -9
  224. data/lib/rubocop/cop/style/conditional_assignment.rb +50 -61
  225. data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
  226. data/lib/rubocop/cop/style/copyright.rb +12 -12
  227. data/lib/rubocop/cop/style/date_time.rb +13 -2
  228. data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
  229. data/lib/rubocop/cop/style/dir.rb +8 -10
  230. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +7 -9
  231. data/lib/rubocop/cop/style/documentation.rb +2 -4
  232. data/lib/rubocop/cop/style/documentation_method.rb +1 -1
  233. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
  234. data/lib/rubocop/cop/style/double_negation.rb +3 -2
  235. data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
  236. data/lib/rubocop/cop/style/each_with_object.rb +16 -17
  237. data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
  238. data/lib/rubocop/cop/style/empty_case_condition.rb +19 -20
  239. data/lib/rubocop/cop/style/empty_else.rb +17 -19
  240. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
  241. data/lib/rubocop/cop/style/empty_literal.rb +18 -17
  242. data/lib/rubocop/cop/style/empty_method.rb +5 -8
  243. data/lib/rubocop/cop/style/encoding.rb +5 -9
  244. data/lib/rubocop/cop/style/end_block.rb +4 -6
  245. data/lib/rubocop/cop/style/eval_with_location.rb +6 -10
  246. data/lib/rubocop/cop/style/even_odd.rb +8 -11
  247. data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -26
  248. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  249. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  250. data/lib/rubocop/cop/style/float_division.rb +3 -1
  251. data/lib/rubocop/cop/style/for.rb +11 -15
  252. data/lib/rubocop/cop/style/format_string.rb +18 -23
  253. data/lib/rubocop/cop/style/format_string_token.rb +4 -7
  254. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +19 -41
  255. data/lib/rubocop/cop/style/global_vars.rb +2 -2
  256. data/lib/rubocop/cop/style/guard_clause.rb +4 -4
  257. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +24 -5
  258. data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
  259. data/lib/rubocop/cop/style/hash_syntax.rb +6 -7
  260. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -11
  261. data/lib/rubocop/cop/style/hash_transform_values.rb +18 -10
  262. data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -1
  263. data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
  264. data/lib/rubocop/cop/style/if_unless_modifier.rb +11 -17
  265. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -7
  266. data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
  267. data/lib/rubocop/cop/style/implicit_runtime_error.rb +2 -1
  268. data/lib/rubocop/cop/style/infinite_loop.rb +23 -23
  269. data/lib/rubocop/cop/style/inline_comment.rb +3 -3
  270. data/lib/rubocop/cop/style/inverse_methods.rb +20 -29
  271. data/lib/rubocop/cop/style/keyword_parameters_order.rb +53 -0
  272. data/lib/rubocop/cop/style/lambda.rb +7 -12
  273. data/lib/rubocop/cop/style/lambda_call.rb +17 -14
  274. data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
  275. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
  276. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +11 -11
  277. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
  278. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +7 -6
  279. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +12 -3
  280. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
  281. data/lib/rubocop/cop/style/min_max.rb +8 -12
  282. data/lib/rubocop/cop/style/missing_else.rb +13 -13
  283. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -1
  284. data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
  285. data/lib/rubocop/cop/style/mixin_usage.rb +9 -28
  286. data/lib/rubocop/cop/style/module_function.rb +10 -13
  287. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -2
  288. data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
  289. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -10
  290. data/lib/rubocop/cop/style/multiline_memoization.rb +12 -10
  291. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
  292. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -6
  293. data/lib/rubocop/cop/style/multiline_when_then.rb +10 -11
  294. data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
  295. data/lib/rubocop/cop/style/mutable_constant.rb +23 -20
  296. data/lib/rubocop/cop/style/negated_if.rb +6 -6
  297. data/lib/rubocop/cop/style/negated_unless.rb +6 -6
  298. data/lib/rubocop/cop/style/negated_while.rb +7 -15
  299. data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
  300. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +14 -12
  301. data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
  302. data/lib/rubocop/cop/style/next.rb +10 -14
  303. data/lib/rubocop/cop/style/nil_comparison.rb +13 -11
  304. data/lib/rubocop/cop/style/non_nil_check.rb +34 -26
  305. data/lib/rubocop/cop/style/not.rb +20 -26
  306. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
  307. data/lib/rubocop/cop/style/numeric_predicate.rb +5 -14
  308. data/lib/rubocop/cop/style/one_line_conditional.rb +73 -23
  309. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  310. data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
  311. data/lib/rubocop/cop/style/optional_boolean_parameter.rb +12 -1
  312. data/lib/rubocop/cop/style/or_assignment.rb +13 -10
  313. data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
  314. data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
  315. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
  316. data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
  317. data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
  318. data/lib/rubocop/cop/style/preferred_hash_methods.rb +11 -14
  319. data/lib/rubocop/cop/style/proc.rb +6 -6
  320. data/lib/rubocop/cop/style/raise_args.rb +15 -24
  321. data/lib/rubocop/cop/style/random_with_offset.rb +19 -19
  322. data/lib/rubocop/cop/style/redundant_assignment.rb +8 -18
  323. data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
  324. data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
  325. data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
  326. data/lib/rubocop/cop/style/redundant_conditional.rb +4 -5
  327. data/lib/rubocop/cop/style/redundant_exception.rb +1 -3
  328. data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
  329. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -8
  330. data/lib/rubocop/cop/style/redundant_freeze.rb +5 -7
  331. data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
  332. data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -15
  333. data/lib/rubocop/cop/style/redundant_percent_q.rb +9 -11
  334. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
  335. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
  336. data/lib/rubocop/cop/style/redundant_return.rb +17 -17
  337. data/lib/rubocop/cop/style/redundant_self.rb +9 -11
  338. data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
  339. data/lib/rubocop/cop/style/redundant_sort.rb +12 -31
  340. data/lib/rubocop/cop/style/redundant_sort_by.rb +5 -9
  341. data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
  342. data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
  343. data/lib/rubocop/cop/style/rescue_standard_error.rb +20 -16
  344. data/lib/rubocop/cop/style/return_nil.rb +5 -5
  345. data/lib/rubocop/cop/style/safe_navigation.rb +22 -16
  346. data/lib/rubocop/cop/style/sample.rb +12 -14
  347. data/lib/rubocop/cop/style/self_assignment.rb +26 -22
  348. data/lib/rubocop/cop/style/semicolon.rb +6 -9
  349. data/lib/rubocop/cop/style/send.rb +4 -5
  350. data/lib/rubocop/cop/style/signal_exception.rb +23 -19
  351. data/lib/rubocop/cop/style/single_argument_dig.rb +1 -0
  352. data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
  353. data/lib/rubocop/cop/style/single_line_methods.rb +18 -17
  354. data/lib/rubocop/cop/style/slicing_with_range.rb +6 -8
  355. data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
  356. data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
  357. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
  358. data/lib/rubocop/cop/style/stderr_puts.rb +5 -6
  359. data/lib/rubocop/cop/style/string_concatenation.rb +16 -2
  360. data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
  361. data/lib/rubocop/cop/style/string_methods.rb +7 -17
  362. data/lib/rubocop/cop/style/strip.rb +9 -14
  363. data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
  364. data/lib/rubocop/cop/style/symbol_array.rb +5 -16
  365. data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
  366. data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
  367. data/lib/rubocop/cop/style/ternary_parentheses.rb +22 -22
  368. data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
  369. data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
  370. data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
  371. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
  372. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
  373. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +11 -9
  374. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
  375. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
  376. data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
  377. data/lib/rubocop/cop/style/unless_else.rb +5 -8
  378. data/lib/rubocop/cop/style/unpack_first.rb +5 -8
  379. data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
  380. data/lib/rubocop/cop/style/when_then.rb +4 -6
  381. data/lib/rubocop/cop/style/while_until_do.rb +6 -16
  382. data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
  383. data/lib/rubocop/cop/style/word_array.rb +5 -23
  384. data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
  385. data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -18
  386. data/lib/rubocop/cop/team.rb +1 -0
  387. data/lib/rubocop/cop/util.rb +2 -1
  388. data/lib/rubocop/cop/utils/format_string.rb +3 -5
  389. data/lib/rubocop/cop/variable_force.rb +2 -0
  390. data/lib/rubocop/cops_documentation_generator.rb +5 -3
  391. data/lib/rubocop/core_ext/string.rb +2 -2
  392. data/lib/rubocop/directive_comment.rb +32 -0
  393. data/lib/rubocop/ext/regexp_node.rb +46 -0
  394. data/lib/rubocop/file_finder.rb +1 -0
  395. data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
  396. data/lib/rubocop/formatter/disabled_config_formatter.rb +13 -6
  397. data/lib/rubocop/formatter/html_formatter.rb +2 -0
  398. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  399. data/lib/rubocop/formatter/progress_formatter.rb +2 -1
  400. data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
  401. data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
  402. data/lib/rubocop/name_similarity.rb +1 -0
  403. data/lib/rubocop/options.rb +43 -20
  404. data/lib/rubocop/remote_config.rb +1 -0
  405. data/lib/rubocop/result_cache.rb +31 -13
  406. data/lib/rubocop/rspec/cop_helper.rb +4 -1
  407. data/lib/rubocop/rspec/expect_offense.rb +14 -9
  408. data/lib/rubocop/rspec/shared_contexts.rb +13 -5
  409. data/lib/rubocop/runner.rb +35 -15
  410. data/lib/rubocop/string_interpreter.rb +3 -0
  411. data/lib/rubocop/target_finder.rb +5 -1
  412. data/lib/rubocop/target_ruby.rb +7 -1
  413. data/lib/rubocop/version.rb +7 -1
  414. data/lib/rubocop/yaml_duplication_checker.rb +1 -0
  415. metadata +26 -14
  416. data/lib/rubocop/cop/tokens_util.rb +0 -84
@@ -24,8 +24,9 @@ module RuboCop
24
24
  #
25
25
  # # good
26
26
  # x != y
27
- class RedundantConditional < Cop
27
+ class RedundantConditional < Base
28
28
  include Alignment
29
+ extend AutoCorrector
29
30
 
30
31
  operators = RuboCop::AST::Node::COMPARISON_OPERATORS.to_a
31
32
  COMPARISON_OPERATOR_MATCHER = "{:#{operators.join(' :')}}"
@@ -36,11 +37,9 @@ module RuboCop
36
37
  def on_if(node)
37
38
  return unless offense?(node)
38
39
 
39
- add_offense(node)
40
- end
40
+ message = message(node)
41
41
 
42
- def autocorrect(node)
43
- lambda do |corrector|
42
+ add_offense(node, message: message) do |corrector|
44
43
  corrector.replace(node, replacement_condition(node))
45
44
  end
46
45
  end
@@ -23,13 +23,11 @@ module RuboCop
23
23
  MSG_2 = 'Redundant `RuntimeError.new` call can be replaced with ' \
24
24
  'just the message.'
25
25
 
26
- RAISE_METHODS = %i[raise fail].freeze
26
+ RESTRICT_ON_SEND = %i[raise fail].freeze
27
27
 
28
28
  # Switch `raise RuntimeError, 'message'` to `raise 'message'`, and
29
29
  # `raise RuntimeError.new('message')` to `raise 'message'`.
30
30
  def on_send(node)
31
- return unless RAISE_METHODS.include?(node.method_name)
32
-
33
31
  fix_exploded(node) || fix_compact(node)
34
32
  end
35
33
 
@@ -31,9 +31,10 @@ module RuboCop
31
31
  # # good
32
32
  # ENV.fetch(:key, VALUE)
33
33
  #
34
- class RedundantFetchBlock < Cop
34
+ class RedundantFetchBlock < Base
35
35
  include FrozenStringLiteral
36
36
  include RangeHelp
37
+ extend AutoCorrector
37
38
 
38
39
  MSG = 'Use `%<good>s` instead of `%<bad>s`.'
39
40
 
@@ -52,17 +53,7 @@ module RuboCop
52
53
  good = build_good_method(send, body)
53
54
  bad = build_bad_method(send, body)
54
55
 
55
- add_offense(
56
- node,
57
- location: range,
58
- message: format(MSG, good: good, bad: bad)
59
- )
60
- end
61
- end
62
-
63
- def autocorrect(node)
64
- redundant_fetch_block_candidate?(node) do |send, body|
65
- lambda do |corrector|
56
+ add_offense(range, message: format(MSG, good: good, bad: bad)) do |corrector|
66
57
  receiver, _, key = send.children
67
58
  default_value = body ? body.source : 'nil'
68
59
 
@@ -24,8 +24,11 @@ module RuboCop
24
24
  # require_relative '../foo'
25
25
  # require_relative '../foo.so'
26
26
  #
27
- class RedundantFileExtensionInRequire < Cop
27
+ class RedundantFileExtensionInRequire < Base
28
+ extend AutoCorrector
29
+
28
30
  MSG = 'Redundant `.rb` file extension detected.'
31
+ RESTRICT_ON_SEND = %i[require require_relative].freeze
29
32
 
30
33
  def_node_matcher :require_call?, <<~PATTERN
31
34
  (send nil? {:require :require_relative} $str_type?)
@@ -33,15 +36,13 @@ module RuboCop
33
36
 
34
37
  def on_send(node)
35
38
  require_call?(node) do |name_node|
36
- add_offense(name_node) if name_node.value.end_with?('.rb')
37
- end
38
- end
39
+ return unless name_node.value.end_with?('.rb')
39
40
 
40
- def autocorrect(node)
41
- correction = node.value.sub(/\.rb\z/, '')
41
+ add_offense(name_node) do |corrector|
42
+ correction = name_node.value.sub(/\.rb\z/, '')
42
43
 
43
- lambda do |corrector|
44
- corrector.replace(node, "'#{correction}'")
44
+ corrector.replace(name_node, "'#{correction}'")
45
+ end
45
46
  end
46
47
  end
47
48
  end
@@ -11,22 +11,20 @@ module RuboCop
11
11
  #
12
12
  # # good
13
13
  # CONST = 1
14
- class RedundantFreeze < Cop
14
+ class RedundantFreeze < Base
15
+ extend AutoCorrector
15
16
  include FrozenStringLiteral
16
17
 
17
18
  MSG = 'Do not freeze immutable objects, as freezing them has no ' \
18
19
  'effect.'
20
+ RESTRICT_ON_SEND = %i[freeze].freeze
19
21
 
20
22
  def on_send(node)
21
- return unless node.receiver && node.method?(:freeze) &&
23
+ return unless node.receiver &&
22
24
  (immutable_literal?(node.receiver) ||
23
25
  operation_produces_immutable_object?(node.receiver))
24
26
 
25
- add_offense(node)
26
- end
27
-
28
- def autocorrect(node)
29
- lambda do |corrector|
27
+ add_offense(node) do |corrector|
30
28
  corrector.remove(node.loc.dot)
31
29
  corrector.remove(node.loc.selector)
32
30
  end
@@ -15,8 +15,9 @@ module RuboCop
15
15
  #
16
16
  # # good if @var is already a String
17
17
  # @var
18
- class RedundantInterpolation < Cop
18
+ class RedundantInterpolation < Base
19
19
  include PercentLiteral
20
+ extend AutoCorrector
20
21
 
21
22
  MSG = 'Prefer `to_s` over string interpolation.'
22
23
 
@@ -25,18 +26,18 @@ module RuboCop
25
26
  end
26
27
 
27
28
  def on_dstr(node)
28
- add_offense(node) if single_interpolation?(node)
29
- end
30
-
31
- def autocorrect(node)
32
- embedded_node = node.children.first
33
-
34
- if variable_interpolation?(embedded_node)
35
- autocorrect_variable_interpolation(embedded_node, node)
36
- elsif single_variable_interpolation?(embedded_node)
37
- autocorrect_single_variable_interpolation(embedded_node, node)
38
- else
39
- autocorrect_other(embedded_node, node)
29
+ return unless single_interpolation?(node)
30
+
31
+ add_offense(node) do |corrector|
32
+ embedded_node = node.children.first
33
+
34
+ if variable_interpolation?(embedded_node)
35
+ autocorrect_variable_interpolation(corrector, embedded_node, node)
36
+ elsif single_variable_interpolation?(embedded_node)
37
+ autocorrect_single_variable_interpolation(corrector, embedded_node, node)
38
+ else
39
+ autocorrect_other(corrector, embedded_node, node)
40
+ end
40
41
  end
41
42
  end
42
43
 
@@ -70,27 +71,27 @@ module RuboCop
70
71
  percent_literal?(node.parent)
71
72
  end
72
73
 
73
- def autocorrect_variable_interpolation(embedded_node, node)
74
+ def autocorrect_variable_interpolation(corrector, embedded_node, node)
74
75
  replacement = "#{embedded_node.loc.expression.source}.to_s"
75
- ->(corrector) { corrector.replace(node, replacement) }
76
+
77
+ corrector.replace(node, replacement)
76
78
  end
77
79
 
78
- def autocorrect_single_variable_interpolation(embedded_node, node)
80
+ def autocorrect_single_variable_interpolation(corrector, embedded_node, node)
79
81
  variable_loc = embedded_node.children.first.loc
80
82
  replacement = "#{variable_loc.expression.source}.to_s"
81
- ->(corrector) { corrector.replace(node, replacement) }
83
+
84
+ corrector.replace(node, replacement)
82
85
  end
83
86
 
84
- def autocorrect_other(embedded_node, node)
87
+ def autocorrect_other(corrector, embedded_node, node)
85
88
  loc = node.loc
86
89
  embedded_loc = embedded_node.loc
87
90
 
88
- lambda do |corrector|
89
- corrector.replace(loc.begin, '')
90
- corrector.replace(loc.end, '')
91
- corrector.replace(embedded_loc.begin, '(')
92
- corrector.replace(embedded_loc.end, ').to_s')
93
- end
91
+ corrector.replace(loc.begin, '')
92
+ corrector.replace(loc.end, '')
93
+ corrector.replace(embedded_loc.begin, '(')
94
+ corrector.replace(embedded_loc.end, ').to_s')
94
95
  end
95
96
  end
96
97
  end
@@ -13,8 +13,9 @@ module RuboCop
13
13
  # # good
14
14
  # x if y.z.nil?
15
15
  #
16
- class RedundantParentheses < Cop
16
+ class RedundantParentheses < Base
17
17
  include Parentheses
18
+ extend AutoCorrector
18
19
 
19
20
  def_node_matcher :square_brackets?,
20
21
  '(send {(send _recv _msg) str array hash} :[] ...)'
@@ -25,17 +26,11 @@ module RuboCop
25
26
  '^^(block (send _ _ equal?(%0) ...) ...)'
26
27
 
27
28
  def on_begin(node)
28
- return if !parentheses?(node) || parens_allowed?(node)
29
- return if node.parent && (node.parent.while_post_type? ||
30
- node.parent.until_post_type?)
29
+ return if !parentheses?(node) || parens_allowed?(node) || ignore_syntax?(node)
31
30
 
32
31
  check(node)
33
32
  end
34
33
 
35
- def autocorrect(node)
36
- ParenthesesCorrector.correct(node)
37
- end
38
-
39
34
  private
40
35
 
41
36
  def parens_allowed?(node)
@@ -45,6 +40,13 @@ module RuboCop
45
40
  allowed_expression?(node)
46
41
  end
47
42
 
43
+ def ignore_syntax?(node)
44
+ return false unless (parent = node.parent)
45
+
46
+ parent.while_post_type? || parent.until_post_type? ||
47
+ like_method_argument_parentheses?(parent)
48
+ end
49
+
48
50
  def allowed_expression?(node)
49
51
  allowed_ancestor?(node) ||
50
52
  allowed_method_call?(node) ||
@@ -71,6 +73,10 @@ module RuboCop
71
73
  !ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
72
74
  end
73
75
 
76
+ def like_method_argument_parentheses?(node)
77
+ node.send_type? && node.arguments.size == 1 && !node.arithmetic_operation?
78
+ end
79
+
74
80
  def empty_parentheses?(node)
75
81
  # Don't flag `()`
76
82
  node.children.empty?
@@ -115,15 +121,16 @@ module RuboCop
115
121
 
116
122
  node = node.children.first while suspect_unary?(node)
117
123
 
118
- if node.send_type?
119
- return unless method_call_with_redundant_parentheses?(node)
120
- end
124
+ return if node.send_type? &&
125
+ !method_call_with_redundant_parentheses?(node)
121
126
 
122
127
  offense(begin_node, 'an unary operation')
123
128
  end
124
129
 
125
130
  def offense(node, msg)
126
- add_offense(node, message: "Don't use parentheses around #{msg}.")
131
+ add_offense(node, message: "Don't use parentheses around #{msg}.") do |corrector|
132
+ ParenthesesCorrector.correct(corrector, node)
133
+ end
127
134
  end
128
135
 
129
136
  def suspect_unary?(node)
@@ -168,10 +175,9 @@ module RuboCop
168
175
  def raised_to_power_negative_numeric?(begin_node, node)
169
176
  return false unless node.numeric_type?
170
177
 
171
- siblings = begin_node.parent&.children
172
- return false if siblings.nil?
178
+ next_sibling = begin_node.right_sibling
179
+ return false unless next_sibling
173
180
 
174
- next_sibling = siblings[begin_node.sibling_index + 1]
175
181
  base_value = node.children.first
176
182
 
177
183
  base_value.negative? && next_sibling == :**
@@ -17,7 +17,9 @@ module RuboCop
17
17
  # time = "8 o'clock"
18
18
  # question = '"What did you say?"'
19
19
  #
20
- class RedundantPercentQ < Cop
20
+ class RedundantPercentQ < Base
21
+ extend AutoCorrector
22
+
21
23
  MSG = 'Use `%<q_type>s` only for strings that contain both ' \
22
24
  'single quotes and double quotes%<extra>s.'
23
25
  DYNAMIC_MSG = ', or for dynamic strings that contain ' \
@@ -45,22 +47,18 @@ module RuboCop
45
47
  check(node)
46
48
  end
47
49
 
48
- def autocorrect(node)
49
- delimiter =
50
- /^%Q[^"]+$|'/.match?(node.source) ? QUOTE : SINGLE_QUOTE
51
- lambda do |corrector|
52
- corrector.replace(node.loc.begin, delimiter)
53
- corrector.replace(node.loc.end, delimiter)
54
- end
55
- end
56
-
57
50
  private
58
51
 
59
52
  def check(node)
60
53
  return unless start_with_percent_q_variant?(node)
61
54
  return if interpolated_quotes?(node) || allowed_percent_q?(node)
62
55
 
63
- add_offense(node)
56
+ add_offense(node) do |corrector|
57
+ delimiter = /^%Q[^"]+$|'/.match?(node.source) ? QUOTE : SINGLE_QUOTE
58
+
59
+ corrector.replace(node.loc.begin, delimiter)
60
+ corrector.replace(node.loc.end, delimiter)
61
+ end
64
62
  end
65
63
 
66
64
  def interpolated_quotes?(node)
@@ -21,9 +21,10 @@ module RuboCop
21
21
  #
22
22
  # # good
23
23
  # r = /[ab]/
24
- class RedundantRegexpCharacterClass < Cop
24
+ class RedundantRegexpCharacterClass < Base
25
25
  include MatchRange
26
26
  include RegexpLiteralHelp
27
+ extend AutoCorrector
27
28
 
28
29
  MSG_REDUNDANT_CHARACTER_CLASS = 'Redundant single-element character class, ' \
29
30
  '`%<char_class>s` can be replaced with `%<element>s`.'
@@ -48,33 +49,25 @@ module RuboCop
48
49
  next if whitespace_in_free_space_mode?(node, loc)
49
50
 
50
51
  add_offense(
51
- node,
52
- location: loc,
53
- message: format(
52
+ loc, message: format(
54
53
  MSG_REDUNDANT_CHARACTER_CLASS,
55
54
  char_class: loc.source,
56
55
  element: without_character_class(loc)
57
56
  )
58
- )
59
- end
60
- end
61
-
62
- def autocorrect(node)
63
- lambda do |corrector|
64
- each_redundant_character_class(node) do |loc|
57
+ ) do |corrector|
65
58
  corrector.replace(loc, without_character_class(loc))
66
59
  end
67
60
  end
68
61
  end
69
62
 
63
+ private
64
+
70
65
  def each_redundant_character_class(node)
71
66
  pattern_source(node).scan(PATTERN) do
72
67
  yield match_range(node.loc.begin.end, Regexp.last_match)
73
68
  end
74
69
  end
75
70
 
76
- private
77
-
78
71
  def without_character_class(loc)
79
72
  loc.source[1..-2]
80
73
  end
@@ -32,13 +32,14 @@ module RuboCop
32
32
  #
33
33
  # # good
34
34
  # /[+\-]\d/
35
- class RedundantRegexpEscape < Cop
35
+ class RedundantRegexpEscape < Base
36
36
  include RangeHelp
37
37
  include RegexpLiteralHelp
38
+ extend AutoCorrector
38
39
 
39
40
  MSG_REDUNDANT_ESCAPE = 'Redundant escape inside regexp literal'
40
41
 
41
- ALLOWED_ALWAYS_ESCAPES = ' []^\\#'.chars.freeze
42
+ ALLOWED_ALWAYS_ESCAPES = " \n[]^\\#".chars.freeze
42
43
  ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES = '-'.chars.freeze
43
44
  ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES = '.*+?{}()|$'.chars.freeze
44
45
 
@@ -46,19 +47,9 @@ module RuboCop
46
47
  each_escape(node) do |char, index, within_character_class|
47
48
  next if allowed_escape?(node, char, within_character_class)
48
49
 
49
- add_offense(
50
- node,
51
- location: escape_range_at_index(node, index),
52
- message: MSG_REDUNDANT_ESCAPE
53
- )
54
- end
55
- end
56
-
57
- def autocorrect(node)
58
- lambda do |corrector|
59
- each_escape(node) do |char, index, within_character_class|
60
- next if allowed_escape?(node, char, within_character_class)
50
+ location = escape_range_at_index(node, index)
61
51
 
52
+ add_offense(location, message: MSG_REDUNDANT_ESCAPE) do |corrector|
62
53
  corrector.remove_leading(escape_range_at_index(node, index), 1)
63
54
  end
64
55
  end
@@ -47,8 +47,9 @@ module RuboCop
47
47
  # return x, y
48
48
  # end
49
49
  #
50
- class RedundantReturn < Cop
50
+ class RedundantReturn < Base
51
51
  include RangeHelp
52
+ extend AutoCorrector
52
53
 
53
54
  MSG = 'Redundant `return` detected.'
54
55
  MULTI_RETURN_MSG = 'To return multiple values, use an array.'
@@ -58,16 +59,6 @@ module RuboCop
58
59
  end
59
60
  alias on_defs on_def
60
61
 
61
- def autocorrect(node)
62
- lambda do |corrector|
63
- if node.arguments?
64
- correct_with_arguments(node, corrector)
65
- else
66
- correct_without_arguments(node, corrector)
67
- end
68
- end
69
- end
70
-
71
62
  private
72
63
 
73
64
  def correct_without_arguments(return_node, corrector)
@@ -108,8 +99,8 @@ module RuboCop
108
99
  when :return then check_return_node(node)
109
100
  when :case then check_case_node(node)
110
101
  when :if then check_if_node(node)
111
- when :rescue, :resbody
112
- check_rescue_node(node)
102
+ when :rescue then check_rescue_node(node)
103
+ when :resbody then check_resbody_node(node)
113
104
  when :ensure then check_ensure_node(node)
114
105
  when :begin, :kwbegin
115
106
  check_begin_node(node)
@@ -121,7 +112,13 @@ module RuboCop
121
112
  return if cop_config['AllowMultipleReturnValues'] &&
122
113
  node.children.size > 1
123
114
 
124
- add_offense(node, location: :keyword)
115
+ add_offense(node.loc.keyword, message: message(node)) do |corrector|
116
+ if node.arguments?
117
+ correct_with_arguments(node, corrector)
118
+ else
119
+ correct_without_arguments(node, corrector)
120
+ end
121
+ end
125
122
  end
126
123
 
127
124
  def check_case_node(node)
@@ -137,9 +134,12 @@ module RuboCop
137
134
  end
138
135
 
139
136
  def check_rescue_node(node)
140
- node.child_nodes.each do |child_node|
141
- check_branch(child_node)
142
- end
137
+ node.branches.each { |branch| check_branch(branch) }
138
+ check_branch(node.body) unless node.else?
139
+ end
140
+
141
+ def check_resbody_node(node)
142
+ check_branch(node.body)
143
143
  end
144
144
 
145
145
  def check_ensure_node(node)