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
@@ -70,6 +70,7 @@ module RuboCop
70
70
  # private :bar, :baz
71
71
  # private *%i[qux quux]
72
72
  # private *METHOD_NAMES
73
+ # private *private_methods
73
74
  #
74
75
  # end
75
76
  #
@@ -80,6 +81,7 @@ module RuboCop
80
81
  # private :bar, :baz
81
82
  # private *%i[qux quux]
82
83
  # private *METHOD_NAMES
84
+ # private *private_methods
83
85
  #
84
86
  # end
85
87
  #
@@ -110,6 +112,26 @@ module RuboCop
110
112
  # private attr :quux
111
113
  #
112
114
  # end
115
+ #
116
+ # @example AllowModifiersOnAliasMethod: true (default)
117
+ # # good
118
+ # class Foo
119
+ #
120
+ # public alias_method :bar, :foo
121
+ # protected alias_method :baz, :foo
122
+ # private alias_method :qux, :foo
123
+ #
124
+ # end
125
+ #
126
+ # @example AllowModifiersOnAliasMethod: false
127
+ # # bad
128
+ # class Foo
129
+ #
130
+ # public alias_method :bar, :foo
131
+ # protected alias_method :baz, :foo
132
+ # private alias_method :qux, :foo
133
+ #
134
+ # end
113
135
  class AccessModifierDeclarations < Base
114
136
  extend AutoCorrector
115
137
 
@@ -128,26 +150,27 @@ module RuboCop
128
150
 
129
151
  RESTRICT_ON_SEND = %i[private protected public module_function].freeze
130
152
 
131
- ALLOWED_NODE_TYPES = %i[pair block].freeze
132
-
133
153
  # @!method access_modifier_with_symbol?(node)
134
154
  def_node_matcher :access_modifier_with_symbol?, <<~PATTERN
