rubocop 1.68.0 → 1.71.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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +77 -8
  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/comment_config.rb +1 -1
  8. data/lib/rubocop/config.rb +13 -4
  9. data/lib/rubocop/config_loader.rb +4 -0
  10. data/lib/rubocop/config_loader_resolver.rb +14 -3
  11. data/lib/rubocop/config_validator.rb +18 -8
  12. data/lib/rubocop/cop/autocorrect_logic.rb +32 -35
  13. data/lib/rubocop/cop/base.rb +7 -1
  14. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  15. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  16. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  17. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  18. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
  19. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
  20. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
  21. data/lib/rubocop/cop/generator.rb +6 -0
  22. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  23. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  24. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  25. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  26. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  27. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  28. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  29. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +229 -0
  30. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  31. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  32. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  33. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  34. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  35. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  36. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  37. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  38. data/lib/rubocop/cop/internal_affairs.rb +5 -0
  39. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  40. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
  41. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  42. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  43. data/lib/rubocop/cop/layout/block_alignment.rb +1 -2
  44. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  45. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  46. data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
  47. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  48. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  49. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +3 -3
  50. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  51. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
  52. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -1
  53. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  54. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  55. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  56. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  57. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  58. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  59. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  60. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  61. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +1 -0
  62. data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
  63. data/lib/rubocop/cop/layout/leading_comment_space.rb +15 -0
  64. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  65. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  66. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  67. data/lib/rubocop/cop/layout/line_length.rb +119 -4
  68. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  69. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  70. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  71. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +2 -2
  72. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  73. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
  74. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  75. data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
  76. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
  77. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  78. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  79. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  80. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  81. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  82. data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
  83. data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
  84. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  86. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +6 -0
  87. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
  88. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
  89. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  90. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  91. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  92. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  93. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
  94. data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
  95. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  96. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  97. data/lib/rubocop/cop/lint/debugger.rb +1 -1
  98. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  99. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  100. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  102. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  103. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  104. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  105. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  106. data/lib/rubocop/cop/lint/float_comparison.rb +19 -8
  107. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
  108. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  109. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  110. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  111. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
  112. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
  113. data/lib/rubocop/cop/lint/literal_as_condition.rb +1 -0
  114. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
  115. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  116. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  117. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
  118. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  119. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  120. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  121. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
  122. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +5 -3
  123. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  124. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  125. data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
  126. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  127. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +93 -0
  128. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
  129. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  130. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  131. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
  132. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  133. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
  134. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
  135. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  136. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  137. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  138. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  139. data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
  140. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  141. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
  142. data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
  143. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  144. data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
  145. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  146. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  147. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  148. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
  149. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
  150. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  151. data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
  152. data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
  153. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  154. data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
  155. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  156. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  157. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  158. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  159. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  160. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  161. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  162. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
  163. data/lib/rubocop/cop/lint/void.rb +8 -11
  164. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  165. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  166. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  167. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  168. data/lib/rubocop/cop/metrics/method_length.rb +8 -1
  169. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  170. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  171. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  172. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -3
  173. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  174. data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
  175. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  176. data/lib/rubocop/cop/mixin/comments_help.rb +7 -2
  177. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  178. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
  179. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
  180. data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
  181. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  182. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  183. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
  184. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  185. data/lib/rubocop/cop/mixin/range_help.rb +0 -1
  186. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  187. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  188. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  189. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  190. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  191. data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -3
  192. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  193. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  194. data/lib/rubocop/cop/naming/constant_name.rb +6 -7
  195. data/lib/rubocop/cop/naming/file_name.rb +0 -2
  196. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
  197. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
  198. data/lib/rubocop/cop/naming/variable_name.rb +3 -4
  199. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  200. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  201. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  202. data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
  203. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +1 -1
  204. data/lib/rubocop/cop/style/and_or.rb +1 -1
  205. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  206. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  207. data/lib/rubocop/cop/style/array_intersect.rb +5 -4
  208. data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -1
  209. data/lib/rubocop/cop/style/block_delimiters.rb +24 -22
  210. data/lib/rubocop/cop/style/case_like_if.rb +8 -11
  211. data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
  212. data/lib/rubocop/cop/style/collection_methods.rb +1 -1
  213. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  214. data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
  215. data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
  216. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  217. data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
  218. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  219. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  220. data/lib/rubocop/cop/style/documentation.rb +1 -1
  221. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  222. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  223. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  224. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  225. data/lib/rubocop/cop/style/empty_literal.rb +1 -1
  226. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  227. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  228. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  229. data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
  230. data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
  231. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  232. data/lib/rubocop/cop/style/file_null.rb +89 -0
  233. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  234. data/lib/rubocop/cop/style/float_division.rb +8 -4
  235. data/lib/rubocop/cop/style/for.rb +0 -1
  236. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
  237. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  238. data/lib/rubocop/cop/style/guard_clause.rb +1 -1
  239. data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
  240. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
  241. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  242. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  243. data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
  244. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  245. data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
  246. data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
  247. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
  248. data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
  249. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  250. data/lib/rubocop/cop/style/inverse_methods.rb +6 -7
  251. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  252. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +2 -2
  253. data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
  254. data/lib/rubocop/cop/style/lambda_call.rb +3 -2
  255. data/lib/rubocop/cop/style/map_into_array.rb +1 -1
  256. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  257. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  258. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -13
  259. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  260. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
  261. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
  262. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  263. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  264. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
  265. data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
  266. data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
  267. data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
  268. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  269. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  270. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  271. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  272. data/lib/rubocop/cop/style/not.rb +1 -1
  273. data/lib/rubocop/cop/style/object_then.rb +14 -15
  274. data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
  275. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  276. data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
  277. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  278. data/lib/rubocop/cop/style/parallel_assignment.rb +9 -18
  279. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  280. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  281. data/lib/rubocop/cop/style/proc.rb +1 -2
  282. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  283. data/lib/rubocop/cop/style/raise_args.rb +7 -5
  284. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  285. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  286. data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
  287. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  288. data/lib/rubocop/cop/style/redundant_condition.rb +38 -23
  289. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
  290. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  291. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  292. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  293. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  294. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  295. data/lib/rubocop/cop/style/redundant_line_continuation.rb +44 -23
  296. data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -12
  297. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
  298. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  299. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  300. data/lib/rubocop/cop/style/redundant_return.rb +2 -2
  301. data/lib/rubocop/cop/style/redundant_self.rb +8 -15
  302. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  303. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  304. data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
  305. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  306. data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
  307. data/lib/rubocop/cop/style/return_nil.rb +1 -1
  308. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  309. data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
  310. data/lib/rubocop/cop/style/self_assignment.rb +11 -17
  311. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  312. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  313. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  314. data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
  315. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  316. data/lib/rubocop/cop/style/single_line_do_end_block.rb +12 -3
  317. data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
  318. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  319. data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
  320. data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
  321. data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
  322. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  323. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  324. data/lib/rubocop/cop/style/super_arguments.rb +65 -17
  325. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  326. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  327. data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
  328. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  329. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  330. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  331. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  332. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  333. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  334. data/lib/rubocop/cop/util.rb +11 -4
  335. data/lib/rubocop/cop/variable_force/variable.rb +14 -2
  336. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  337. data/lib/rubocop/cop/variable_force.rb +4 -10
  338. data/lib/rubocop/cops_documentation_generator.rb +22 -14
  339. data/lib/rubocop/directive_comment.rb +9 -8
  340. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  341. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  342. data/lib/rubocop/lsp/logger.rb +2 -2
  343. data/lib/rubocop/lsp/routes.rb +7 -23
  344. data/lib/rubocop/lsp/runtime.rb +15 -49
  345. data/lib/rubocop/lsp/stdin_runner.rb +83 -0
  346. data/lib/rubocop/magic_comment.rb +3 -3
  347. data/lib/rubocop/options.rb +2 -1
  348. data/lib/rubocop/path_util.rb +11 -8
  349. data/lib/rubocop/result_cache.rb +13 -13
  350. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  351. data/lib/rubocop/rspec/shared_contexts.rb +4 -1
  352. data/lib/rubocop/rspec/support.rb +1 -2
  353. data/lib/rubocop/runner.rb +5 -6
  354. data/lib/rubocop/target_finder.rb +1 -0
  355. data/lib/rubocop/target_ruby.rb +15 -0
  356. data/lib/rubocop/version.rb +1 -1
  357. data/lib/rubocop.rb +14 -0
  358. data/lib/ruby_lsp/rubocop/addon.rb +78 -0
  359. data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +50 -0
  360. metadata +36 -15
  361. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -68,7 +68,7 @@ module RuboCop
