rubocop 1.41.1 → 1.57.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 (423) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +6 -4
  4. data/config/default.yml +243 -48
  5. data/config/obsoletion.yml +5 -0
  6. data/lib/rubocop/cli/command/auto_generate_config.rb +7 -0
  7. data/lib/rubocop/cli/command/execute_runner.rb +7 -2
  8. data/lib/rubocop/cli/command/lsp.rb +19 -0
  9. data/lib/rubocop/cli.rb +59 -10
  10. data/lib/rubocop/comment_config.rb +19 -0
  11. data/lib/rubocop/config.rb +14 -10
  12. data/lib/rubocop/config_finder.rb +2 -2
  13. data/lib/rubocop/config_loader.rb +20 -23
  14. data/lib/rubocop/config_loader_resolver.rb +5 -1
  15. data/lib/rubocop/config_obsoletion/parameter_rule.rb +9 -1
  16. data/lib/rubocop/config_obsoletion.rb +2 -2
  17. data/lib/rubocop/cop/autocorrect_logic.rb +31 -13
  18. data/lib/rubocop/cop/base.rb +96 -73
  19. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -0
  20. data/lib/rubocop/cop/bundler/duplicated_group.rb +127 -0
  21. data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
  22. data/lib/rubocop/cop/bundler/gem_version.rb +2 -2
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +9 -1
  24. data/lib/rubocop/cop/commissioner.rb +8 -2
  25. data/lib/rubocop/cop/cop.rb +53 -33
  26. data/lib/rubocop/cop/corrector.rb +31 -11
  27. data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
  28. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
  29. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
  30. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -4
  31. data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
  32. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
  33. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
  34. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
  35. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  36. data/lib/rubocop/cop/gemspec/dependency_version.rb +19 -21
  37. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -1
  38. data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
  39. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +9 -1
  40. data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
  41. data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -13
  42. data/lib/rubocop/cop/internal_affairs/example_description.rb +42 -21
  43. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
  44. data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
  45. data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
  46. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -1
  47. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +6 -6
  48. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
  49. data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
  50. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
  51. data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
  52. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
  53. data/lib/rubocop/cop/internal_affairs/redundant_method_dispatch_node.rb +11 -2
  54. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
  55. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -0
  56. data/lib/rubocop/cop/internal_affairs.rb +3 -0
  57. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  58. data/lib/rubocop/cop/layout/block_end_newline.rb +7 -15
  59. data/lib/rubocop/cop/layout/class_structure.rb +44 -26
  60. data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +2 -3
  61. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
  62. data/lib/rubocop/cop/layout/comment_indentation.rb +3 -1
  63. data/lib/rubocop/cop/layout/dot_position.rb +1 -5
  64. data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
  65. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +42 -9
  66. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +28 -5
  67. data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
  68. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
  69. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -0
  70. data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
  71. data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
  72. data/lib/rubocop/cop/layout/first_argument_indentation.rb +8 -3
  73. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
  74. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +7 -19
  75. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +42 -52
  76. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
  77. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +10 -4
  78. data/lib/rubocop/cop/layout/heredoc_indentation.rb +11 -11
  79. data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
  80. data/lib/rubocop/cop/layout/indentation_width.rb +3 -3
  81. data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
  82. data/lib/rubocop/cop/layout/leading_comment_space.rb +2 -2
  83. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +18 -12
  84. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +17 -13
  85. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -0
  86. data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
  87. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -1
  88. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +7 -26
  89. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -21
  90. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +18 -3
  91. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +6 -30
  92. data/lib/rubocop/cop/layout/redundant_line_break.rb +20 -11
  93. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
  94. data/lib/rubocop/cop/layout/space_after_comma.rb +9 -1
  95. data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
  96. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
  97. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +2 -2
  98. data/lib/rubocop/cop/layout/space_around_operators.rb +4 -2
  99. data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
  100. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
  101. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +11 -13
  102. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -1
  103. data/lib/rubocop/cop/layout/space_inside_parens.rb +3 -3
  104. data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
  105. data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
  106. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +4 -4
  107. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +5 -4
  108. data/lib/rubocop/cop/layout/trailing_empty_lines.rb +5 -0
  109. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -3
  110. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
  111. data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
  112. data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
  113. data/lib/rubocop/cop/lint/debugger.rb +22 -25
  114. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +62 -112
  115. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  116. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +2 -1
  117. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
  118. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
  119. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +47 -22
  120. data/lib/rubocop/cop/lint/else_layout.rb +3 -7
  121. data/lib/rubocop/cop/lint/empty_block.rb +2 -2
  122. data/lib/rubocop/cop/lint/empty_conditional_body.rb +4 -2
  123. data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
  124. data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -4
  125. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
  126. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +16 -18
  127. data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
  128. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  129. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
  130. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
  131. data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
  132. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  133. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +47 -5
  134. data/lib/rubocop/cop/lint/missing_super.rb +63 -5
  135. data/lib/rubocop/cop/lint/mixed_case_range.rb +111 -0
  136. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
  137. data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -9
  138. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +10 -7
  139. data/lib/rubocop/cop/lint/number_conversion.rb +5 -0
  140. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
  141. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
  142. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
  143. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +16 -1
  144. data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
  145. data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
  146. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +11 -5
  147. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
  148. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +130 -0
  149. data/lib/rubocop/cop/lint/redundant_require_statement.rb +21 -2
  150. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +20 -4
  151. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
  152. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
  153. data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
  154. data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
  155. data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
  156. data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
  157. data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
  158. data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
  159. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +11 -4
  160. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
  161. data/lib/rubocop/cop/lint/script_permission.rb +1 -1
  162. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
  163. data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -12
  164. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +7 -1
  165. data/lib/rubocop/cop/lint/struct_new_override.rb +12 -12
  166. data/lib/rubocop/cop/lint/suppressed_exception.rb +2 -2
  167. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  168. data/lib/rubocop/cop/lint/syntax.rb +4 -0
  169. data/lib/rubocop/cop/lint/to_enum_arguments.rb +18 -6
  170. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
  171. data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
  172. data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -1
  173. data/lib/rubocop/cop/lint/useless_access_modifier.rb +10 -7
  174. data/lib/rubocop/cop/lint/useless_assignment.rb +94 -10
  175. data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
  176. data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
  177. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +14 -4
  178. data/lib/rubocop/cop/lint/useless_times.rb +1 -1
  179. data/lib/rubocop/cop/lint/void.rb +79 -16
  180. data/lib/rubocop/cop/metrics/block_length.rb +2 -2
  181. data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
  182. data/lib/rubocop/cop/metrics/class_length.rb +3 -2
  183. data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
  184. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  185. data/lib/rubocop/cop/metrics/method_length.rb +1 -1
  186. data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
  187. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  188. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -8
  189. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +33 -5
  190. data/lib/rubocop/cop/migration/department_name.rb +3 -3
  191. data/lib/rubocop/cop/mixin/alignment.rb +1 -1
  192. data/lib/rubocop/cop/mixin/allowed_methods.rb +3 -1
  193. data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
  194. data/lib/rubocop/cop/mixin/annotation_comment.rb +2 -2
  195. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  196. data/lib/rubocop/cop/mixin/comments_help.rb +13 -7
  197. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  198. data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
  199. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
  200. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
  201. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +62 -23
  202. data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
  203. data/lib/rubocop/cop/mixin/heredoc.rb +6 -2
  204. data/lib/rubocop/cop/mixin/line_length_help.rb +3 -1
  205. data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
  206. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +0 -3
  207. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -2
  208. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  209. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  210. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +6 -8
  211. data/lib/rubocop/cop/mixin/range_help.rb +1 -6
  212. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
  213. data/lib/rubocop/cop/mixin/statement_modifier.rb +4 -3
  214. data/lib/rubocop/cop/mixin/string_help.rb +4 -2
  215. data/lib/rubocop/cop/mixin/surrounding_space.rb +3 -3
  216. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  217. data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
  218. data/lib/rubocop/cop/naming/block_forwarding.rb +5 -1
  219. data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +1 -1
  220. data/lib/rubocop/cop/naming/constant_name.rb +1 -1
  221. data/lib/rubocop/cop/naming/file_name.rb +1 -1
  222. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
  223. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -1
  224. data/lib/rubocop/cop/naming/inclusive_language.rb +23 -4
  225. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +25 -10
  226. data/lib/rubocop/cop/naming/method_name.rb +3 -3
  227. data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
  228. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
  229. data/lib/rubocop/cop/naming/variable_name.rb +6 -1
  230. data/lib/rubocop/cop/registry.rb +37 -30
  231. data/lib/rubocop/cop/security/compound_hash.rb +2 -1
  232. data/lib/rubocop/cop/style/access_modifier_declarations.rb +26 -11
  233. data/lib/rubocop/cop/style/accessor_grouping.rb +43 -17
  234. data/lib/rubocop/cop/style/alias.rb +9 -8
  235. data/lib/rubocop/cop/style/arguments_forwarding.rb +280 -62
  236. data/lib/rubocop/cop/style/array_intersect.rb +14 -6
  237. data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
  238. data/lib/rubocop/cop/style/attr.rb +11 -1
  239. data/lib/rubocop/cop/style/begin_block.rb +1 -2
  240. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
  241. data/lib/rubocop/cop/style/block_comments.rb +3 -3
  242. data/lib/rubocop/cop/style/block_delimiters.rb +22 -6
  243. data/lib/rubocop/cop/style/case_like_if.rb +20 -3
  244. data/lib/rubocop/cop/style/class_and_module_children.rb +5 -12
  245. data/lib/rubocop/cop/style/class_equality_comparison.rb +58 -40
  246. data/lib/rubocop/cop/style/collection_compact.rb +20 -7
  247. data/lib/rubocop/cop/style/collection_methods.rb +2 -0
  248. data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
  249. data/lib/rubocop/cop/style/combinable_loops.rb +30 -8
  250. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  251. data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
  252. data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
  253. data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
  254. data/lib/rubocop/cop/style/concat_array_literals.rb +32 -4
  255. data/lib/rubocop/cop/style/conditional_assignment.rb +11 -15
  256. data/lib/rubocop/cop/style/copyright.rb +6 -3
  257. data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
  258. data/lib/rubocop/cop/style/dir.rb +1 -1
  259. data/lib/rubocop/cop/style/dir_empty.rb +54 -0
  260. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
  261. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +3 -3
  262. data/lib/rubocop/cop/style/documentation.rb +12 -6
  263. data/lib/rubocop/cop/style/documentation_method.rb +10 -4
  264. data/lib/rubocop/cop/style/double_negation.rb +2 -2
  265. data/lib/rubocop/cop/style/each_with_object.rb +1 -1
  266. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  267. data/lib/rubocop/cop/style/empty_case_condition.rb +6 -1
  268. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  269. data/lib/rubocop/cop/style/eval_with_location.rb +8 -8
  270. data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
  271. data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
  272. data/lib/rubocop/cop/style/file_empty.rb +71 -0
  273. data/lib/rubocop/cop/style/file_read.rb +3 -3
  274. data/lib/rubocop/cop/style/file_write.rb +1 -1
  275. data/lib/rubocop/cop/style/for.rb +1 -1
  276. data/lib/rubocop/cop/style/format_string.rb +24 -3
  277. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +4 -2
  278. data/lib/rubocop/cop/style/guard_clause.rb +40 -8
  279. data/lib/rubocop/cop/style/hash_conversion.rb +10 -0
  280. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -10
  281. data/lib/rubocop/cop/style/hash_except.rb +23 -12
  282. data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
  283. data/lib/rubocop/cop/style/hash_syntax.rb +16 -9
  284. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  285. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  286. data/lib/rubocop/cop/style/identical_conditional_branches.rb +36 -3
  287. data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
  288. data/lib/rubocop/cop/style/if_unless_modifier.rb +111 -15
  289. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
  290. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  291. data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
  292. data/lib/rubocop/cop/style/inverse_methods.rb +5 -5
  293. data/lib/rubocop/cop/style/invertible_unless_condition.rb +118 -0
  294. data/lib/rubocop/cop/style/lambda.rb +3 -3
  295. data/lib/rubocop/cop/style/lambda_call.rb +5 -0
  296. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
  297. data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
  298. data/lib/rubocop/cop/style/map_to_set.rb +64 -0
  299. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +35 -24
  300. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +44 -37
  301. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -0
  302. data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -4
  303. data/lib/rubocop/cop/style/min_max.rb +3 -3
  304. data/lib/rubocop/cop/style/min_max_comparison.rb +83 -0
  305. data/lib/rubocop/cop/style/missing_else.rb +13 -1
  306. data/lib/rubocop/cop/style/mixin_grouping.rb +5 -5
  307. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  308. data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
  309. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  310. data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
  311. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +19 -4
  312. data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
  313. data/lib/rubocop/cop/style/negated_if_else_condition.rb +13 -12
  314. data/lib/rubocop/cop/style/nested_ternary_operator.rb +3 -11
  315. data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
  316. data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
  317. data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
  318. data/lib/rubocop/cop/style/one_line_conditional.rb +3 -6
  319. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  320. data/lib/rubocop/cop/style/operator_method_call.rb +22 -2
  321. data/lib/rubocop/cop/style/parallel_assignment.rb +29 -19
  322. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
  323. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  324. data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -1
  325. data/lib/rubocop/cop/style/redundant_argument.rb +6 -1
  326. data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
  327. data/lib/rubocop/cop/style/redundant_begin.rb +10 -2
  328. data/lib/rubocop/cop/style/redundant_condition.rb +18 -3
  329. data/lib/rubocop/cop/style/redundant_conditional.rb +2 -14
  330. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +38 -0
  331. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +96 -9
  332. data/lib/rubocop/cop/style/redundant_exception.rb +32 -12
  333. data/lib/rubocop/cop/style/redundant_fetch_block.rb +6 -4
  334. data/lib/rubocop/cop/style/redundant_filter_chain.rb +117 -0
  335. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
  336. data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
  337. data/lib/rubocop/cop/style/redundant_line_continuation.rb +183 -0
  338. data/lib/rubocop/cop/style/redundant_parentheses.rb +26 -8
  339. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  340. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +100 -0
  341. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +7 -8
  342. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
  343. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +13 -4
  344. data/lib/rubocop/cop/style/redundant_return.rb +7 -2
  345. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +8 -1
  346. data/lib/rubocop/cop/style/redundant_sort.rb +4 -4
  347. data/lib/rubocop/cop/style/redundant_string_escape.rb +9 -6
  348. data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
  349. data/lib/rubocop/cop/style/require_order.rb +16 -17
  350. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
  351. data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
  352. data/lib/rubocop/cop/style/return_nil.rb +6 -2
  353. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +95 -0
  354. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  355. data/lib/rubocop/cop/style/select_by_regexp.rb +20 -6
  356. data/lib/rubocop/cop/style/self_assignment.rb +2 -2
  357. data/lib/rubocop/cop/style/semicolon.rb +35 -5
  358. data/lib/rubocop/cop/style/signal_exception.rb +9 -7
  359. data/lib/rubocop/cop/style/single_line_do_end_block.rb +65 -0
  360. data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
  361. data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
  362. data/lib/rubocop/cop/style/sole_nested_conditional.rb +9 -5
  363. data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
  364. data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
  365. data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
  366. data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +30 -5
  367. data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
  368. data/lib/rubocop/cop/style/symbol_array.rb +35 -15
  369. data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
  370. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -4
  371. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
  372. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  373. data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
  374. data/lib/rubocop/cop/style/unpack_first.rb +3 -3
  375. data/lib/rubocop/cop/style/word_array.rb +54 -1
  376. data/lib/rubocop/cop/style/yaml_file_read.rb +66 -0
  377. data/lib/rubocop/cop/style/yoda_condition.rb +17 -8
  378. data/lib/rubocop/cop/style/yoda_expression.rb +91 -0
  379. data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -19
  380. data/lib/rubocop/cop/team.rb +60 -52
  381. data/lib/rubocop/cop/util.rb +14 -5
  382. data/lib/rubocop/cop/utils/regexp_ranges.rb +113 -0
  383. data/lib/rubocop/cop/variable_force/assignment.rb +45 -4
  384. data/lib/rubocop/cop/variable_force/scope.rb +3 -3
  385. data/lib/rubocop/cop/variable_force/variable.rb +5 -3
  386. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -3
  387. data/lib/rubocop/cop/variable_force.rb +2 -4
  388. data/lib/rubocop/cops_documentation_generator.rb +11 -4
  389. data/lib/rubocop/directive_comment.rb +3 -3
  390. data/lib/rubocop/ext/comment.rb +18 -0
  391. data/lib/rubocop/ext/regexp_node.rb +1 -1
  392. data/lib/rubocop/ext/regexp_parser.rb +5 -2
  393. data/lib/rubocop/file_finder.rb +4 -7
  394. data/lib/rubocop/formatter/junit_formatter.rb +4 -1
  395. data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
  396. data/lib/rubocop/formatter.rb +0 -1
  397. data/lib/rubocop/lsp/logger.rb +22 -0
  398. data/lib/rubocop/lsp/routes.rb +246 -0
  399. data/lib/rubocop/lsp/runtime.rb +99 -0
  400. data/lib/rubocop/lsp/server.rb +68 -0
  401. data/lib/rubocop/lsp/severity.rb +27 -0
  402. data/lib/rubocop/magic_comment.rb +12 -10
  403. data/lib/rubocop/options.rb +37 -3
  404. data/lib/rubocop/path_util.rb +17 -7
  405. data/lib/rubocop/result_cache.rb +7 -3
  406. data/lib/rubocop/rspec/cop_helper.rb +2 -2
  407. data/lib/rubocop/rspec/expect_offense.rb +6 -4
  408. data/lib/rubocop/rspec/shared_contexts.rb +6 -3
  409. data/lib/rubocop/rspec/support.rb +1 -0
  410. data/lib/rubocop/runner.rb +55 -10
  411. data/lib/rubocop/server/cache.rb +12 -4
  412. data/lib/rubocop/server/cli.rb +37 -18
  413. data/lib/rubocop/server/client_command/exec.rb +4 -3
  414. data/lib/rubocop/server/client_command/start.rb +6 -1
  415. data/lib/rubocop/server/core.rb +24 -9
  416. data/lib/rubocop/server/helper.rb +1 -1
  417. data/lib/rubocop/server/server_command/exec.rb +1 -1
  418. data/lib/rubocop/string_interpreter.rb +3 -3
  419. data/lib/rubocop/target_finder.rb +7 -3
  420. data/lib/rubocop/target_ruby.rb +13 -9
  421. data/lib/rubocop/version.rb +10 -6
  422. data/lib/rubocop.rb +31 -0
  423. metadata +84 -37