135
155
  (send nil? {:private :protected :public :module_function}
136
- {(sym _) (splat {#percent_symbol_array? const})}
156
+ {(sym _)+ (splat {#percent_symbol_array? const send})}
137
157
  )
138
158
  PATTERN
139
159
 
140
160
  # @!method access_modifier_with_attr?(node)
141
161
  def_node_matcher :access_modifier_with_attr?, <<~PATTERN
142
162
  (send nil? {:private :protected :public :module_function}
143
- (send nil? {:attr :attr_reader :attr_writer :attr_accessor} _))
163
+ (send nil? {:attr :attr_reader :attr_writer :attr_accessor} _+))
164
+ PATTERN
165
+
166
+ # @!method access_modifier_with_alias_method?, <<~PATTERN
167
+ def_node_matcher :access_modifier_with_alias_method?, <<~PATTERN
168
+ (send nil? {:private :protected :public :module_function}
169
+ (send nil? :alias_method _ _))
144
170
  PATTERN
145
171
 
146
172
  def on_send(node)
147
- return unless node.access_modifier?
148
- return if ALLOWED_NODE_TYPES.include?(node.parent&.type)
149
- return if allow_modifiers_on_symbols?(node)
150
- return if allow_modifiers_on_attrs?(node)
173
+ return if allowed?(node)
151
174
 
152
175
  if offense?(node)
153
176
  add_offense(node.loc.selector) do |corrector|
@@ -161,15 +184,23 @@ module RuboCop
161
184
 
162
185
  private
163
186
 
187
+ def allowed?(node)
188
+ !node.access_modifier? ||
189
+ node.parent&.type?(:pair, :any_block) ||
190
+ allow_modifiers_on_symbols?(node) ||
191
+ allow_modifiers_on_attrs?(node) ||
192
+ allow_modifiers_on_alias_method?(node)
193
+ end
194
+
164
195
  def autocorrect(corrector, node)
165
196
  case style
166
197
  when :group
167
- def_node = find_corresponding_def_node(node)
168
- return unless def_node
198
+ def_nodes = find_corresponding_def_nodes(node)
199
+ return unless def_nodes.any?
169
200
 
170
- replace_def(corrector, node, def_node)
201
+ replace_defs(corrector, node, def_nodes)
171
202
  when :inline
172
- remove_node(corrector, node)
203
+ remove_nodes(corrector, node)
173
204
  select_grouped_def_nodes(node).each do |grouped_def_node|
174
205
  insert_inline_modifier(corrector, grouped_def_node, node.method_name)
175
206
  end
@@ -188,12 +219,23 @@ module RuboCop
188
219
  cop_config['AllowModifiersOnAttrs'] && access_modifier_with_attr?(node)
189
220
  end
190
221
 
222
+ def allow_modifiers_on_alias_method?(node)
223
+ cop_config['AllowModifiersOnAliasMethod'] && access_modifier_with_alias_method?(node)
224
+ end
225
+
191
226
  def offense?(node)
192
227
  (group_style? && access_modifier_is_inlined?(node) &&
193
- !right_siblings_same_inline_method?(node)) ||
228
+ !node.parent&.if_type? && !right_siblings_same_inline_method?(node)) ||
194
229
  (inline_style? && access_modifier_is_not_inlined?(node))
195
230
  end
196
231
 
232
+ def correctable_group_offense?(node)
233
+ return false unless group_style?
234
+ return false if allowed?(node)
235
+
236
+ access_modifier_is_inlined?(node) && find_corresponding_def_nodes(node).any?
237
+ end
238
+
197
239
  def group_style?
198
240
  style == :group
199
241
  end
@@ -212,7 +254,11 @@ module RuboCop
212
254
 
213
255
  def right_siblings_same_inline_method?(node)
214
256
  node.right_siblings.any? do |sibling|
215
- sibling.send_type? && sibling.method?(node.method_name) && !sibling.arguments.empty?
257
+ sibling.send_type? &&
258
+ correctable_group_offense?(sibling) &&
259
+ sibling.method?(node.method_name) &&
260
+ !sibling.arguments.empty? &&
261
+ find_corresponding_def_nodes(sibling).any?
216
262
  end
217
263
  end
218
264
 
@@ -226,14 +272,22 @@ module RuboCop
226
272
  end
227
273
  end
228
274
 
229
- def find_corresponding_def_node(node)
275
+ def find_corresponding_def_nodes(node)
230
276
  if access_modifier_with_symbol?(node)
231
- method_name = node.first_argument.respond_to?(:value) && node.first_argument.value
232
- node.parent.each_child_node(:def).find do |child|
233
- child.method?(method_name)
277
+ method_names = node.arguments.filter_map do |argument|
278
+ next unless argument.sym_type?
279
+
280
+ argument.respond_to?(:value) && argument.value
234
281
  end
282
+
283
+ def_nodes = node.parent.each_child_node(:def).select do |child|
284
+ method_names.include?(child.method_name)
285
+ end
286
+
287
+ # If there isn't a `def` node for each symbol, we will skip autocorrection.
288
+ def_nodes.size == method_names.size ? def_nodes : []
235
289
  else
236
- node.first_argument
290
+ [node.first_argument]
237
291
  end
238
292
  end
239
293
 
@@ -251,12 +305,12 @@ module RuboCop
251
305
  end.select(&:def_type?)
252
306
  end
253
307
 
254
- def replace_def(corrector, node, def_node)
255
- source = def_source(node, def_node)
308
+ def replace_defs(corrector, node, def_nodes)
309
+ source = def_source(node, def_nodes)
256
310
  argument_less_modifier_node = find_argument_less_modifier_node(node)
257
311
  if argument_less_modifier_node
258
312
  corrector.insert_after(argument_less_modifier_node, "\n\n#{source}")
259
- elsif (ancestor = node.each_ancestor(:block, :class, :module).first)
313
+ elsif (ancestor = node.each_ancestor(:class, :module).first)
260
314
 
261
315
  corrector.insert_before(ancestor.loc.end, "#{node.method_name}\n\n#{source}\n")
262
316
  else
@@ -264,20 +318,24 @@ module RuboCop
264
318
  return
265
319
  end
266
320
 
267
- remove_node(corrector, def_node)
268
- remove_node(corrector, node)
321
+ remove_nodes(corrector, *def_nodes, node)
269
322
  end
270
323
 
271
324
  def insert_inline_modifier(corrector, node, modifier_name)
272
325
  corrector.insert_before(node, "#{modifier_name} ")
273
326
  end
274
327
 
275
- def remove_node(corrector, node)
276
- corrector.remove(range_with_comments_and_lines(node))
328
+ def remove_nodes(corrector, *nodes)
329
+ nodes.each do |node|
330
+ corrector.remove(range_with_comments_and_lines(node))
331
+ end
277
332
  end
278
333
 
279
- def def_source(node, def_node)
280
- [*processed_source.ast_with_comments[node].map(&:text), def_node.source].join("\n")
334
+ def def_source(node, def_nodes)
335
+ [
336
+ *processed_source.ast_with_comments[node].map(&:text),
337
+ *def_nodes.map(&:source)
338
+ ].join("\n")
281
339
  end
282
340
  end
283
341
  end
@@ -61,7 +61,7 @@ module RuboCop
61
61
  private
62
62
 
63
63
  def modifier_form?(operation)
64
- return true if operation.and_type? || operation.or_type?
64
+ return true if operation.operator_keyword?
65
65
 
66
66
  operation.modifier_form?
67
67
  end
@@ -127,7 +127,7 @@ module RuboCop
127
127
  end
128
128
 
129
129
  def correct_other(node, corrector)
130
- return if node.source_range.begin.is?('(')
130
+ return if node.parenthesized_call?
131
131
 
132
132
  corrector.wrap(node, '(', ')')
133
133
  end
@@ -31,6 +31,20 @@ module RuboCop
31
31
  #
32
32
  # This cop handles not only method forwarding but also forwarding to `super`.
33
33
  #
34
+ # [NOTE]
35
+ # --
36
+ # Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
37
+ # no offense will be registered until Ruby 3.4:
38
+
39
+ # [source,ruby]
40
+ # ----
41
+ # def foo(&block)
42
+ # # Using an anonymous block would be a syntax error on Ruby 3.3.0
43
+ # block_method { bar(&block) }
44
+ # end
45
+ # ----
46
+ # --
47
+ #
34
48
  # @example
35
49
  # # bad
36
50
  # def foo(*args, &block)
@@ -148,7 +162,7 @@ module RuboCop
148
162
 
149
163
  restarg, kwrestarg, blockarg = extract_forwardable_args(node.arguments)
150
164
  forwardable_args = redundant_forwardable_named_args(restarg, kwrestarg, blockarg)
151
- send_nodes = node.each_descendant(:send, :csend, :super, :yield).to_a
165
+ send_nodes = node.each_descendant(:call, :super, :yield).to_a
152
166
 
153
167
  send_classifications = classify_send_nodes(
154
168
  node, send_nodes, non_splat_or_block_pass_lvar_references(node.body), forwardable_args
@@ -191,9 +205,7 @@ module RuboCop
191
205
 
192
206
  send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
193
207
  if !forward_rest && !forward_kwrest && c != :all_anonymous
194
- # Prevents `anonymous block parameter is also used within block (SyntaxError)` occurs
195
- # in Ruby 3.3.0.
196
- if outside_block?(forward_block_arg)
208
+ if allow_anonymous_forwarding_in_block?(forward_block_arg)
197
209
  register_forward_block_arg_offense(!forward_rest, node.arguments, block_arg)
198
210
  register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
199
211
  end
@@ -214,24 +226,22 @@ module RuboCop
214
226
  # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
215
227
  def add_post_ruby_32_offenses(def_node, send_classifications, forwardable_args)
216
228
  return unless use_anonymous_forwarding?
217
- return if send_inside_block?(send_classifications)
229
+ return unless all_forwarding_offenses_correctable?(send_classifications)
218
230
 
219
231
  rest_arg, kwrest_arg, block_arg = *forwardable_args
220
232
 
221
233
  send_classifications.each do |send_node, _c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
222
- if outside_block?(forward_rest)
234
+ if allow_anonymous_forwarding_in_block?(forward_rest)
223
235
  register_forward_args_offense(def_node.arguments, rest_arg)
224
236
  register_forward_args_offense(send_node, forward_rest)
225
237
  end
226
238
 
227
- if outside_block?(forward_kwrest)
239
+ if allow_anonymous_forwarding_in_block?(forward_kwrest)
228
240
  register_forward_kwargs_offense(!forward_rest, def_node.arguments, kwrest_arg)
229
241
  register_forward_kwargs_offense(!forward_rest, send_node, forward_kwrest)
230
242
  end
231
243
 
232
- # Prevents `anonymous block parameter is also used within block (SyntaxError)` occurs
233
- # in Ruby 3.3.0.
234
- if outside_block?(forward_block_arg)
244
+ if allow_anonymous_forwarding_in_block?(forward_block_arg)
235
245
  register_forward_block_arg_offense(!forward_rest, def_node.arguments, block_arg)
236
246
  register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
237
247
  end
@@ -293,10 +303,25 @@ module RuboCop
293
303
  redundant_arg_names.include?(arg.source) ? arg : nil
294
304
  end
295
305
 
296
- def outside_block?(node)
306
+ # Checks if forwarding is uses both in blocks and outside of blocks.
307
+ # On Ruby 3.3.0, anonymous block forwarding in blocks can be is a syntax
308
+ # error, so we only want to register an offense if we can change all occurrences.
309
+ def all_forwarding_offenses_correctable?(send_classifications)
310
+ return true if target_ruby_version >= 3.4
311
+
312
+ send_classifications.none? do |send_node, *|
313
+ send_node.each_ancestor(:any_block).any?
314
+ end
315
+ end
316
+
317
+ # Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
318
+ # was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
319
+ # We disallow this also for earlier Ruby versions so that code is forwards compatible.
320
+ def allow_anonymous_forwarding_in_block?(node)
297
321
  return false unless node
322
+ return true if target_ruby_version >= 3.4
298
323
 
299
- node.each_ancestor(:block, :numblock).none?
324
+ node.each_ancestor(:any_block).none?
300
325
  end
301
326
 
302
327
  def register_forward_args_offense(def_arguments_or_send, rest_arg_or_splat)
@@ -357,12 +382,6 @@ module RuboCop
357
382
  cop_config.fetch('UseAnonymousForwarding', false)
358
383
  end
359
384
 
360
- def send_inside_block?(send_classifications)
361
- send_classifications.any? do |send_node, *|
362
- send_node.each_ancestor(:block, :numblock).any?
363
- end
364
- end
365
-
366
385
  def add_parens_if_missing(node, corrector)
367
386
  return if parentheses?(node)
368
387
  return if node.send_type? && node.method?(:[])
@@ -511,7 +530,7 @@ module RuboCop
511
530
  end
512
531
 
513
532
  def additional_kwargs?
514
- @def_node.arguments.any? { |a| a.kwarg_type? || a.kwoptarg_type? }
533
+ @def_node.arguments.any? { |a| a.type?(:kwarg, :kwoptarg) }
515
534
  end
516
535
 
517
536
  def forward_additional_kwargs?
@@ -540,10 +559,7 @@ module RuboCop
540
559
  end
541
560
 
542
561
  def explicit_block_name?
543
- block_forwarding_config = config.for_cop('Naming/BlockForwarding')
544
- return false unless block_forwarding_config['Enabled']
545
-
546
- block_forwarding_config['EnforcedStyle'] == 'explicit'
562
+ config.for_enabled_cop('Naming/BlockForwarding')['EnforcedStyle'] == 'explicit'
547
563
  end
548
564
  end
549
565
  end
@@ -42,14 +42,30 @@ module RuboCop
42
42
  return if node.parent && brace_method?(node.parent)
43
43
 
44
44
  preferred = (value.zero? ? 'first' : 'last')
45
- add_offense(node.loc.selector, message: format(MSG, preferred: preferred)) do |corrector|
46
- corrector.replace(node.loc.selector, ".#{preferred}")
45
+ offense_range = find_offense_range(node)
46
+
47
+ add_offense(offense_range, message: format(MSG, preferred: preferred)) do |corrector|
48
+ corrector.replace(offense_range, preferred_value(node, preferred))
47
49
  end
48
50
  end
49
51
  # rubocop:enable Metrics/AbcSize
52
+ alias on_csend on_send
50
53
 
51
54
  private
52
55
 
56
+ def preferred_value(node, value)
57
+ value = ".#{value}" unless node.loc.dot
58
+ value
59
+ end
60
+
61
+ def find_offense_range(node)
62
+ if node.loc.dot
63
+ node.loc.selector.join(node.source_range.end)
64
+ else
65
+ node.loc.selector
66
+ end
67
+ end
68
+
53
69
  def innermost_braces_node(node)
54
70
  node = node.receiver while node.receiver.send_type? && node.receiver.method?(:[])
55
71
  node
@@ -28,6 +28,7 @@ module RuboCop
28
28
  # # bad
29
29
  # (array1 & array2).any?
30
30
  # (array1 & array2).empty?
31
+ # (array1 & array2).none?
31
32
  #
32
33
  # # good
33
34
  # array1.intersect?(array2)
@@ -57,7 +58,7 @@ module RuboCop
57
58
  (send
58
59
  (begin
59
60
  (send $(...) :& $(...))
60
- ) ${:any? :empty?}
61
+ ) ${:any? :empty? :none?}
61
62
  )
62
63
  PATTERN
63
64
 
@@ -66,18 +67,18 @@ module RuboCop
66
67
  (send
67
68
  (begin
68
69
  (send $(...) :& $(...))
69
- ) ${:present? :any? :blank? :empty?}
70
+ ) ${:present? :any? :blank? :empty? :none?}
70
71
  )
71
72
  PATTERN
72
73
 
73
74
  MSG = 'Use `%<negated>s%<receiver>s.intersect?(%<argument>s)` ' \
74
75
  'instead of `(%<receiver>s & %<argument>s).%<method_name>s`.'
75
76
  STRAIGHT_METHODS = %i[present? any?].freeze
76
- NEGATED_METHODS = %i[blank? empty?].freeze
77
+ NEGATED_METHODS = %i[blank? empty? none?].freeze
77
78
  RESTRICT_ON_SEND = (STRAIGHT_METHODS + NEGATED_METHODS).freeze
78
79
 
79
80
  def on_send(node)
80
- return if (parent = node.parent) && (parent.block_type? || parent.numblock_type?)
81
+ return if node.block_literal?
81
82
  return unless (receiver, argument, method_name = bad_intersection_check?(node))
82
83
 
83
84
  message = message(receiver.source, argument.source, method_name)
@@ -71,7 +71,7 @@ module RuboCop
71
71
  PATTERN
72
72
 
73
73
  def on_send(node)
74
- return unless node.receiver.begin_type?
74
+ return unless node.receiver&.begin_type?
75
75
  return unless (preferred_method = preferred_method(node))
76
76
 
77
77
  bit_operation = node.receiver.children.first
@@ -183,7 +183,8 @@ module RuboCop
183
183
  def on_send(node)
184
184
  return unless node.arguments?
185
185
  return if node.parenthesized?
186
- return if node.operator_method? || node.assignment_method?
186
+ return if node.assignment_method?
187
+ return if single_argument_operator_method?(node)
187
188
 
188
189
  node.arguments.each do |arg|
189
190
  get_blocks(arg) do |block|
@@ -194,6 +195,7 @@ module RuboCop
194
195
  end
195
196
  end
196
197
  end
198
+ alias on_csend on_send
197
199
 
198
200
  def on_block(node)
199
201
  return if ignored_node?(node)
@@ -342,16 +344,23 @@ module RuboCop
342
344
  node.respond_to?(:block_node) && node.block_node
343
345
  end
344
346
 
347
+ # rubocop:disable Metrics/CyclomaticComplexity
345
348
  def get_blocks(node, &block)
346
349
  case node.type
347
350
  when :block, :numblock
348
351
  yield node
349
- when :send
352
+ when :send, :csend
353
+ # When a method has an argument which is another method with a block,
354
+ # that block needs braces, otherwise a syntax error will be introduced
355
+ # for subsequent arguments.
356
+ # Additionally, even without additional arguments, changing `{...}` to
357
+ # `do...end` will change the binding of the block to the outer method.
350
358
  get_blocks(node.receiver, &block) if node.receiver
359
+ node.arguments.each { |argument| get_blocks(argument, &block) }
351
360
  when :hash
352
361
  # A hash which is passed as method argument may have no braces
353
362
  # In that case, one of the K/V pairs could contain a block node
354
- # which could change in meaning if do...end replaced {...}
363
+ # which could change in meaning if `do...end` is replaced with `{...}`
355
364
  return if node.braces?
356
365
 
357
366
  node.each_child_node { |child| get_blocks(child, &block) }
@@ -359,10 +368,10 @@ module RuboCop
359
368
  node.each_child_node { |child| get_blocks(child, &block) }
360
369
  end
361
370
  end
371
+ # rubocop:enable Metrics/CyclomaticComplexity
362
372
 
363
- # rubocop:disable Metrics/CyclomaticComplexity
364
373
  def proper_block_style?(node)
365
- return true if require_braces?(node) || require_do_end?(node)
374
+ return true if require_do_end?(node)
366
375
  return special_method_proper_block_style?(node) if special_method?(node.method_name)
367
376
 
368
377
  case style
@@ -372,15 +381,6 @@ module RuboCop
372
381
  when :always_braces then braces_style?(node)
373
382
  end
374
383
  end
375
- # rubocop:enable Metrics/CyclomaticComplexity
376
-
377
- def require_braces?(node)
378
- return false unless node.braces?
379
-
380
- node.each_ancestor(:send).any? do |send|
381
- send.arithmetic_operation? && node.source_range.end_pos < send.loc.selector.begin_pos
382
- end
383
- end
384
384
 
385
385
  def require_do_end?(node)
386
386
  return false if node.braces? || node.multiline?
@@ -474,18 +474,14 @@ module RuboCop
474
474
  end
475
475
 
476
476
  def return_value_of_scope?(node)
477
- return false unless node.parent
478
-
479
- conditional?(node.parent) || array_or_range?(node.parent) ||
480
- node.parent.children.last == node
481
- end
477
+ return false unless (parent = node.parent)
482
478
 
483
- def conditional?(node)
484
- node.if_type? || node.or_type? || node.and_type?
479
+ parent.conditional? || parent.operator_keyword? || array_or_range?(parent) ||
480
+ parent.children.last == node
485
481
  end
486
482
 
487
483
  def array_or_range?(node)
488
- node.array_type? || node.range_type?
484
+ node.type?(:array, :range)
489
485
  end
490
486
 
491
487
  def begin_required?(block_node)
@@ -493,6 +489,12 @@ module RuboCop
493
489
  # `begin`...`end` when changing `do-end` to `{}`.
494
490
  block_node.each_child_node(:rescue, :ensure).any? && !block_node.single_line?
495
491
  end
492
+
493
+ def single_argument_operator_method?(node)
494
+ return false unless node.operator_method?
495
+
496
+ node.arguments.one? && node.first_argument.block_type?
497
+ end
496
498
  end
497
499
  end
498
500
  end
@@ -106,7 +106,7 @@ module RuboCop
106
106
  when :or
107
107
  find_target(node.lhs)
108
108
  when :match_with_lvasgn
109
- lhs, rhs = *node
109
+ lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
110
110
  if lhs.regexp_type?
111
111
  rhs
112
112
  elsif rhs.regexp_type?
@@ -172,7 +172,7 @@ module RuboCop
172
172
  return collect_conditions(node.lhs, target, conditions) &&
173
173
  collect_conditions(node.rhs, target, conditions)
174
174
  when :match_with_lvasgn
175
- lhs, rhs = *node
175
+ lhs, rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
176
176
  condition_from_binary_op(lhs, rhs, target)
177
177
  when :send
178
178
  condition_from_send_node(node, target)
@@ -191,8 +191,7 @@ module RuboCop
191
191
  when :=~, :match, :match?
192
192
  condition_from_match_node(node, target)
193
193
  when :===
194
- lhs, _method, rhs = *node
195
- lhs if rhs == target
194
+ node.receiver if node.first_argument == target
196
195
  when :include?, :cover?
197
196
  condition_from_include_or_cover_node(node, target)
198
197
  end
@@ -200,14 +199,12 @@ module RuboCop
200
199
  # rubocop:enable Metrics/CyclomaticComplexity
201
200
 
202
201
  def condition_from_equality_node(node, target)
203
- lhs, _method, rhs = *node
204
- condition = condition_from_binary_op(lhs, rhs, target)
202
+ condition = condition_from_binary_op(node.receiver, node.first_argument, target)
205
203
  condition if condition && !class_reference?(condition)
206
204
  end
207
205
 
208
206
  def condition_from_match_node(node, target)
209
- lhs, _method, rhs = *node
210
- condition_from_binary_op(lhs, rhs, target)
207
+ condition_from_binary_op(node.receiver, node.first_argument, target)
211
208
  end
212
209
 
213
210
  def condition_from_include_or_cover_node(node, target)
@@ -263,11 +260,11 @@ module RuboCop
263
260
  def regexp_with_working_captures?(node)
264
261
  case node.type
265
262
  when :match_with_lvasgn
266
- lhs, _rhs = *node
263
+ lhs, _rhs = *node # rubocop:disable InternalAffairs/NodeDestructuring
267
264
  node.loc.selector.source == '=~' && regexp_with_named_captures?(lhs)
268
265
  when :send
269
- lhs, method, rhs = *node
270
- method == :match && [lhs, rhs].any? { |n| regexp_with_named_captures?(n) }
266
+ node.method?(:match) &&
267
+ [node.receiver, node.first_argument].any? { |n| regexp_with_named_captures?(n) }
271
268
  end
272
269
  end
273
270
 
@@ -126,9 +126,12 @@ module RuboCop
126
126
  end
127
127
 
128
128
  def unindent(corrector, node)
129
- return if node.body.children.last.nil?
129
+ return unless node.body.children.last
130
130
 
131
- column_delta = configured_indentation_width - leading_spaces(node.body.children.last).size
131
+ last_child_leading_spaces = leading_spaces(node.body.children.last)
132
+ return if leading_spaces(node).size == last_child_leading_spaces.size
133
+
134
+ column_delta = configured_indentation_width - last_child_leading_spaces.size
132
135
  return if column_delta.zero?
133
136
 
134
137
  AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
@@ -158,7 +161,7 @@ module RuboCop
158
161
 
159
162
  def check_compact_style(node, body)
160
163
  parent = node.parent
161
- return if parent&.class_type? || parent&.module_type?
164
+ return if parent&.type?(:class, :module)
162
165
 
163
166
  return unless needs_compacting?(body)
164
167
 
@@ -49,7 +49,6 @@ module RuboCop
49
49
  def on_block(node)
50
50
  check_method_node(node.send_node)
51
51
  end
52
-
53
52
  alias on_numblock on_block
54
53
 
55
54
  def on_send(node)
@@ -57,6 +56,7 @@ module RuboCop
57
56
 
58
57
  check_method_node(node)
59
58
  end
59
+ alias on_csend on_send
60
60
 
61
61
  private
62
62
 
@@ -55,7 +55,7 @@ module RuboCop
55
55
  def defined_calls(nodes)
56
56
  nodes.filter_map do |defined_node|
57
57
  subject = defined_node.first_argument
58
- subject if subject.const_type? || subject.call_type?
58
+ subject if subject.type?(:const, :call)
59
59
  end
60
60
  end
61
61