68
68
  end
69
69
 
70
70
  def autocorrect(corrector, node)
71
- if node.while_post_type? || node.until_post_type?
71
+ if node.type?(:while_post, :until_post)
72
72
  replace_begin_end_with_modifier(corrector, node)
73
73
  elsif node.modifier_form?
74
74
  replace_source(corrector, node.source_range, modifier_replacement(node))
@@ -41,7 +41,6 @@ module RuboCop
41
41
  # f != 1
42
42
  # end
43
43
  class InverseMethods < Base
44
- include IgnoredNode
45
44
  include RangeHelp
46
45
  extend AutoCorrector
47
46
 
@@ -61,18 +60,18 @@ module RuboCop
61
60
  def_node_matcher :inverse_candidate?, <<~PATTERN
62
61
  {
63
62
  (send $(call $(...) $_ $...) :!)
64
- (send ({block numblock} $(call $(...) $_) $...) :!)
63
+ (send (any_block $(call $(...) $_) $...) :!)
65
64
  (send (begin $(call $(...) $_ $...)) :!)
66
65
  }
67
66
  PATTERN
68
67
 
69
68
  # @!method inverse_block?(node)
70
69
  def_node_matcher :inverse_block?, <<~PATTERN
71
- ({block numblock} $(call (...) $_) ... { $(call ... :!)
72
- $(send (...) {:!= :!~} ...)
73
- (begin ... $(call ... :!))
74
- (begin ... $(send (...) {:!= :!~} ...))
75
- })
70
+ (any_block $(call (...) $_) ... { $(call ... :!)
71
+ $(send (...) {:!= :!~} ...)
72
+ (begin ... $(call ... :!))
73
+ (begin ... $(send (...) {:!= :!~} ...))
74
+ })
76
75
  PATTERN