@@ -117,9 +117,9 @@ module RuboCop
117
117
 
118
118
  def comment_between_rescue_and_end?(node)
119
119
  ancestor = node.each_ancestor(:kwbegin, :def, :defs, :block, :numblock).first
120
- return unless ancestor
120
+ return false unless ancestor
121
121
 
122
- end_line = ancestor.loc.end.line
122
+ end_line = ancestor.loc.end&.line || ancestor.loc.last_line
123
123
  processed_source[node.first_line...end_line].any? { |line| comment_line?(line) }
124
124
  end
125
125
 
@@ -124,7 +124,7 @@ module RuboCop
124
124
  source == value ||
125
125
  # `Symbol#inspect` uses double quotes, but allow single-quoted
126
126
  # symbols to work as well.
127
- source.tr("'", '"') == value
127
+ source.gsub('"', '\"').tr("'", '"') == value
128
128
  end
129
129
 
130
130
  def requires_quotes?(sym_node)
@@ -33,6 +33,10 @@ module RuboCop
33
33
  message << '.' unless message.end_with?('.')
34
34
  message
35
35
  end
36
+
37
+ def find_severity(_range, _severity)
38
+ :fatal
39
+ end
36
40
  end
37
41
  end
38
42
  end
@@ -14,8 +14,14 @@ module RuboCop
14
14
  #
