rubocop 1.69.2 → 1.72.2

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 (284) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +66 -2
  5. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  6. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  7. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  8. data/lib/rubocop/comment_config.rb +2 -2
  9. data/lib/rubocop/config.rb +17 -4
  10. data/lib/rubocop/config_loader.rb +48 -8
  11. data/lib/rubocop/config_loader_resolver.rb +33 -8
  12. data/lib/rubocop/config_validator.rb +18 -8
  13. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  14. data/lib/rubocop/cop/base.rb +6 -0
  15. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  16. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  17. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  18. data/lib/rubocop/cop/internal_affairs/example_description.rb +4 -2
  19. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  20. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  21. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  22. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  23. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  24. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  25. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  26. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  27. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  28. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  29. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  30. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  31. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  32. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  33. data/lib/rubocop/cop/internal_affairs.rb +5 -16
  34. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  35. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  36. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  37. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  38. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  39. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  40. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  41. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  42. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
  43. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  44. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  45. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  46. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  47. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  48. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  49. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  50. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  51. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  52. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  53. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  54. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  55. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  56. data/lib/rubocop/cop/layout/line_length.rb +1 -0
  57. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  58. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  59. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  60. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  61. data/lib/rubocop/cop/layout/redundant_line_break.rb +7 -6
  62. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +1 -1
  63. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  64. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  65. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  66. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  67. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  68. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  69. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  70. data/lib/rubocop/cop/layout/space_around_operators.rb +3 -3
  71. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  72. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  73. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  74. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  75. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  76. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  77. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  78. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  79. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  80. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  81. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  82. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  83. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  84. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  85. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  86. data/lib/rubocop/cop/lint/float_comparison.rb +5 -2
  87. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  88. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  89. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  90. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  91. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  92. data/lib/rubocop/cop/lint/mixed_case_range.rb +1 -1
  93. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  94. data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
  95. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  96. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  97. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  98. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  99. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  100. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  101. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  102. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  103. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +231 -0
  104. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  105. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  106. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  107. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  108. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  109. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  110. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  111. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  112. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  113. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  114. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  115. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  116. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  117. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  118. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -0
  119. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  120. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  121. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  122. data/lib/rubocop/cop/lint/void.rb +5 -9
  123. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  124. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  125. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  126. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  127. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  128. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  129. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  130. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  131. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  132. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  133. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  134. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  135. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  136. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  137. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  138. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  139. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  140. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  141. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  142. data/lib/rubocop/cop/mixin/range_help.rb +3 -3
  143. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  144. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  145. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  146. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  147. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  148. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  149. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  150. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  151. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  152. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  153. data/lib/rubocop/cop/style/and_or.rb +1 -1
  154. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  155. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  156. data/lib/rubocop/cop/style/block_delimiters.rb +7 -20
  157. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  158. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  159. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  160. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  161. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  162. data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
  163. data/lib/rubocop/cop/style/documentation.rb +1 -1
  164. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  165. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  166. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  167. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  168. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  169. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  170. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  171. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  172. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  173. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  174. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  175. data/lib/rubocop/cop/style/float_division.rb +8 -4
  176. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  177. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  178. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  179. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  180. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  181. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  182. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  183. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  184. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  185. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  186. data/lib/rubocop/cop/style/inverse_methods.rb +6 -6
  187. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  188. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  189. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  190. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  191. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  192. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +19 -12
  193. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  194. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  195. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  196. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  197. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  198. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  199. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  200. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  201. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  202. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  203. data/lib/rubocop/cop/style/object_then.rb +13 -15
  204. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  205. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  206. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  207. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  208. data/lib/rubocop/cop/style/proc.rb +1 -2
  209. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  210. data/lib/rubocop/cop/style/raise_args.rb +6 -4
  211. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  212. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  213. data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
  214. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  215. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  216. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  217. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  218. data/lib/rubocop/cop/style/redundant_format.rb +238 -0
  219. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  220. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  221. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  222. data/lib/rubocop/cop/style/redundant_parentheses.rb +28 -14
  223. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  224. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  225. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  226. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  227. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  228. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  229. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  230. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  231. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  232. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  233. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  234. data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -2
  235. data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
  236. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  237. data/lib/rubocop/cop/style/sole_nested_conditional.rb +2 -2
  238. data/lib/rubocop/cop/style/string_concatenation.rb +1 -1
  239. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  240. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  241. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  242. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  243. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  244. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  245. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  246. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  247. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  248. data/lib/rubocop/cop/util.rb +12 -5
  249. data/lib/rubocop/cop/utils/format_string.rb +7 -5
  250. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  251. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  252. data/lib/rubocop/cops_documentation_generator.rb +13 -13
  253. data/lib/rubocop/directive_comment.rb +44 -10
  254. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  255. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  256. data/lib/rubocop/lsp/logger.rb +2 -2
  257. data/lib/rubocop/lsp/routes.rb +7 -23
  258. data/lib/rubocop/lsp/runtime.rb +17 -49
  259. data/lib/rubocop/lsp/server.rb +0 -2
  260. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  261. data/lib/rubocop/options.rb +28 -12
  262. data/lib/rubocop/path_util.rb +15 -8
  263. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  264. data/lib/rubocop/plugin/load_error.rb +26 -0
  265. data/lib/rubocop/plugin/loader.rb +100 -0
  266. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  267. data/lib/rubocop/plugin.rb +39 -0
  268. data/lib/rubocop/rake_task.rb +4 -1
  269. data/lib/rubocop/result_cache.rb +13 -13
  270. data/lib/rubocop/rspec/cop_helper.rb +9 -0
  271. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  272. data/lib/rubocop/rspec/shared_contexts.rb +4 -1
  273. data/lib/rubocop/rspec/support.rb +1 -2
  274. data/lib/rubocop/runner.rb +5 -6
  275. data/lib/rubocop/server/cache.rb +35 -2
  276. data/lib/rubocop/server/cli.rb +2 -2
  277. data/lib/rubocop/target_finder.rb +1 -0
  278. data/lib/rubocop/target_ruby.rb +15 -0
  279. data/lib/rubocop/version.rb +17 -2
  280. data/lib/rubocop.rb +11 -0
  281. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  282. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
  283. metadata +53 -15
  284. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -4,30 +4,27 @@ module RuboCop