77
76
 
78
77
  def on_send(node)
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for assignments to a local `it` variable inside a block
7
+ # where `it` can refer to the first anonymous parameter as of Ruby 3.4.
8
+ #
9
+ # Although Ruby allows reassigning `it` in these cases, it could
10
+ # cause confusion if `it` is used as a block parameter elsewhere.
11
+ # For consistency, this also applies to numblocks and blocks with
12
+ # parameters, even though `it` cannot be used in those cases.
13
+ #
14
+ # @example
15
+ # # bad
16
+ # foo { it = 5 }
17
+ # foo { |bar| it = bar }
18
+ # foo { it = _2 }
19
+ #
20
+ # # good - use a different variable name
21
+ # foo { var = 5 }
22
+ # foo { |bar| var = bar }
23
+ # foo { bar = _2 }
24
+ class ItAssignment < Base
25
+ MSG = '`it` is the default block parameter; consider another name.'
26
+
27
+ def on_lvasgn(node)
28
+ return unless node.name == :it
29
+ return unless node.each_ancestor(:any_block).any?
30
+
31
+ add_offense(node.loc.name)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -6,8 +6,8 @@ module RuboCop
6
6
  # When passing an existing hash as keyword arguments, provide additional arguments
7
7
  # directly rather than using `merge`.
8
8
  #
9
- # Providing arguments directly is more performant, than using `merge`, and
10
- # also leads to a shorter and simpler code.
9
+ # Providing arguments directly is more performant than using `merge`, and
10
+ # also leads to shorter and simpler code.
11
11
  #
12
12
  # @example
13
13
  # # bad
@@ -57,7 +57,7 @@ module RuboCop
57
57
 
58
58
  def append_newline_to_last_kwoptarg(arguments, corrector)
59
59
  last_argument = arguments.last
60
- return if last_argument.kwrestarg_type? || last_argument.blockarg_type?
60
+ return if last_argument.type?(:kwrestarg, :blockarg)
61
61
 
62
62
  last_kwoptarg = arguments.reverse.find(&:kwoptarg_type?)
63
63
  corrector.insert_after(last_kwoptarg, "\n") unless arguments.parent.block_type?
@@ -20,7 +20,6 @@ module RuboCop
20
20
  # lambda.(x, y)
21
21
  class LambdaCall < Base
22
22
  include ConfigurableEnforcedStyle
23
- include IgnoredNode
24
23
  extend AutoCorrector
25
24
 
26
25
  MSG = 'Prefer the use of `%<prefer>s` over `%<current>s`.'
@@ -45,6 +44,7 @@ module RuboCop
45
44
  correct_style_detected
46
45
  end
47
46
  end
47
+ alias on_csend on_send
48
48
 
49
49
  private
50
50
 