15
15
  # # good
16
16
  # def foo(x, y = 1)
17
+ # # Alternatives to `__callee__` are `__method__` and `:foo`.
17
18
  # return to_enum(__callee__, x, y)
18
- # # alternatives to `__callee__` are `__method__` and `:foo`
19
+ # end
20
+ #
21
+ # # good
22
+ # def foo(x, y = 1)
23
+ # # It is also allowed if it is wrapped in some method like Sorbet.
24
+ # return to_enum(T.must(__callee__), x, y)
19
25
  # end
20
26
  #
21
27
  class ToEnumArguments < Base
@@ -43,8 +49,12 @@ module RuboCop
43
49
  return unless def_node
44
50
 
45
51
  enum_conversion_call?(node) do |method_node, arguments|
46
- add_offense(node) unless method_name?(method_node, def_node.method_name) &&
47
- arguments_match?(arguments, def_node)
52
+ next if method_node.call_type? &&
53
+ !method_node.method?(:__method__) && !method_node.method?(:__callee__)
54
+ next if method_name?(method_node, def_node.method_name) &&
55
+ arguments_match?(arguments, def_node)
56
+
57
+ add_offense(node)
48
58
  end
49
59
  end
50
60
 
@@ -64,7 +74,7 @@ module RuboCop
64
74
  end