4
4
  module Cop
5
5
  module Lint
6
6
  # Certain numeric operations have a constant result, usually 0 or 1.
7
- # Subtracting a number from itself or multiplying it by 0 will always return 0.
8
- # Additionally, a variable modulo 0 or itself will always return 0.
7
+ # Multiplying a number by 0 will always return 0.
9
8
  # Dividing a number by itself or raising it to the power of 0 will always return 1.
10
9
  # As such, they can be replaced with that result.
11
10
  # These are probably leftover from debugging, or are mistakes.
12
11
  # Other numeric operations that are similarly leftover from debugging or mistakes
13
- # are handled by Lint/UselessNumericOperation.
12
+ # are handled by `Lint/UselessNumericOperation`.
13
+ #
14
+ # NOTE: This cop doesn't detect offenses for the `-` and `%` operator because it
15
+ # can't determine the type of `x`. If `x` is an `Array` or `String`, it doesn't perform
16
+ # a numeric operation.
14
17
  #
15
18
  # @example
16
19
  #
17
20
  # # bad
18
- # x - x
19
21
  # x * 0
20
- # x % 1
21
- # x % x
22
22
  #
23
23
  # # good
24
24
  # 0
25
25
  #
26
26
  # # bad
27
- # x -= x
28
27
  # x *= 0
29
- # x %= 1
30
- # x %= x
31
28
  #
32
29
  # # good
33
30
  # x = 0
@@ -49,57 +46,47 @@ module RuboCop
49
46
  class NumericOperationWithConstantResult < Base
50
47
  extend AutoCorrector
51
48
  MSG = 'Numeric operation with a constant result detected.'
52
- RESTRICT_ON_SEND = %i[- * / % **].freeze
49
+ RESTRICT_ON_SEND = %i[* / **].freeze
53
50
 
54
51
  # @!method operation_with_constant_result?(node)
55
52
  def_node_matcher :operation_with_constant_result?,