@@ -55,9 +55,10 @@ module RuboCop
55
55
  def prefer(node)
56
56
  receiver = node.receiver.source
57
57
  arguments = node.arguments.map(&:source).join(', ')
58
+ dot = node.loc.dot.source
58
59
  method = explicit_style? ? "call(#{arguments})" : "(#{arguments})"
59
60
 
60
- "#{receiver}.#{method}"
61
+ "#{receiver}#{dot}#{method}"
61
62
  end
62
63
 
63
64
  def implicit_style?
@@ -72,7 +72,7 @@ module RuboCop
72
72
  def_node_matcher :each_block_with_push?, <<-PATTERN
73
73
  [
74
74
  ^({begin kwbegin block} ...)
75
- ({block numblock} (send !{nil? self} :each) _
75
+ (any_block (send !{nil? self} :each) _
76
76
  (send (lvar _) {:<< :push :append} #suitable_argument_node?))
77
77
  ]
78
78
  PATTERN
@@ -40,7 +40,7 @@ module RuboCop
40
40
  # @!method map_to_h(node)
41
41
  def_node_matcher :map_to_h, <<~PATTERN
42
42
  {
43
- $(call ({block numblock} $(call _ {:map :collect}) ...) :to_h)
43
+ $(call (any_block $(call _ {:map :collect}) ...) :to_h)
44
44
  $(call $(call _ {:map :collect} (block_pass sym)) :to_h)
45
45
  }
46
46
  PATTERN
@@ -33,8 +33,8 @@ module RuboCop
33
33
  # @!method map_to_set?(node)
34
34
  def_node_matcher :map_to_set?, <<~PATTERN
35
35
  {
36
- $(send ({block numblock} $(send _ {:map :collect}) ...) :to_set)
37
- $(send $(send _ {:map :collect} (block_pass sym)) :to_set)
36
+ $(call (any_block $(call _ {:map :collect}) ...) :to_set)
37
+ $(call $(call _ {:map :collect} (block_pass sym)) :to_set)
38
38
  }
39
39
  PATTERN
40
40
 
@@ -49,6 +49,7 @@ module RuboCop
49
49
  autocorrect(corrector, to_set_node, map_node)
50
50
  end
51
51
  end
52
+ alias on_csend on_send
52
53
 
53
54
  private
54
55
 
@@ -111,9 +111,7 @@ module RuboCop
111
111
  parent = node.parent&.block_type? ? node.parent.parent : node.parent
112
112
  return false unless parent
113
113
 
114
- parent.pair_type? ||
115
- parent.array_type? ||
116
- parent.range_type? ||
114
+ parent.type?(:pair, :array, :range) ||
117
115
  splat?(parent) ||
118
116
  ternary_if?(parent)
119
117
  end
@@ -128,46 +126,48 @@ module RuboCop
128
126
  end
129
127
 
130
128
  def call_in_optional_arguments?(node)
131
- node.parent && (node.parent.optarg_type? || node.parent.kwoptarg_type?)
129
+ node.parent&.type?(:optarg, :kwoptarg)
132
130
  end
133
131
 
134
132
  def call_in_single_line_inheritance?(node)
135
133
  node.parent&.class_type? && node.parent.single_line?
136
134
  end
137
135
 
138
- def call_with_ambiguous_arguments?(node) # rubocop:disable Metrics/PerceivedComplexity
136
+ # rubocop:disable Metrics/PerceivedComplexity
137
+ def call_with_ambiguous_arguments?(node)
139
138
  call_with_braced_block?(node) ||
140
139
  call_in_argument_with_block?(node) ||
141
140
  call_as_argument_or_chain?(node) ||
142
141
  call_in_match_pattern?(node) ||
143
142
  hash_literal_in_arguments?(node) ||
143
+ ambiguous_range_argument?(node) ||
144
144
  node.descendants.any? do |n|
145
- n.forwarded_args_type? || n.block_type? || n.numblock_type? ||
145
+ n.type?(:forwarded_args, :any_block) ||
146
146
  ambiguous_literal?(n) || logical_operator?(n)
147
147
  end
148
148
  end
149
+ # rubocop:enable Metrics/PerceivedComplexity
149
150
 
150
151
  def call_with_braced_block?(node)
151
- (node.call_type? || node.super_type?) && node.block_node&.braces?
152
+ node.type?(:call, :super) && node.block_node&.braces?
152
153
  end
153
154
 
154
155
  def call_in_argument_with_block?(node)
155
156
  parent = node.parent&.block_type? && node.parent.parent
156
157
  return false unless parent
157
158
 
158
- parent.call_type? || parent.super_type? || parent.yield_type?
159
+ parent.type?(:call, :super, :yield)
159
160
  end
160
161
 
161
162
  def call_as_argument_or_chain?(node)
162
- node.parent &&
163
- (node.parent.call_type? || node.parent.super_type? || node.parent.yield_type?) &&
163
+ node.parent&.type?(:call, :super, :yield) &&
164
164
  !assigned_before?(node.parent, node)
165
165
  end
166
166
 
167
167
  def call_in_match_pattern?(node)
168
168
  return false unless (parent = node.parent)
169
169
 
170
- parent.match_pattern_type? || parent.match_pattern_p_type?
170
+ parent.type?(:match_pattern, :match_pattern_p)
171
171
  end
172
172
 
173
173
  def hash_literal_in_arguments?(node)
@@ -177,6 +177,13 @@ module RuboCop
177
177
  end
178
178
  end
179
179
 
180
+ def ambiguous_range_argument?(node)
181
+ return true if (first_arg = node.first_argument)&.range_type? && first_arg.begin.nil?
182
+ return true if (last_arg = node.last_argument)&.range_type? && last_arg.end.nil?
183
+
184
+ false
185
+ end
186
+
180
187
  def allowed_multiline_call_with_parentheses?(node)
181
188
  cop_config['AllowParenthesesInMultilineCall'] && node.multiline?
182
189
  end
@@ -195,7 +202,7 @@ module RuboCop
195
202
  end
196
203
 
197
204
  def splat?(node)
198
- node.splat_type? || node.kwsplat_type? || node.block_pass_type?
205
+ node.type?(:splat, :kwsplat, :block_pass)
199
206
  end
200
207
 
201
208
  def ternary_if?(node)
@@ -203,7 +210,7 @@ module RuboCop
203
210
  end
204
211
 
205
212
  def logical_operator?(node)
206
- (node.and_type? || node.or_type?) && node.logical_operator?
213
+ node.operator_keyword? && node.logical_operator?
207
214
  end
208
215
 
209
216
  def hash_literal?(node)
@@ -61,6 +61,8 @@ module RuboCop
61
61
  # https://bugs.ruby-lang.org/issues/18396.
62
62
  # - Parentheses are required in anonymous arguments, keyword arguments
63
63
  # and block passing in Ruby 3.2.
64
+ # - Parentheses are required when the first argument is a beginless range or
65
+ # the last argument is an endless range.
64
66
  #
65
67
  # @example EnforcedStyle: require_parentheses (default)
66
68
  #
@@ -45,6 +45,7 @@ module RuboCop
45
45
  register_offense(node)
46
46
  end
47
47
  # rubocop:enable Metrics/CyclomaticComplexity
48
+ alias on_csend on_send
48
49
 
49
50
  private
50
51
 
@@ -71,9 +72,11 @@ module RuboCop
71
72
  return false if node.receiver
72
73
 
73
74
  any_assignment?(node) do |asgn_node|
74
- next variable_in_mass_assignment?(node.method_name, asgn_node) if asgn_node.masgn_type?
75
-
76
- asgn_node.loc.name.source == node.method_name.to_s
75
+ if asgn_node.masgn_type?
76
+ variable_in_mass_assignment?(node.method_name, asgn_node)
77
+ else
78
+ asgn_node.loc.name.source == node.method_name.to_s
79
+ end
77
80
  end
78
81
  end
79
82
 
@@ -98,20 +101,14 @@ module RuboCop
98
101
  # `obj.method ||= value` parses as (or-asgn (send ...) ...)
99
102
  # which IS an `asgn_node`. Similarly, `obj.method += value` parses
100
103
  # as (op-asgn (send ...) ...), which is also an `asgn_node`.
101
- if asgn_node.shorthand_asgn?
102
- asgn_node, _value = *asgn_node
103
- next if asgn_node.send_type?
104
- end
104
+ next if asgn_node.shorthand_asgn? && asgn_node.lhs.call_type?
105
105
 
106
106
  yield asgn_node
107
107
  end
108
108
  end
109
109
 
110
110
  def variable_in_mass_assignment?(variable_name, node)
111
- mlhs_node, _mrhs_node = *node
112
- var_nodes = *mlhs_node
113
-
114
- var_nodes.any? { |n| n.to_a.first == variable_name }
111
+ node.assignments.reject(&:send_type?).any? { |n| n.name == variable_name }
115
112
  end
116
113
 
117
114
  def offense_range(node)
@@ -40,10 +40,8 @@ module RuboCop
40
40
  def on_send(node)
41
41
  return if ignored_node?(node)
42
42
 
43
- receiver = node.receiver
44
-
45
- return unless (receiver&.block_type? || receiver&.numblock_type?) &&
46
- receiver.loc.end.is?('end')
43
+ return unless (receiver = node.receiver)
44
+ return unless receiver.any_block_type? && receiver.loc.end.is?('end')
47
45
 
48
46
  range = range_between(receiver.loc.end.begin_pos, node.source_range.end_pos)
49
47
 
@@ -168,7 +168,7 @@ module RuboCop
168
168
 
169
169
  def anonymous_arguments?(node)
170
170
  return true if node.arguments.any? do |arg|
171
- arg.forward_arg_type? || arg.restarg_type? || arg.kwrestarg_type?
171
+ arg.type?(:forward_arg, :restarg, :kwrestarg)
172
172
  end
173
173
  return false unless (last_argument = node.last_argument)
174
174
 
@@ -144,6 +144,8 @@ module RuboCop
144
144
  end
145
145
 
146
146
  def autocorrect(corrector, node)
147
+ node = node.ancestors.find { |ancestor| ancestor.loc.end } unless node.loc.end
148
+
147
149
  case empty_else_style
148
150
  when :empty
149
151
  corrector.insert_before(node.loc.end, 'else; nil; ')
@@ -6,19 +6,49 @@ module RuboCop
6
6
  # Checks for the presence of `method_missing` without also
7
7
  # defining `respond_to_missing?`.
8
8
  #
9
+ # Not defining `respond_to_missing?` will cause metaprogramming
10
+ # methods like `respond_to?` to behave unexpectedly:
11
+ #
12
+ # [source,ruby]
13
+ # ----
14
+ # class StringDelegator
15
+ # def initialize(string)
16
+ # @string = string
17
+ # end
18
+ #
19
+ # def method_missing(name, *args)
20
+ # @string.send(name, *args)
21
+ # end
22
+ # end
23
+ #
24
+ # delegator = StringDelegator.new("foo")
25
+ # # Claims to not respond to `upcase`.
26
+ # delegator.respond_to?(:upcase) # => false
27
+ # # But you can call it.
28
+ # delegator.upcase # => FOO
29
+ # ----
30
+ #
9
31
  # @example
10
32
  # # bad
11
33
  # def method_missing(name, *args)
12
- # # ...
34
+ # if @delegate.respond_to?(name)
35
+ # @delegate.send(name, *args)
36
+ # else
37
+ # super
38
+ # end
13
39
  # end
14
40
  #
15
41
  # # good
16
42
  # def respond_to_missing?(name, include_private)
17
- # # ...
43
+ # @delegate.respond_to?(name) || super
18
44
  # end
19
45
  #
20
46
  # def method_missing(name, *args)
21
- # # ...
47
+ # if @delegate.respond_to?(name)
48
+ # @delegate.send(name, *args)
49
+ # else
50
+ # super
51
+ # end
22
52
  # end
23
53
  #
24
54
  class MissingRespondToMissing < Base
@@ -31,7 +31,7 @@ module RuboCop
31
31
  node.send_node.each_node(:send, :csend) do |send_node|
32
32
  receiver = send_node.receiver
33
33
 
34
- next unless (receiver&.block_type? || receiver&.numblock_type?) && receiver&.multiline?
34
+ next unless receiver&.any_block_type? && receiver.multiline?
35
35
 
36
36
  range = range_between(receiver.loc.end.begin_pos, node.send_node.source_range.end_pos)
37
37
 
@@ -39,7 +39,7 @@ module RuboCop
39
39
  BRACES_MSG = 'Wrap multiline memoization blocks in `(` and `)`.'
40
40
 
41
41
  def on_or_asgn(node)
42
- _lhs, rhs = *node
42
+ rhs = node.expression
43
43
 
44
44
  return unless bad_rhs?(rhs)
45
45
 
@@ -55,6 +55,22 @@ module RuboCop
55
55
  MSG = 'Avoid comparing a variable with multiple items ' \
56
56
  'in a conditional, use `Array#include?` instead.'
57
57
 
58
+ # @!method simple_double_comparison?(node)
59
+ def_node_matcher :simple_double_comparison?, <<~PATTERN
60
+ (send lvar :== lvar)
61
+ PATTERN
62
+
63
+ # @!method simple_comparison_lhs(node)
64
+ def_node_matcher :simple_comparison_lhs, <<~PATTERN
65
+ (send ${lvar call} :== $_)
66
+ PATTERN
67
+
68
+ # @!method simple_comparison_rhs(node)
69
+ def_node_matcher :simple_comparison_rhs, <<~PATTERN
70
+ (send $_ :== ${lvar call})
71
+ PATTERN
72
+
73
+ # rubocop:disable Metrics/AbcSize
58
74
  def on_or(node)
59
75
  root_of_or_node = root_of_or_node(node)
60
76
  return unless node == root_of_or_node
@@ -63,29 +79,20 @@ module RuboCop
63
79
  return unless (variable, values = find_offending_var(node))
64
80
  return if values.size < comparisons_threshold
65
81
 
66
- add_offense(node) do |corrector|
82
+ range = offense_range(values)
83
+
84
+ add_offense(range) do |corrector|
67
85
  elements = values.map(&:source).join(', ')
68
- prefer_method = "[#{elements}].include?(#{variable_name(variable)})"
86
+ argument = variable.lvar_type? ? variable_name(variable) : variable.source
87
+ prefer_method = "[#{elements}].include?(#{argument})"
69
88
 
70
- corrector.replace(node, prefer_method)
89
+ corrector.replace(range, prefer_method)
71
90
  end
72
91
  end
92
+ # rubocop:enable Metrics/AbcSize
73
93
 
74
94
  private
75
95
 
76
- # @!method simple_double_comparison?(node)
77
- def_node_matcher :simple_double_comparison?, '(send $lvar :== $lvar)'
78
-
79
- # @!method simple_comparison_lhs?(node)
80
- def_node_matcher :simple_comparison_lhs?, <<~PATTERN
81
- (send $lvar :== $_)
82
- PATTERN
83
-
84
- # @!method simple_comparison_rhs?(node)
85
- def_node_matcher :simple_comparison_rhs?, <<~PATTERN
86
- (send $_ :== $lvar)
87
- PATTERN
88
-
89
96
  # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
90
97
  def find_offending_var(node, variables = Set.new, values = [])
91
98
  if node.or_type?
@@ -93,8 +100,8 @@ module RuboCop
93
100
  find_offending_var(node.rhs, variables, values)
94
101
  elsif simple_double_comparison?(node)
95
102
  return
96
- elsif (var, obj = simple_comparison?(node))
97
- return if allow_method_comparison? && obj.send_type?
103
+ elsif (var, obj = simple_comparison(node))
104
+ return if allow_method_comparison? && obj.call_type?
98
105
 
99
106
  variables << var
100
107
  return if variables.size > 1
@@ -106,6 +113,10 @@ module RuboCop
106
113
  end
107
114
  # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
108
115
 
116
+ def offense_range(values)
117
+ values.first.parent.source_range.begin.join(values.last.parent.source_range.end)
118
+ end
119
+
109
120
  def variable_name(node)
110
121
  node.children[0]
111
122
  end
@@ -119,12 +130,13 @@ module RuboCop
119
130
  end
120
131
 
121
132
  def comparison?(node)
122
- simple_comparison?(node) || nested_comparison?(node)
133
+ !!simple_comparison(node) || nested_comparison?(node)
123
134
  end
124
135
 
125
- def simple_comparison?(node)
126
- if (var, obj = simple_comparison_lhs?(node)) ||
127
- (obj, var = simple_comparison_rhs?(node))
136
+ def simple_comparison(node)
137
+ if (var, obj = simple_comparison_lhs(node)) || (obj, var = simple_comparison_rhs(node))
138
+ return if var.call_type? && !allow_method_comparison?
139
+
128
140
  [var, obj]
129
141
  end
130
142
  end
@@ -19,7 +19,7 @@ module RuboCop
19
19
  # acceptable value other than none, it will suppress the offenses
20
20
  # raised by this cop. It enforces frozen state.
21
21
  #
22
- # NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
22
+ # NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
23
23
  #
24
24
  # NOTE: From Ruby 3.0, interpolated strings are not frozen when
25
25
  # `# frozen-string-literal: true` is used, so this cop enforces explicit
@@ -125,15 +125,14 @@ module RuboCop
125
125
  MSG = 'Freeze mutable objects assigned to constants.'
126
126
 
127
127
  def on_casgn(node)
128
- _scope, _const_name, value = *node
129
- if value.nil? # This is only the case for `CONST += ...` or similarg66
128
+ if node.expression.nil? # This is only the case for `CONST += ...` or similarg66
130
129
  parent = node.parent
131
130
  return unless parent.or_asgn_type? # We only care about `CONST ||= ...`
132
131
 
133
- value = parent.children.last
132
+ on_assignment(parent.children.last)
133
+ else
134
+ on_assignment(node.expression)
134
135
  end
135
-
136
- on_assignment(value)
137
136
  end
138
137
 
139
138
  private
@@ -198,7 +197,7 @@ module RuboCop
198
197
  end
199
198
 
200
199
  def frozen_regexp_or_range_literals?(node)
201
- target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
200
+ target_ruby_version >= 3.0 && node.type?(:regexp, :range)
202
201
  end
203
202
 
204
203
  def requires_parentheses?(node)
@@ -239,7 +238,7 @@ module RuboCop
239
238
 
240
239
  # @!method range_enclosed_in_parentheses?(node)
241
240
  def_node_matcher :range_enclosed_in_parentheses?, <<~PATTERN
242
- (begin ({irange erange} _ _))
241
+ (begin (range _ _))
243
242
  PATTERN
244
243
  end
245
244
  end
@@ -46,10 +46,12 @@ module RuboCop
46
46
  @corrected_nodes = nil
47
47
  end
48
48
 
49
+ # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity
49
50
  def on_if(node)
50
51
  return unless if_else?(node)
51
52
  return unless (condition = unwrap_begin_nodes(node.condition))
52
53
  return if double_negation?(condition) || !negated_condition?(condition)
54
+ return unless condition.arguments.size < 2
53
55
 
54
56
  message = message(node)
55
57
  add_offense(node, message: message) do |corrector|
@@ -62,6 +64,7 @@ module RuboCop
62
64
  end
63
65
  end
64
66
  end
67
+ # rubocop:enable Metrics/AbcSize,Metrics/CyclomaticComplexity
65
68
 
66
69
  private
67
70
 
@@ -71,7 +74,7 @@ module RuboCop
71
74
  end
72
75
 
73
76
  def unwrap_begin_nodes(node)
74
- node = node.children.first while node && (node.begin_type? || node.kwbegin_type?)
77
+ node = node.children.first while node&.type?(:begin, :kwbegin)
75
78
 
76
79
  node
77
80
  end
@@ -92,13 +95,12 @@ module RuboCop
92
95
  end
93
96
 
94
97
  def correct_negated_condition(corrector, node)
95
- receiver, method_name, rhs = *node
96
98
  replacement =
97
99
  if node.negation_method?
98
- receiver.source
100
+ node.receiver.source
99
101
  else
100
- inverted_method = method_name.to_s.sub('!', '=')
101
- "#{receiver.source} #{inverted_method} #{rhs.source}"
102
+ inverted_method = node.method_name.to_s.sub('!', '=')
103
+ "#{node.receiver.source} #{inverted_method} #{node.first_argument.source}"
102
104
  end
103
105
 
104
106
  corrector.replace(node, replacement)
@@ -35,7 +35,7 @@ module RuboCop
35
35
  def on_send(node)
36
36
  return unless node.parenthesized?
37
37
 
38
- node.each_child_node(:send, :csend) do |nested|
38
+ node.each_child_node(:call) do |nested|
39
39
  next if allowed_omission?(nested)
40
40
 
41
41
  message = format(MSG, source: nested.source)
@@ -18,7 +18,6 @@ module RuboCop
18
18
  class NestedTernaryOperator < Base
19
19
  extend AutoCorrector
20
20
  include RangeHelp
21
- include IgnoredNode
22
21
 
23
22
  MSG = 'Ternary operators must not be nested. Prefer `if` or `else` constructs instead.'
24
23
 
@@ -45,9 +44,11 @@ module RuboCop
45
44
  end
46
45
 
47
46
  def remove_parentheses(source)
48
- return source unless source.start_with?('(')
49
-
50
- source.delete_prefix('(').delete_suffix(')')
47
+ if source.start_with?('(') && source.end_with?(')')
48
+ source.delete_prefix('(').delete_suffix(')')
49
+ else
50
+ source
51
+ end
51
52
  end
52
53
 
53
54
  def replace_loc_and_whitespace(corrector, range, replacement)