65
75
  end
66
76
 
67
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
77
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
68
78
  def argument_match?(send_arg, def_arg)
69
79
  def_arg_name = def_arg.children[0]
70
80
 
@@ -77,12 +87,14 @@ module RuboCop
77
87
  send_arg.hash_type? &&
78
88
  send_arg.pairs.any? { |pair| passing_keyword_arg?(pair, def_arg_name) }
79
89
  when :kwrestarg
80
- send_arg.each_child_node(:kwsplat).any? { |child| child.source == def_arg.source }
90
+ send_arg.each_child_node(:kwsplat, :forwarded_kwrestarg).any? do |child|
91
+ child.source == def_arg.source
92
+ end
81
93
  when :forward_arg
82
94
  send_arg.forwarded_args_type?
83
95
  end
84
96
  end
85
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
97
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
86
98
  end
87
99
  end
88
100
  end
@@ -8,25 +8,39 @@ module RuboCop
8
8
  # always ignored. This is detected automatically since Ruby 2.7.
9
9
  #
10
10
  # @example
11
+ # # bad
12
+ # return 1
11
13
  #
12
- # # Detected since Ruby 2.7
13
- # return 1 # 1 is always ignored.
14
+ # # good
15
+ # return
14
16
  class TopLevelReturnWithArgument < Base