56
- '(send (send nil? $_) $_ ({int | send nil?} $_))'
53
+ '(call (call nil? $_lhs) $_operation ({int | call nil?} $_rhs))'
57
54
 
58
55
  # @!method abbreviated_assignment_with_constant_result?(node)
59
56
  def_node_matcher :abbreviated_assignment_with_constant_result?,
60
- '(op-asgn (lvasgn $_) $_ ({int | lvar} $_))'
57
+ '(op-asgn (lvasgn $_lhs) $_operation ({int lvar} $_rhs))'
61
58
 
62
59
  def on_send(node)
63
- return unless operation_with_constant_result?(node)
64
-
65
- variable, operation, number = operation_with_constant_result?(node)
66
- result = constant_result?(variable, operation, number)
67
- return unless result
60
+ return unless (lhs, operation, rhs = operation_with_constant_result?(node))
61
+ return unless (result = constant_result?(lhs, operation, rhs))
68
62
 
69
63
  add_offense(node) do |corrector|
70
64
  corrector.replace(node, result.to_s)
71
65
  end
72
66
  end
67
+ alias on_csend on_send
73
68
 
74
69
  def on_op_asgn(node)
75
- return unless abbreviated_assignment_with_constant_result?(node)
76
-
77
- variable, operation, number = abbreviated_assignment_with_constant_result?(node)
78
- result = constant_result?(variable, operation, number)
79
- return unless result
70
+ return unless (lhs, operation, rhs = abbreviated_assignment_with_constant_result?(node))
71
+ return unless (result = constant_result?(lhs, operation, rhs))
80
72
 
81
73
  add_offense(node) do |corrector|
82
- corrector.replace(node, "#{variable} = #{result}")
74
+ corrector.replace(node, "#{lhs} = #{result}")
83
75
  end
84
76
  end
85
77
 
86
78
  private
87
79
 
88
- # rubocop :disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
89
- def constant_result?(variable, operation, number)
90
- if number.to_s == '0'
80
+ def constant_result?(lhs, operation, rhs)
81
+ if rhs.to_s == '0'
91
82
  return 0 if operation == :*
92
83
  return 1 if operation == :**
93
- elsif number.to_s == '1'
94
- return 0 if operation == :%
95
- elsif number == variable
96
- return 0 if %i[- %].include?(operation)
84
+ elsif rhs == lhs
97
85
  return 1 if operation == :/
98
86
  end
99
87
  # If we weren't able to find any matches, return false so we can bail out.
100
88
  false
101
89
  end
102
- # rubocop :enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
103
90
  end
104
91
  end
105
92
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Looks for references of Regexp captures that are out of range
6
+ # Looks for references of `Regexp` captures that are out of range
7
7
  # and thus always returns nil.
8
8
  #
9
9
  # @safety
@@ -61,6 +61,7 @@ module RuboCop
61
61
  check_regexp(node.receiver)
62
62
  end
63
63
  end
64
+ alias after_csend after_send
64
65
 
65
66
  def on_when(node)
66
67
  regexp_conditions = node.conditions.select(&:regexp_type?)
@@ -38,16 +38,12 @@ module RuboCop
38
38
 
39
39
  def valid_context?(node)
40
40
  return true unless node.arguments.one? && node.first_argument.parenthesized_call?
41
- return true if first_argument_block_type?(node.first_argument)
41
+ return true if node.first_argument.any_block_type?
42
42
 
43
43
  node.operator_method? || node.setter_method? || chained_calls?(node) ||
44
44
  valid_first_argument?(node.first_argument)
45
45
  end
46
46
 
47
- def first_argument_block_type?(first_arg)
48
- first_arg.block_type? || first_arg.numblock_type?
49
- end
50
-
51
47
  def valid_first_argument?(first_arg)
52
48
  first_arg.operator_keyword? || first_arg.hash_type? || ternary_expression?(first_arg) ||
53
49
  compound_range?(first_arg)
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for redundant quantifiers inside Regexp literals.
6
+ # Checks for redundant quantifiers inside `Regexp` literals.
7
7
  #
8
8
  # It is always allowed when interpolation is used in a regexp literal,