15
- # This cop works by validating the ancestors of the return node. A
16
- # top-level return node's ancestors should not be of block, def, or
17
- # defs type.
17
+ extend AutoCorrector
18
18
 
19
19
  MSG = 'Top level return with argument detected.'
20
20
 
21
21
  def on_return(return_node)
22
- add_offense(return_node) if return_node.arguments? && ancestors_valid?(return_node)
22
+ return unless top_level_return_with_any_argument?(return_node)
23
+
24
+ add_offense(return_node) do |corrector|
25
+ remove_arguments(corrector, return_node)
26
+ end
23
27
  end
24
28
 
25
29
  private
26
30
 
27
- def ancestors_valid?(return_node)
28
- prohibited_ancestors = return_node.each_ancestor(:block, :def, :defs)
29
- prohibited_ancestors.none?
31
+ def top_level_return_with_any_argument?(return_node)
32
+ top_level_return?(return_node) && return_node.arguments?
33
+ end
34
+
35
+ def remove_arguments(corrector, return_node)
36
+ corrector.replace(return_node, 'return')
37
+ end
38
+
39
+ # This cop works by validating the ancestors of the return node. A
40
+ # top-level return node's ancestors should not be of block, def, or
41
+ # defs type.
42
+ def top_level_return?(return_node)
43
+ return_node.each_ancestor(:block, :def, :defs).none?
30
44
  end
31
45
  end
32
46
  end
@@ -111,9 +111,9 @@ module RuboCop
111
111
  return false unless node.block_type? || node.numblock_type?
112
112
 
113
113
  send_node = node.send_node
114
- return false if matches_allowed_pattern?(send_node.source)
115
-
116
- send_node.enumerable_method? || send_node.enumerator_method? || send_node.method?(:loop)
114
+ loopable = send_node.enumerable_method? || send_node.enumerator_method? ||
115
+ send_node.method?(:loop)
116
+ loopable && !matches_allowed_pattern?(send_node.source)
117
117
  end
118
118
 
119
119
  def check(node)
@@ -100,7 +100,8 @@ module RuboCop
100
100
 
101
101
  unless variable.keyword_argument?
102
102
  message << " If it's necessary, use `_` or `_#{variable.name}` " \
103
- "as an argument name to indicate that it won't be used."
103
+ "as an argument name to indicate that it won't be used. " \
104
+ "If it's unnecessary, remove it."
104
105
  end
105
106
 
106
107
  scope = variable.scope
@@ -137,7 +137,7 @@ module RuboCop
137
137
  alias on_sclass on_class
138
138
 
139
139
  def on_block(node)
140
- return unless eval_call?(node)
140
+ return unless eval_call?(node) || included_block?(node)
141
141
 
142
142
  check_node(node.body)
143
143
  end
@@ -167,11 +167,6 @@ module RuboCop
167
167
  ({block numblock} (send _ {:class_eval :instance_eval}) ...)
168
168
  PATTERN
169
169
 
170
- # @!method class_or_module_or_struct_new_call?(node)
171
- def_node_matcher :class_or_module_or_struct_new_call?, <<~PATTERN
172
- ({block numblock} (send (const {nil? cbase} {:Class :Module :Struct}) :new ...) ...)
173
- PATTERN
174
-
175
170
  def check_node(node)
176
171
  return if node.nil?
177
172
 
@@ -197,10 +192,13 @@ module RuboCop
197
192
  end
198
193
  end
199
194
 
195
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
200
196
  def check_child_nodes(node, unused, cur_vis)
201
197
  node.child_nodes.each do |child|
202
198
  if child.send_type? && access_modifier?(child)
203
199
  cur_vis, unused = check_send_node(child, cur_vis, unused)
200
+ elsif child.block_type? && included_block?(child)
201
+ next
204
202
  elsif method_definition?(child)
205
203
  unused = nil
206
204
  elsif start_of_new_scope?(child)
@@ -212,6 +210,7 @@ module RuboCop
212
210
 
213
211
  [cur_vis, unused]
214
212
  end
213
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
215
214
 
216
215
  def check_send_node(node, cur_vis, unused)
217
216
  if node.bare_access_modifier?
@@ -245,6 +244,10 @@ module RuboCop
245
244
  [new_vis, unused]
246
245
  end
247
246
 
247
+ def included_block?(block_node)
248
+ active_support_extensions_enabled? && block_node.method?(:included)
249
+ end
250
+
248
251
  def method_definition?(child)
249
252
  static_method_definition?(child) ||
250
253
  dynamic_method_definition?(child) ||
@@ -270,7 +273,7 @@ module RuboCop
270
273
 
271
274
  def eval_call?(child)
272
275
  class_or_instance_eval?(child) ||
273
- class_or_module_or_struct_new_call?(child) ||
276
+ child.class_constructor? ||
274
277
  any_context_creating_methods?(child)
275
278
  end
276
279
 
@@ -7,12 +7,24 @@ module RuboCop
7
7
  # scope.
8
8
  # The basic idea for this cop was from the warning of `ruby -cw`:
9
9
  #
10
- # assigned but unused variable - foo
10
+ # [source,console]
11
+ # ----
12
+ # assigned but unused variable - foo
13
+ # ----
11
14
  #
12
15
  # Currently this cop has advanced logic that detects unreferenced
13
16
  # reassignments and properly handles varied cases such as branch, loop,
14
17
  # rescue, ensure, etc.
15
18
  #
19
+ # NOTE: Given the assignment `foo = 1, bar = 2`, removing unused variables
20
+ # can lead to a syntax error, so this case is not autocorrected.
21
+ #
22
+ # @safety
23
+ # This cop's autocorrection is unsafe because removing assignment from
24
+ # operator assignment can cause NameError if this assignment has been used to declare
25
+ # local variable. For example, replacing `a ||= 1` to `a || 1` may cause
26
+ # "undefined local variable or method `a' for main:Object (NameError)".
27
+ #
16
28
  # @example
17
29
  #
18
30
  # # bad
@@ -31,6 +43,10 @@ module RuboCop
31
43
  # do_something(some_var)
32
44
  # end
33
45
  class UselessAssignment < Base
46
+ extend AutoCorrector
47
+
48
+ include RangeHelp
49
+
34
50
  MSG = 'Useless assignment to variable - `%<variable>s`.'
35
51
 
36
52
  def self.joining_forces
@@ -41,23 +57,24 @@ module RuboCop
41
57
  scope.variables.each_value { |variable| check_for_unused_assignments(variable) }
42
58
  end
43
59
 
60
+ # rubocop:disable Metrics/AbcSize
44
61
  def check_for_unused_assignments(variable)
45
62
  return if variable.should_be_unused?
46
63
 
47
64
  variable.assignments.each do |assignment|
48
- next if assignment.used?
65
+ next if assignment.used? || part_of_ignored_node?(assignment.node)
49
66
 
50
67
  message = message_for_useless_assignment(assignment)
68
+ range = offense_range(assignment)
51
69
 