9
9
  # because it's unknown what kind of string will be expanded as a result:
@@ -29,7 +29,7 @@ module RuboCop
29
29
  RESTRICT_ON_SEND = %i[print puts warn].freeze
30
30
 
31
31
  # @!method to_s_without_args?(node)
32
- def_node_matcher :to_s_without_args?, '(send _ :to_s)'
32
+ def_node_matcher :to_s_without_args?, '(call _ :to_s)'
33
33
 
34
34
  def on_interpolation(begin_node)
35
35
  final_node = begin_node.children.last
@@ -42,7 +42,7 @@ module RuboCop
42
42
  def on_send(node)
43
43
  return if node.receiver
44
44
 
45
- node.each_child_node(:send) do |child|
45
+ node.each_child_node(:call) do |child|
46
46
  next if !child.method?(:to_s) || child.arguments.any?
47
47
 
48
48
  register_offense(child, "`#{node.method_name}`")
@@ -0,0 +1,231 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for redundant uses of `to_s`, `to_sym`, `to_i`, `to_f`, `to_r`, `to_c`,
7
+ # `to_a`, `to_h`, and `to_set`.
8
+ #
9
+ # When one of these methods is called on an object of the same type, that object
10
+ # is returned, making the call unnecessary. The cop detects conversion methods called
11
+ # on object literals, class constructors, class `[]` methods, and the `Kernel` methods
12
+ # `String()`, `Integer()`, `Float()`, `Rational()`, `Complex()` and `Array()`.
13
+ #
14
+ # Specifically, these cases are detected for each conversion method:
15
+ #
16
+ # * `to_s` when called on a string literal, interpolated string, heredoc,
17
+ # or with `String.new` or `String()`.
18
+ # * `to_sym` when called on a symbol literal or interpolated symbol.
19
+ # * `to_i` when called on an integer literal or with `Integer()`.
20
+ # * `to_f` when called on a float literal of with `Float()`.
21
+ # * `to_r` when called on a rational literal or with `Rational()`.
22
+ # * `to_c` when called on a complex literal of with `Complex()`.
23
+ # * `to_a` when called on an array literal, or with `Array.new`, `Array()` or `Array[]`.
24
+ # * `to_h` when called on a hash literal, or with `Hash.new`, `Hash()` or `Hash[]`.
25
+ # * `to_set` when called on `Set.new` or `Set[]`.
26
+ #
27
+ # In all cases, chaining one same `to_*` conversion methods listed above is redundant.
28
+ #
29
+ # The cop can also register an offense for chaining conversion methods on methods that are
30
+ # expected to return a specific type regardless of receiver (eg. `foo.inspect.to_s`).
31
+ #
32
+ # @example
33
+ # # bad
34
+ # "text".to_s
35
+ # :sym.to_sym
36
+ # 42.to_i
37
+ # 8.5.to_f
38
+ # 12r.to_r
39
+ # 1i.to_c
40
+ # [].to_a
41
+ # {}.to_h
42
+ # Set.new.to_s
43
+ #
44
+ # # good
45
+ # "text"
46
+ # :sym
47
+ # 42
48
+ # 8.5
49
+ # 12r
50
+ # 1i
51
+ # []
52
+ # {}
53
+ # Set.new
54
+ #
55
+ # # bad - chaining the same conversion
56
+ # foo.to_s.to_s
57
+ #
58
+ # # good
59
+ # foo.to_s
60
+ #
61
+ # # bad - chaining a conversion to a method that is expected to return the same type
62
+ # inspect.to_s
63
+ #
64
+ # # good
65
+ # inspect
66
+ #
67
+ class RedundantTypeConversion < Base
68
+ extend AutoCorrector
69
+
70
+ MSG = 'Redundant `%<method>s` detected.'
71
+
72
+ # Maps conversion methods to the node types for the literals of that type
73
+ LITERAL_NODE_TYPES = {
74
+ to_s: %i[str dstr],
75
+ to_sym: %i[sym dsym],
76
+ to_i: %i[int],
77
+ to_f: %i[float],
78
+ to_r: %i[rational],
79
+ to_c: %i[complex],
80
+ to_a: %i[array],
81
+ to_h: %i[hash],
82
+ to_set: [] # sets don't have a literal or node type
83
+ }.freeze
84
+
85
+ # Maps each conversion method to the pattern matcher for that type's constructors
86
+ # Not every type has a constructor, for instance Symbol.
87
+ CONSTRUCTOR_MAPPING = {
88
+ to_s: 'string_constructor?',
89
+ to_i: 'integer_constructor?',
90
+ to_f: 'float_constructor?',
91
+ to_r: 'rational_constructor?',
92
+ to_c: 'complex_constructor?',
93
+ to_a: 'array_constructor?',
94
+ to_h: 'hash_constructor?',
95
+ to_set: 'set_constructor?'
96
+ }.freeze
97
+
98
+ # Methods that already are expected to return a given type, which makes a further
99
+ # conversion redundant.
100
+ TYPED_METHODS = { to_s: %i[inspect] }.freeze
101
+
102
+ CONVERSION_METHODS = Set[*LITERAL_NODE_TYPES.keys].freeze
103
+ RESTRICT_ON_SEND = CONVERSION_METHODS
104
+
105
+ private_constant :LITERAL_NODE_TYPES, :CONSTRUCTOR_MAPPING
106
+
107
+ # @!method type_constructor?(node, type_symbol)
108
+ def_node_matcher :type_constructor?, <<~PATTERN
109
+ (send {nil? (const {cbase nil?} :Kernel)} %1 ...)
110
+ PATTERN
111
+
112
+ # @!method string_constructor?(node)
113
+ def_node_matcher :string_constructor?, <<~PATTERN
114
+ {
115
+ (send (const {cbase nil?} :String) :new ...)
116
+ #type_constructor?(:String)
117
+ }
118
+ PATTERN
119
+
120
+ # @!method integer_constructor?(node)
121
+ def_node_matcher :integer_constructor?, <<~PATTERN
122
+ #type_constructor?(:Integer)
123
+ PATTERN
124
+
125
+ # @!method float_constructor?(node)
126
+ def_node_matcher :float_constructor?, <<~PATTERN
127
+ #type_constructor?(:Float)
128
+ PATTERN
129
+
130
+ # @!method rational_constructor?(node)
131
+ def_node_matcher :rational_constructor?, <<~PATTERN
132
+ #type_constructor?(:Rational)
133
+ PATTERN
134
+
135
+ # @!method complex_constructor?(node)
136
+ def_node_matcher :complex_constructor?, <<~PATTERN
137
+ #type_constructor?(:Complex)
138
+ PATTERN
139
+
140
+ # @!method array_constructor?(node)
141
+ def_node_matcher :array_constructor?, <<~PATTERN
142
+ {
143
+ (send (const {cbase nil?} :Array) {:new :[]} ...)
144
+ #type_constructor?(:Array)
145
+ }
146
+ PATTERN
147
+
148
+ # @!method hash_constructor?(node)
149
+ def_node_matcher :hash_constructor?, <<~PATTERN
150
+ {
151
+ (block (send (const {cbase nil?} :Hash) :new) ...)
152
+ (send (const {cbase nil?} :Hash) {:new :[]} ...)
153
+ (send {nil? (const {cbase nil?} :Kernel)} :Hash ...)
154
+ }
155
+ PATTERN
156
+
157
+ # @!method set_constructor?(node)
158
+ def_node_matcher :set_constructor?, <<~PATTERN
159
+ {
160
+ (send (const {cbase nil?} :Set) {:new :[]} ...)
161
+ }
162
+ PATTERN
163
+
164
+ # rubocop:disable Metrics/AbcSize
165
+ def on_send(node)
166
+ return if hash_or_set_with_block?(node)
167
+
168
+ receiver = find_receiver(node)
169
+ return unless literal_receiver?(node, receiver) ||
170
+ constructor?(node, receiver) ||
171
+ chained_conversion?(node, receiver) ||
172
+ chained_to_typed_method?(node, receiver)
173
+
174
+ message = format(MSG, method: node.method_name)
175
+
176
+ add_offense(node.loc.selector, message: message) do |corrector|
177
+ corrector.remove(node.loc.dot.join(node.loc.selector))
178
+ end
179
+ end
180
+ # rubocop:enable Metrics/AbcSize
181
+ alias on_csend on_send
182
+
183
+ private
184
+
185
+ def hash_or_set_with_block?(node)
186
+ return false if !node.method?(:to_h) && !node.method?(:to_set)
187
+
188
+ node.parent&.any_block_type? || node.last_argument&.block_pass_type?
189
+ end
190
+
191
+ def find_receiver(node)
192
+ receiver = node.receiver
193
+ return unless receiver
194
+
195
+ while receiver.begin_type?
196
+ break unless receiver.children.one?
197
+
198
+ receiver = receiver.children.first
199
+ end
200
+
201
+ receiver
202
+ end
203
+
204
+ def literal_receiver?(node, receiver)
205
+ return false unless receiver
206
+
207
+ receiver.type?(*LITERAL_NODE_TYPES[node.method_name])
208
+ end
209
+
210
+ def constructor?(node, receiver)
211
+ matcher = CONSTRUCTOR_MAPPING[node.method_name]
212
+ return false unless matcher
213
+
214
+ public_send(matcher, receiver)
215
+ end
216
+
217
+ def chained_conversion?(node, receiver)
218
+ return false unless receiver&.call_type?
219
+
220
+ receiver.method?(node.method_name)
221
+ end
222
+
223
+ def chained_to_typed_method?(node, receiver)
224
+ return false unless receiver&.call_type?
225
+
226
+ TYPED_METHODS.fetch(node.method_name, []).include?(receiver.method_name)
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Lint
6
- # Checks for `rescue` blocks targeting the Exception class.
6
+ # Checks for `rescue` blocks targeting the `Exception` class.
7
7
  #