52
- location = if assignment.regexp_named_capture?
53
- assignment.node.children.first.source_range
54
- else
55
- assignment.node.loc.name
56
- end
70
+ add_offense(range, message: message) do |corrector|
71
+ autocorrect(corrector, assignment) unless sequential_assignment?(assignment.node)
72
+ end
57
73
 
58
- add_offense(location, message: message)
74
+ ignore_node(assignment.node) if chained_assignment?(assignment.node)
59
75
  end
60
76
  end
77
+ # rubocop:enable Metrics/AbcSize
61
78
 
62
79
  def message_for_useless_assignment(assignment)
63
80
  variable = assignment.variable
@@ -65,6 +82,28 @@ module RuboCop
65
82
  format(MSG, variable: variable.name) + message_specification(assignment, variable).to_s
66
83
  end
67
84
 
85
+ def offense_range(assignment)
86
+ if assignment.regexp_named_capture?
87
+ assignment.node.children.first.source_range
88
+ else
89
+ assignment.node.loc.name
90
+ end
91
+ end
92
+
93
+ def sequential_assignment?(node)
94
+ if node.lvasgn_type? && node.expression&.array_type? &&
95
+ node.each_descendant.any?(&:assignment?)
96
+ return true
97
+ end
98
+ return false unless node.parent
99
+
100
+ sequential_assignment?(node.parent)
101
+ end
102
+
103
+ def chained_assignment?(node)
104
+ node.respond_to?(:expression) && node.expression&.lvasgn_type?
105
+ end
106
+
68
107
  def message_specification(assignment, variable)
69
108
  if assignment.multiple_assignment?
70
109
  multiple_assignment_message(variable.name)
@@ -84,8 +123,7 @@ module RuboCop
84
123
  return_value_node = return_value_node_of_scope(scope)
85
124
  return unless assignment.meta_assignment_node.equal?(return_value_node)
86
125
 
87
- " Use `#{assignment.operator.sub(/=$/, '')}` " \
88
- "instead of `#{assignment.operator}`."
126
+ " Use `#{assignment.operator.delete_suffix('=')}` instead of `#{assignment.operator}`."
89
127
  end
90
128
 
91
129
  def similar_name_message(variable)
@@ -119,6 +157,52 @@ module RuboCop
119
157
 
120
158
  node.receiver.nil? && !node.arguments?
121
159
  end