8
8
  # @example
9
9
  #
@@ -33,7 +33,7 @@ module RuboCop
33
33
  def_node_matcher :bad_method?, <<~PATTERN
34
34
  {
35
35
  (send $(csend ...) $_ ...)
36
- (send $({block numblock} (csend ...) ...) $_ ...)
36
+ (send $(any_block (csend ...) ...) $_ ...)
37
37
  }
38
38
  PATTERN
39
39
 
@@ -97,12 +97,19 @@ module RuboCop
97
97
  end
98
98
 
99
99
  def require_parentheses?(send_node)
100
+ return true if operator_inside_hash?(send_node)
100
101
  return false unless send_node.comparison_method?
101
102
  return false unless (node = send_node.parent)
102
103
 
103
104
  (node.respond_to?(:logical_operator?) && node.logical_operator?) ||
104
105
  (node.respond_to?(:comparison_method?) && node.comparison_method?)
105
106
  end
107
+
108
+ def operator_inside_hash?(send_node)
109
+ # If an operator call (without a dot) is inside a hash, it needs
110
+ # to be parenthesized when converted to safe navigation.
111
+ send_node.parent&.pair_type? && !send_node.loc.dot
112
+ end
106
113
  end
107
114
  end
108
115
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for `Hash` creation with a mutable default value.
7
+ # Creating a `Hash` in such a way will share the default value
8
+ # across all keys, causing unexpected behavior when modifying it.
9
+ #
10
+ # For example, when the `Hash` was created with an `Array` as the argument,
11
+ # calling `hash[:foo] << 'bar'` will also change the value of all
12
+ # other keys that have not been explicitly assigned to.
13
+ #
14
+ # @example
15
+ # # bad
16
+ # Hash.new([])
17
+ # Hash.new({})
18
+ # Hash.new(Array.new)
19
+ # Hash.new(Hash.new)
20
+ #
21
+ # # okay -- In rare cases that intentionally have this behavior,
22
+ # # without disabling the cop, you can set the default explicitly.
23
+ # h = Hash.new
24
+ # h.default = []
25
+ # h[:a] << 1
26
+ # h[:b] << 2
27
+ # h # => {:a => [1, 2], :b => [1, 2]}
28
+ #
29
+ # # okay -- beware this will discard mutations and only remember assignments
30
+ # Hash.new { Array.new }
31
+ # Hash.new { Hash.new }
32
+ # Hash.new { {} }
33
+ # Hash.new { [] }
34
+ #
35
+ # # good - frozen solution will raise an error when mutation attempted
36
+ # Hash.new([].freeze)
37
+ # Hash.new({}.freeze)
38
+ #
39
+ # # good - using a proc will create a new object for each key
40
+ # h = Hash.new
41
+ # h.default_proc = ->(h, k) { [] }
42
+ # h.default_proc = ->(h, k) { {} }
43
+ #
44
+ # # good - using a block will create a new object for each key
45
+ # Hash.new { |h, k| h[k] = [] }
46
+ # Hash.new { |h, k| h[k] = {} }
47
+ class SharedMutableDefault < Base
48
+ MSG = 'Do not create a Hash with a mutable default value ' \
49
+ 'as the default value can accidentally be changed.'
50
+ RESTRICT_ON_SEND = %i[new].freeze
51
+
52
+ # @!method hash_initialized_with_mutable_shared_object?(node)
53
+ def_node_matcher :hash_initialized_with_mutable_shared_object?, <<~PATTERN
54
+ (send (const {nil? cbase} :Hash) :new {array hash (send (const {nil? cbase} {:Array :Hash}) :new)})
55
+ PATTERN
56
+
57
+ def on_send(node)
58
+ return unless hash_initialized_with_mutable_shared_object?(node)
59
+
60
+ add_offense(node)
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -116,7 +116,7 @@ module RuboCop
116
116
  private
117
117
 
118
118
  def comment_between_rescue_and_end?(node)
119
- ancestor = node.each_ancestor(:kwbegin, :def, :defs, :block, :numblock).first
119
+ ancestor = node.each_ancestor(:kwbegin, :def, :defs, :any_block).first
120
120
  return false unless ancestor
121
121
 
122
122
  end_line = ancestor.loc.end&.line || ancestor.loc.last_line
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Lint
6
+ # Checks for cases where exceptions unrelated to the numeric constructors `Integer()`,
7
+ # `Float()`, `BigDecimal()`, `Complex()`, and `Rational()` may be unintentionally swallowed.
8
+ #
9
+ # @safety
10
+ # The cop is unsafe for autocorrection because unexpected errors occurring in the argument
11
+ # passed to numeric constructor (e.g., `Integer()`) can lead to incompatible behavior.
12
+ # For example, changing it to `Integer(potential_exception_method_call, exception: false)`
13
+ # ensures that exceptions raised by `potential_exception_method_call` are not ignored.
14
+ #
15
+ # [source,ruby]
16
+ # ----
17
+ # Integer(potential_exception_method_call) rescue nil
18
+ # ----
19
+ #
20
+ # @example
21
+ #
22
+ # # bad
23
+ # Integer(arg) rescue nil
24
+ #
25
+ # # bad
26
+ # begin
27
+ # Integer(arg)
28
+ # rescue
29
+ # nil
30
+ # end
31
+ #
32
+ # # bad
33
+ # begin
34
+ # Integer(arg)
35
+ # rescue
36
+ # end
37
+ #
38
+ # # good
39
+ # Integer(arg, exception: false)
40
+ #
41
+ class SuppressedExceptionInNumberConversion < Base
42
+ extend AutoCorrector
43
+ extend TargetRubyVersion
44
+
45
+ MSG = 'Use `%<prefer>s` instead.'
46
+ EXPECTED_EXCEPTION_CLASSES = %w[ArgumentError TypeError ::ArgumentError ::TypeError].freeze
47
+
48
+ # @!method numeric_constructor_rescue_nil(node)
49
+ def_node_matcher :numeric_constructor_rescue_nil, <<~PATTERN
50
+ (rescue
51
+ $#numeric_method?
52
+ (resbody nil? nil? (nil)) nil?)
53
+ PATTERN
54
+
55
+ # @!method begin_numeric_constructor_rescue_nil(node)
56
+ def_node_matcher :begin_numeric_constructor_rescue_nil, <<~PATTERN
57
+ (kwbegin
58
+ (rescue
59
+ $#numeric_method?
60
+ (resbody $_? nil?
61
+ {(nil) nil?}) nil?))
62
+ PATTERN
63
+
64
+ # @!method numeric_method?(node)
65
+ def_node_matcher :numeric_method?, <<~PATTERN
66
+ {
67
+ (call #constructor_receiver? {:Integer :BigDecimal :Complex :Rational}
68
+ _ _?)
69
+ (call #constructor_receiver? :Float
70
+ _)
71
+ }
72
+ PATTERN
73
+
74
+ # @!method constructor_receiver?(node)
75
+ def_node_matcher :constructor_receiver?, <<~PATTERN
76
+ {nil? (const {nil? cbase} :Kernel)}
77
+ PATTERN
78
+
79
+ minimum_target_ruby_version 2.6
80
+
81
+ # rubocop:disable Metrics/AbcSize
82
+ def on_rescue(node)
83
+ if (method, exception_classes = begin_numeric_constructor_rescue_nil(node.parent))
84
+ return unless expected_exception_classes_only?(exception_classes)
85
+
86
+ node = node.parent
87
+ else
88
+ return unless (method = numeric_constructor_rescue_nil(node))
89
+ end
90
+
91
+ arguments = method.arguments.map(&:source) << 'exception: false'
92
+ prefer = "#{method.method_name}(#{arguments.join(', ')})"
93
+ prefer = "#{method.receiver.source}#{method.loc.dot.source}#{prefer}" if method.receiver
94
+
95
+ add_offense(node, message: format(MSG, prefer: prefer)) do |corrector|
96
+ corrector.replace(node, prefer)
97
+ end
98
+ end
99
+ # rubocop:enable Metrics/AbcSize
100
+
101
+ private
102
+
103
+ def expected_exception_classes_only?(exception_classes)
104
+ return true unless (arguments = exception_classes.first)
105
+
106
+ (arguments.values.map(&:source) - EXPECTED_EXCEPTION_CLASSES).none?
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -78,7 +78,7 @@ module RuboCop
78
78
  def on_send(node)