160
+
161
+ # rubocop:disable Metrics/AbcSize
162
+ def autocorrect(corrector, assignment)
163
+ if assignment.exception_assignment?
164
+ remove_exception_assignment_part(corrector, assignment.node)
165
+ elsif assignment.multiple_assignment? || assignment.rest_assignment? ||
166
+ assignment.for_assignment?
167
+ rename_variable_with_underscore(corrector, assignment.node)
168
+ elsif assignment.operator_assignment?
169
+ remove_trailing_character_from_operator(corrector, assignment.node)
170
+ elsif assignment.regexp_named_capture?
171
+ replace_named_capture_group_with_non_capturing_group(corrector, assignment.node,
172
+ assignment.variable.name)
173
+ else
174
+ remove_local_variable_assignment_part(corrector, assignment.node)
175
+ end
176
+ end
177
+ # rubocop:enable Metrics/AbcSize
178
+
179
+ def remove_exception_assignment_part(corrector, node)
180
+ corrector.remove(
181
+ range_between(
182
+ (node.parent.children.first&.source_range || node.parent.location.keyword).end_pos,
183
+ node.source_range.end_pos
184
+ )
185
+ )
186
+ end
187
+
188
+ def rename_variable_with_underscore(corrector, node)
189
+ corrector.replace(node, '_')
190
+ end
191
+
192
+ def remove_trailing_character_from_operator(corrector, node)
193
+ corrector.remove(node.parent.location.operator.end.adjust(begin_pos: -1))
194
+ end
195
+
196
+ def replace_named_capture_group_with_non_capturing_group(corrector, node, variable_name)
197
+ corrector.replace(
198
+ node.children.first,
199
+ node.children.first.source.sub(/\(\?<#{variable_name}>/, '(?:')
200
+ )
201
+ end
202
+
203
+ def remove_local_variable_assignment_part(corrector, node)
204
+ corrector.replace(node, node.expression.source)
205
+ end
122
206
  end
123
207
  end
124
208
  end
@@ -41,17 +41,25 @@ module RuboCop
41
41
  MSG = 'Useless method definition detected.'
42
42
 
43
43
  def on_def(node)
44
- return if optional_args?(node)
44
+ return if method_definition_with_modifier?(node) || use_rest_or_optional_args?(node)
45
45
  return unless delegating?(node.body, node)
46
46
 
47
- add_offense(node) { |corrector| corrector.remove(node) }
47
+ add_offense(node) do |corrector|
48
+ range = node.parent&.send_type? ? node.parent : node
49
+
50
+ corrector.remove(range)
51
+ end
48
52
  end
49
53
  alias on_defs on_def
50
54
 
51
55
  private
52
56
 
53
- def optional_args?(node)
54
- node.arguments.any? { |arg| arg.optarg_type? || arg.kwoptarg_type? }
57
+ def method_definition_with_modifier?(node)
58
+ node.parent&.send_type? && !node.parent&.non_bare_access_modifier?
59
+ end
60
+
61
+ def use_rest_or_optional_args?(node)
62
+ node.arguments.any? { |arg| arg.restarg_type? || arg.optarg_type? || arg.kwoptarg_type? }
55
63
  end
56
64
 
57
65
  def delegating?(node, def_node)
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for useless `rescue`s, which only reraise rescued exceptions.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # def foo
11
+ # do_something
12
+ # rescue
13
+ # raise
14
+ # end
15
+ #
16
+ # # bad
17
+ # def foo
18
+ # do_something
19
+ # rescue => e
20
+ # raise # or 'raise e', or 'raise $!', or 'raise $ERROR_INFO'
21
+ # end
22
+ #
23
+ # # good
24
+ # def foo
25
+ # do_something
26
+ # rescue
27
+ # do_cleanup
28
+ # raise
29
+ # end
30
+ #
31
+ # # bad (latest rescue)
32
+ # def foo
33
+ # do_something
34
+ # rescue ArgumentError
35
+ # # noop
36
+ # rescue
37
+ # raise
38
+ # end
39
+ #
40
+ # # good (not the latest rescue)
41
+ # def foo
42
+ # do_something
43
+ # rescue ArgumentError
44
+ # raise
45
+ # rescue
46
+ # # noop
47
+ # end
48
+ #
49
+ class UselessRescue < Base
50
+ MSG = 'Useless `rescue` detected.'
51
+
52
+ def on_rescue(node)
53
+ resbody_node = node.resbody_branches.last
54
+ add_offense(resbody_node) if only_reraising?(resbody_node)
55
+ end
56
+
57
+ private
58
+
59
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
60
+ def only_reraising?(resbody_node)
61
+ return false if use_exception_variable_in_ensure?(resbody_node)
62
+
63
+ body = resbody_node.body
64
+
65
+ return false if body.nil? || !body.send_type? || !body.method?(:raise) || body.receiver
66
+ return true unless body.arguments?
67
+ return false if body.arguments.size > 1
68
+
69
+ exception_name = body.first_argument.source
70
+
71
+ exception_objects(resbody_node).include?(exception_name)
72
+ end
73
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
74
+
75
+ def use_exception_variable_in_ensure?(resbody_node)
76
+ return false unless (exception_variable = resbody_node.exception_variable)
77
+ return false unless (ensure_node = resbody_node.each_ancestor(:ensure).first)
78
+ return false unless (ensure_body = ensure_node.body)
79
+
80
+ ensure_body.each_descendant(:lvar).map(&:source).include?(exception_variable.source)
81
+ end
82
+
83
+ def exception_objects(resbody_node)
84
+ [resbody_node.exception_variable&.source, '$!', '$ERROR_INFO']
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -77,10 +77,12 @@ module RuboCop
77
77
  PATTERN
78
78
 
79
79
  def on_send(node)
80
- if node.first_argument.def_type?
81
- inspect_def(node, node.first_argument)
80
+ return unless (first_argument = node.first_argument)
81
+
82
+ if first_argument.def_type?
83
+ inspect_def(node, first_argument)
82
84
  elsif node.first_argument.sym_type?
83
- inspect_sym(node, node.first_argument)
85
+ inspect_sym(node, first_argument)
84
86
  end
85
87
  end
86
88
 
@@ -96,7 +98,7 @@ module RuboCop
96
98
  return unless node.parent
97
99
 
98
100
  method_name = sym_node.value
99
- definition = node.parent.each_child_node.detect { |n| method_definition(n, method_name) }
101
+ definition = find_method_definition(node, method_name)
100
102
 
101
103
  return unless definition
102
104
  return if allowed_arguments(definition.arguments)
@@ -104,6 +106,14 @@ module RuboCop
104
106
  add_offense(node, message: format(MSG, method_name: method_name))
105
107
  end
106
108
 
109
+ def find_method_definition(node, method_name)
110
+ node.each_ancestor.lazy.map do |ancestor|
111
+ ancestor.each_child_node(:def, :block, :numblock).find do |child|
112
+ method_definition(child, method_name)
113
+ end
114
+ end.find(&:itself)
115
+ end
116
+
107
117
  # `ruby2_keywords` is only allowed if there's a `restarg` and no keyword arguments
108
118
  def allowed_arguments(arguments)
109
119
  return false if arguments.empty?
@@ -74,7 +74,7 @@ module RuboCop
74
74
  end
75
75
 
76
76
  def remove_node(corrector, node)
77
- corrector.remove(range_by_whole_lines(node.loc.expression, include_final_newline: true))
77
+ corrector.remove(range_by_whole_lines(node.source_range, include_final_newline: true))
78
78
  end
79
79
 
80
80
  def autocorrect_block_pass(corrector, node, proc_name)