79
79
  return unless node.receiver
80
80
 
81
- if node.receiver.str_type? || node.receiver.sym_type?
81
+ if node.receiver.type?(:str, :sym)
82
82
  register_offense(node, correction: node.receiver.value.to_sym.inspect)
83
83
  elsif node.receiver.dstr_type?
84
84
  register_offense(node, correction: ":\"#{node.receiver.value.to_sym}\"")
@@ -6,9 +6,12 @@ module RuboCop
6
6
  # Repacks Parser's diagnostics/errors
7
7
  # into RuboCop's offenses.
8
8
  class Syntax < Base
9
+ LEVELS = %i[error fatal].freeze
10
+
9
11
  def on_other_file
10
12
  add_offense_from_error(processed_source.parser_error) if processed_source.parser_error
11
- processed_source.diagnostics.each do |diagnostic|
13
+ syntax_errors = processed_source.diagnostics.select { |d| LEVELS.include?(d.level) }
14
+ syntax_errors.each do |diagnostic|
12
15
  add_offense_from_diagnostic(diagnostic, processed_source.ruby_version)
13
16
  end
14
17
  super
@@ -55,12 +55,9 @@ module RuboCop
55
55
  return if node.each_descendant(:dstr).any?
56
56
 
57
57
  regexp_constructor(node) do |text|
58
- Regexp::Parser.parse(text.value)&.each_expression do |expr|
58
+ parse_regexp(text.value)&.each_expression do |expr|
59
59
  detect_offenses(text, expr)
60
60
  end
61
- rescue Regexp::Parser::Error
62
- # Upon encountering an invalid regular expression,
63
- # we aim to proceed and identify any remaining potential offenses.
64
61
  end
65
62
  end
66
63
 
@@ -81,7 +81,7 @@ module RuboCop
81
81
  node.arguments.count do |arg|
82
82
  return Float::INFINITY if arg.restarg_type?
83
83
 
84
- arg.arg_type? || arg.optarg_type? || arg.mlhs_type?
84
+ arg.type?(:arg, :optarg, :mlhs)
85
85
  end
86
86
  end
87
87
  end