rubocop 1.69.2 → 1.75.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 (360) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +4 -4
  4. data/config/default.yml +154 -23
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +3 -1
  7. data/lib/rubocop/cli/command/execute_runner.rb +3 -3
  8. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  9. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  10. data/lib/rubocop/cli.rb +1 -1
  11. data/lib/rubocop/comment_config.rb +2 -2
  12. data/lib/rubocop/config.rb +52 -10
  13. data/lib/rubocop/config_loader.rb +52 -9
  14. data/lib/rubocop/config_loader_resolver.rb +36 -10
  15. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  16. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  17. data/lib/rubocop/config_obsoletion.rb +46 -2
  18. data/lib/rubocop/config_validator.rb +20 -9
  19. data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
  20. data/lib/rubocop/cop/base.rb +6 -0
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  23. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  24. data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
  25. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  26. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  27. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  28. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  29. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  30. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  31. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +230 -0
  32. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  33. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  34. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  35. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  36. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  37. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  38. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  39. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  40. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +7 -1
  41. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  42. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  43. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  44. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  45. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  46. data/lib/rubocop/cop/layout/class_structure.rb +9 -9
  47. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  48. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  49. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  50. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  51. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +1 -1
  52. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  53. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
  54. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  55. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  56. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  57. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  58. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  59. data/lib/rubocop/cop/layout/first_argument_indentation.rb +3 -8
  60. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  61. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  62. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  63. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  64. data/lib/rubocop/cop/layout/hash_alignment.rb +6 -4
  65. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  66. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  67. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  68. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  69. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  70. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  71. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  72. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  73. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  74. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  75. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  76. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  77. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  78. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  79. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  80. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  81. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  82. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  83. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  84. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  85. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  86. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  87. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  88. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  89. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  90. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  91. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  92. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
  93. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  94. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
  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/cop_directive_syntax.rb +84 -0
  98. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  99. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
  100. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  101. data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -17
  102. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  103. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  104. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  105. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  106. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  107. data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
  108. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  109. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  110. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  111. data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
  112. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  113. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  114. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  115. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  116. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  117. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  118. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
  119. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  120. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  121. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  122. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  123. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  124. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  125. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  126. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  127. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  128. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  129. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  130. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  131. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  132. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  133. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  134. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -1
  135. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  136. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  137. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  138. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  139. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  140. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  141. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  142. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -4
  143. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  144. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  145. data/lib/rubocop/cop/lint/unreachable_code.rb +2 -1
  146. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  147. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  148. data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
  149. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  150. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  151. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  152. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  153. data/lib/rubocop/cop/lint/void.rb +12 -9
  154. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  155. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  156. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  157. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  158. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  159. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  160. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  161. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  162. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  163. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  164. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  165. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  166. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  167. data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
  168. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  169. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  170. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  171. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  172. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  173. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  174. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  175. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  176. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  177. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  178. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  179. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
  180. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  181. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  182. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  183. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  184. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  185. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  186. data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
  187. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  188. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  189. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  190. data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
  191. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
  192. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  193. data/lib/rubocop/cop/registry.rb +9 -6
  194. data/lib/rubocop/cop/security/compound_hash.rb +1 -0
  195. data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
  196. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  197. data/lib/rubocop/cop/style/and_or.rb +1 -1
  198. data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
  199. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  200. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  201. data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
  202. data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
  203. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  204. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  205. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  206. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  207. data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
  208. data/lib/rubocop/cop/style/comparable_between.rb +75 -0
  209. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  210. data/lib/rubocop/cop/style/conditional_assignment.rb +9 -4
  211. data/lib/rubocop/cop/style/documentation.rb +1 -1
  212. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  213. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  214. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  215. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  216. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  217. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  218. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  219. data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
  220. data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
  221. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  222. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  223. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  224. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  225. data/lib/rubocop/cop/style/float_division.rb +8 -4
  226. data/lib/rubocop/cop/style/for.rb +1 -0
  227. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  228. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  229. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  230. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  231. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  232. data/lib/rubocop/cop/style/hash_except.rb +24 -148
  233. data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
  234. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  235. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  236. data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
  237. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  238. data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
  239. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
  240. data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
  241. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  242. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  243. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  244. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  245. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  246. data/lib/rubocop/cop/style/it_block_parameter.rb +100 -0
  247. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  248. data/lib/rubocop/cop/style/lambda.rb +1 -0
  249. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  250. data/lib/rubocop/cop/style/map_into_array.rb +2 -1
  251. data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
  252. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  253. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +23 -16
  254. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  255. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
  256. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  257. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  258. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  259. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  260. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  261. data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
  262. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  263. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  264. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  265. data/lib/rubocop/cop/style/next.rb +44 -0
  266. data/lib/rubocop/cop/style/object_then.rb +14 -15
  267. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  268. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  269. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  270. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  271. data/lib/rubocop/cop/style/proc.rb +2 -2
  272. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  273. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  274. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  275. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  276. data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
  277. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  278. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  279. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  280. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  281. data/lib/rubocop/cop/style/redundant_format.rb +257 -0
  282. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  283. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  284. data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
  285. data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
  286. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  287. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  288. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  289. data/lib/rubocop/cop/style/redundant_self.rb +1 -0
  290. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  291. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  292. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  293. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  294. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  295. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  296. data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
  297. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  298. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  299. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  300. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  301. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  302. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  303. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  304. data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
  305. data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
  306. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  307. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  308. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  309. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  310. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  311. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  312. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
  313. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  314. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  315. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  316. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  317. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  318. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  319. data/lib/rubocop/cop/util.rb +12 -5
  320. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  321. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  322. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  323. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  324. data/lib/rubocop/cop/variable_force.rb +1 -1
  325. data/lib/rubocop/cops_documentation_generator.rb +25 -14
  326. data/lib/rubocop/directive_comment.rb +45 -11
  327. data/lib/rubocop/ext/regexp_node.rb +0 -1
  328. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  329. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  330. data/lib/rubocop/lsp/logger.rb +2 -2
  331. data/lib/rubocop/lsp/routes.rb +7 -23
  332. data/lib/rubocop/lsp/runtime.rb +18 -50
  333. data/lib/rubocop/lsp/server.rb +0 -2
  334. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  335. data/lib/rubocop/magic_comment.rb +8 -0
  336. data/lib/rubocop/options.rb +28 -12
  337. data/lib/rubocop/path_util.rb +15 -8
  338. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  339. data/lib/rubocop/plugin/load_error.rb +26 -0
  340. data/lib/rubocop/plugin/loader.rb +100 -0
  341. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  342. data/lib/rubocop/plugin.rb +46 -0
  343. data/lib/rubocop/rake_task.rb +4 -1
  344. data/lib/rubocop/result_cache.rb +13 -13
  345. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  346. data/lib/rubocop/rspec/expect_offense.rb +6 -2
  347. data/lib/rubocop/rspec/shared_contexts.rb +39 -1
  348. data/lib/rubocop/rspec/support.rb +4 -2
  349. data/lib/rubocop/runner.rb +10 -7
  350. data/lib/rubocop/server/cache.rb +47 -11
  351. data/lib/rubocop/server/cli.rb +2 -2
  352. data/lib/rubocop/target_finder.rb +2 -1
  353. data/lib/rubocop/target_ruby.rb +16 -1
  354. data/lib/rubocop/version.rb +30 -8
  355. data/lib/rubocop.rb +16 -1
  356. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  357. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  358. metadata +59 -16
  359. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  360. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -13,14 +13,16 @@ module RuboCop
13
13
  # # good
14
14
  # x if y.z.nil?
15
15
  #
16
- class RedundantParentheses < Base
16
+ class RedundantParentheses < Base # rubocop:disable Metrics/ClassLength
17
17
  include Parentheses
18
18
  extend AutoCorrector
19
19
 
20
- ALLOWED_NODE_TYPES = %i[and or send splat kwsplat].freeze
20
+ ALLOWED_NODE_TYPES = %i[or send splat kwsplat].freeze
21
21
 
22
22
  # @!method square_brackets?(node)
23
- def_node_matcher :square_brackets?, '(send {(send _recv _msg) str array hash} :[] ...)'
23
+ def_node_matcher :square_brackets?, <<~PATTERN
24
+ (send `{(send _recv _msg) str array hash const #variable?} :[] ...)
25
+ PATTERN
24
26
 
25
27
  # @!method method_node_and_args(node)
26
28
  def_node_matcher :method_node_and_args, '$(call _recv _msg $...)'
@@ -39,6 +41,10 @@ module RuboCop
39
41
 
40
42
  private
41
43
 
44
+ def variable?(node)
45
+ node.respond_to?(:variable?) && node.variable?
46
+ end
47
+
42
48
  def parens_allowed?(node)
43
49
  empty_parentheses?(node) ||
44
50
  first_arg_begins_with_hash_literal?(node) ||
@@ -50,7 +56,7 @@ module RuboCop
50
56
  def ignore_syntax?(node)
51
57
  return false unless (parent = node.parent)
52
58
 
53
- parent.while_post_type? || parent.until_post_type? || parent.match_with_lvasgn_type? ||
59
+ parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
54
60
  like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
55
61
  end
56
62
 
@@ -72,7 +78,7 @@ module RuboCop
72
78
  ancestor = node.ancestors.first
73
79
  return false unless ancestor
74
80
 
75
- !ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
81
+ !ancestor.type?(:begin, :def, :any_block)
76
82
  end
77
83
 
78
84
  def allowed_ternary?(node)
@@ -89,7 +95,7 @@ module RuboCop
89
95
  end
90
96
 
91
97
  def like_method_argument_parentheses?(node)
92
- return false if !node.send_type? && !node.super_type? && !node.yield_type?
98
+ return false unless node.type?(:send, :super, :yield)
93
99
 
94
100
  node.arguments.one? && !node.parenthesized? &&
95
101
  !node.arithmetic_operation? && node.first_argument.begin_type?
@@ -99,7 +105,7 @@ module RuboCop
99
105
  return false unless (parent = node.parent)
100
106
  return false if parent.single_line?
101
107
 
102
- parent.return_type? || parent.next_type? || parent.break_type?
108
+ parent.type?(:return, :next, :break)
103
109
  end
104
110
 
105
111
  def empty_parentheses?(node)
@@ -128,6 +134,8 @@ module RuboCop
128
134
  node = begin_node.children.first
129
135
 
130
136
  if (message = find_offense_message(begin_node, node))
137
+ begin_node = begin_node.parent if node.range_type?
138
+
131
139
  return offense(begin_node, message)
132
140
  end
133
141
 
@@ -137,9 +145,12 @@ module RuboCop
137
145
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
138
146
  def find_offense_message(begin_node, node)
139
147
  return 'a keyword' if keyword_with_redundant_parentheses?(node)
140
- return 'a literal' if disallowed_literal?(begin_node, node)
148
+ return 'a literal' if node.literal? && disallowed_literal?(begin_node, node)
141
149
  return 'a variable' if node.variable?
142
150
  return 'a constant' if node.const_type?
151
+ if node.assignment? && (begin_node.parent.nil? || begin_node.parent.begin_type?)
152
+ return 'an assignment'
153
+ end
143
154
  if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
144
155
  return 'an expression'
145
156
  end
@@ -151,6 +162,7 @@ module RuboCop
151
162
  return if node.semantic_operator? && begin_node.parent
152
163
  return if node.multiline? && allow_in_multiline_conditions?
153
164
  return if ALLOWED_NODE_TYPES.include?(begin_node.parent&.type)
165
+ return if !node.and_type? && begin_node.parent&.and_type?
154
166
  return if begin_node.parent&.if_type? && begin_node.parent.ternary?
155
167
 
156
168
  'a logical expression'
@@ -166,10 +178,7 @@ module RuboCop
166
178
  def_node_matcher :interpolation?, '[^begin ^^dstr]'
167
179
 
168
180
  def allow_in_multiline_conditions?
169
- parentheses_around_condition_config = config.for_cop('Style/ParenthesesAroundCondition')
170
- return false unless parentheses_around_condition_config['Enabled']
171
-
172
- !!parentheses_around_condition_config['AllowInMultilineConditions']
181
+ !!config.for_enabled_cop('Style/ParenthesesAroundCondition')['AllowInMultilineConditions']
173
182
  end
174
183
 
175
184
  def check_send(begin_node, node)
@@ -207,7 +216,13 @@ module RuboCop
207
216
  end
208
217
 
209
218
  def disallowed_literal?(begin_node, node)
210
- node.literal? && !node.range_type? && !raised_to_power_negative_numeric?(begin_node, node)
219
+ if node.range_type?
220
+ return false unless (parent = begin_node.parent)
221
+
222
+ parent.begin_type? && parent.children.one?
223
+ else
224
+ !raised_to_power_negative_numeric?(begin_node, node)
225
+ end
211
226
  end
212
227
 
213
228
  def raised_to_power_negative_numeric?(begin_node, node)
@@ -279,9 +294,9 @@ module RuboCop
279
294
  end
280
295
 
281
296
  def do_end_block_in_method_chain?(begin_node, node)
282
- return false unless (block = node.each_descendant(:block, :numblock).first)
297
+ return false unless (block = node.each_descendant(:any_block).first)
283
298
 
284
- block.keywords? && begin_node.each_ancestor(:send, :csend).any?
299
+ block.keywords? && begin_node.each_ancestor(:call).any?
285
300
  end
286
301
  end
287
302
  end
@@ -73,6 +73,9 @@ module RuboCop
73
73
  new_argument.gsub!("'", "\\\\'")
74
74
  new_argument.gsub!('\"', '"')
75
75
  quote = "'"
76
+ elsif new_argument.include?('\'')
77
+ new_argument.gsub!("'", "\\\\'")
78
+ quote = "'"
76
79
  elsif new_argument.include?('\\')
77
80
  quote = '"'
78
81
  else
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks for unnecessary single-element Regexp character classes.
6
+ # Checks for unnecessary single-element `Regexp` character classes.
7
7
  #
8
8
  # @example
9
9
  #
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks for redundant escapes inside Regexp literals.
6
+ # Checks for redundant escapes inside `Regexp` literals.
7
7
  #
8
8
  # @example
9
9
  # # bad
@@ -118,6 +118,7 @@ module RuboCop
118
118
  end
119
119
 
120
120
  alias on_numblock on_block
121
+ alias on_itblock on_block
121
122
 
122
123
  def on_if(node)
123
124
  # Allow conditional nodes to use `self` in the condition if that variable
@@ -21,12 +21,8 @@ module RuboCop
21
21
  # args += foo
22
22
  # hash.merge!(other)
23
23
  #
24
- # # bad
25
- # self.foo = foo.concat(ary)
26
- #
27
24
  # # good
28
25
  # foo.concat(ary)
29
- # self.foo += ary
30
26
  #
31
27
  class RedundantSelfAssignment < Base
32
28
  include RangeHelp
@@ -49,10 +45,20 @@ module RuboCop
49
45
  gvasgn: :gvar
50
46
  }.freeze
51
47
 
48
+ # @!method redundant_self_assignment?
49
+ def_node_matcher :redundant_self_assignment?, <<~PATTERN
50
+ (call
51
+ %1 _
52
+ (call
53
+ (call
54
+ %1 %2) #method_returning_self?
55
+ ...))
56
+ PATTERN
57
+
52
58
  # rubocop:disable Metrics/AbcSize
53
59
  def on_lvasgn(node)
54
60
  return unless (rhs = node.rhs)
55
- return unless rhs.send_type? && method_returning_self?(rhs.method_name)
61
+ return unless rhs.type?(:any_block, :call) && method_returning_self?(rhs.method_name)
56
62
  return unless (receiver = rhs.receiver)
57
63
 
58
64
  receiver_type = ASSIGNMENT_TYPE_TO_RECEIVER_TYPE[node.type]
@@ -77,6 +83,7 @@ module RuboCop
77
83
  corrector.remove(correction_range(node))
78
84
  end
79
85
  end
86
+ alias on_csend on_send
80
87
 
81
88
  private
82
89
 
@@ -84,31 +91,10 @@ module RuboCop
84
91
  METHODS_RETURNING_SELF.include?(method_name)
85
92
  end
86
93
 
87
- # @!method redundant_self_assignment?(node, method_name)
88
- def_node_matcher :redundant_self_assignment?, <<~PATTERN
89
- (send
90
- (self) _
91
- (send
92
- (send
93
- {(self) nil?} %1) #method_returning_self?
94
- ...))
95
- PATTERN
96
-
97
- # @!method redundant_nonself_assignment?(node, receiver, method_name)
98
- def_node_matcher :redundant_nonself_assignment?, <<~PATTERN
99
- (send
100
- %1 _
101
- (send
102
- (send
103
- %1 %2) #method_returning_self?
104
- ...))
105
- PATTERN
106
-
107
94
  def redundant_assignment?(node)
108
- receiver_name = node.method_name.to_s[0...-1].to_sym
95
+ receiver_name = node.method_name.to_s.delete_suffix('=').to_sym
109
96
 
110
- redundant_self_assignment?(node, receiver_name) ||
111
- redundant_nonself_assignment?(node, node.receiver, receiver_name)
97
+ redundant_self_assignment?(node, node.receiver, receiver_name)
112
98
  end
113
99
 
114
100
  def correction_range(node)
@@ -93,9 +93,9 @@ module RuboCop
93
93
  (call $(call _ $:sort_by _) ${:last :first})
94
94
  (send $(send _ $:sort_by _) ${:[] :at :slice} {(int 0) (int -1)})
95
95
 
96
- (call ({block numblock} $(call _ ${:sort_by :sort}) ...) ${:last :first})
96
+ (call (any_block $(call _ ${:sort_by :sort}) ...) ${:last :first})
97
97
  (call
98
- ({block numblock} $(call _ ${:sort_by :sort}) ...)
98
+ (any_block $(call _ ${:sort_by :sort}) ...)
99
99
  ${:[] :at :slice} {(int 0) (int -1)}
100
100
  )
101
101
  }
@@ -21,6 +21,7 @@ module RuboCop
21
21
 
22
22
  MSG_BLOCK = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'
23
23
  MSG_NUMBLOCK = 'Use `sort` instead of `sort_by { _1 }`.'
24
+ MSG_ITBLOCK = 'Use `sort` instead of `sort_by { it }`.'
24
25
 
25
26
  def on_block(node)
26
27
  redundant_sort_by_block(node) do |send, var_name|
@@ -36,7 +37,17 @@ module RuboCop
36
37
  redundant_sort_by_numblock(node) do |send|
37
38
  range = sort_by_range(send, node)
38
39
 
39
- add_offense(range, message: format(MSG_NUMBLOCK)) do |corrector|
40
+ add_offense(range, message: MSG_NUMBLOCK) do |corrector|
41
+ corrector.replace(range, 'sort')
42
+ end
43
+ end
44
+ end
45
+
46
+ def on_itblock(node)
47
+ redundant_sort_by_itblock(node) do |send|
48
+ range = sort_by_range(send, node)
49
+
50
+ add_offense(range, message: MSG_ITBLOCK) do |corrector|
40
51
  corrector.replace(range, 'sort')
41
52
  end
42
53
  end
@@ -54,6 +65,11 @@ module RuboCop
54
65
  (numblock $(call _ :sort_by) 1 (lvar :_1))
55
66
  PATTERN
56
67
 
68
+ # @!method redundant_sort_by_itblock(node)
69
+ def_node_matcher :redundant_sort_by_itblock, <<~PATTERN
70
+ (itblock $(call _ :sort_by) _ (lvar :it))
71
+ PATTERN
72
+
57
73
  def sort_by_range(send, node)
58
74
  range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
59
75
  end
@@ -41,7 +41,7 @@ module RuboCop
41
41
  MSG = 'Redundant escape of %<char>s inside string literal.'
42
42
 
43
43
  def on_str(node)
44
- return if node.parent&.regexp_type? || node.parent&.xstr_type? || node.character_literal?
44
+ return if node.parent&.type?(:regexp, :xstr) || node.character_literal?
45
45
 
46
46
  str_contents_range = str_contents_range(node)
47
47
 
@@ -147,7 +147,7 @@ module RuboCop
147
147
  end
148
148
 
149
149
  def heredoc?(node)
150
- (node.str_type? || node.dstr_type?) && node.heredoc?
150
+ node.type?(:str, :dstr) && node.heredoc?
151
151
  end
152
152
 
153
153
  def delimiter?(node, char)
@@ -67,11 +67,13 @@ module RuboCop
67
67
  node.parent && parentheses?(node.parent)
68
68
  end
69
69
 
70
+ # rubocop:disable Metrics/AbcSize
70
71
  def correct_rescue_block(corrector, node, parenthesized)
71
72
  operation = node.body
72
73
 
73
74
  node_indentation, node_offset = indentation_and_offset(node, parenthesized)
74
75
 
76
+ corrector.wrap(operation, '[', ']') if operation.array_type? && !operation.bracketed?
75
77
  corrector.remove(range_between(operation.source_range.end_pos, node.source_range.end_pos))
76
78
  corrector.insert_before(operation, "begin\n#{node_indentation}")
77
79
  corrector.insert_after(heredoc_end(operation) || operation, <<~RESCUE_CLAUSE.chop)
@@ -81,6 +83,7 @@ module RuboCop
81
83
  #{node_offset}end
82
84
  RESCUE_CLAUSE
83
85
  end
86
+ # rubocop:enable Metrics/AbcSize
84
87
 
85
88
  def indentation_and_offset(node, parenthesized)
86
89
  node_indentation = indentation(node)
@@ -47,7 +47,7 @@ module RuboCop
47
47
 
48
48
  def on_return(node)
49
49
  # Check Lint/NonLocalExitFromIterator first before this cop
50
- node.each_ancestor(:block, :def, :defs) do |n|
50
+ node.each_ancestor(:block, :any_def) do |n|
51
51
  break if scoped_node?(n)
52
52
 
53
53
  send_node, args_node, _body_node = *n
@@ -83,7 +83,7 @@ module RuboCop
83
83
  end
84
84
 
85
85
  def scoped_node?(node)
86
- node.def_type? || node.defs_type? || node.lambda?
86
+ node.any_def_type? || node.lambda?
87
87
  end
88
88
 
89
89
  # @!method chained_send?(node)
@@ -312,7 +312,7 @@ module RuboCop
312
312
  end
313
313
 
314
314
  def chain_length(method_chain, method)
315
- method.each_ancestor(:send, :csend).inject(0) do |total, ancestor|
315
+ method.each_ancestor(:call).inject(0) do |total, ancestor|
316
316
  break total + 1 if ancestor == method_chain
317
317
 
318
318
  total + 1
@@ -323,7 +323,7 @@ module RuboCop
323
323
  return true if unsafe_method?(method)
324
324
 
325
325
  method.each_ancestor(:send).any? do |ancestor|
326
- break true unless config.for_cop('Lint/SafeNavigationChain')['Enabled']
326
+ break true unless config.cop_enabled?('Lint/SafeNavigationChain')
327
327
 
328
328
  break true if unsafe_method?(ancestor)
329
329
  break true if nil_methods.include?(ancestor.method_name)
@@ -59,6 +59,7 @@ module RuboCop
59
59
  {
60
60
  (block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
61
61
  (numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
62
+ (itblock call $_ ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
62
63
  }
63
64
  PATTERN
64
65
 
@@ -137,6 +138,7 @@ module RuboCop
137
138
  return unless (block_arg_name, regexp_method_send_node = regexp_match?(block_node))
138
139
 
139
140
  block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
141
+
140
142
  return unless calls_lvar?(regexp_method_send_node, block_arg_name)
141
143
 
142
144
  regexp_method_send_node
@@ -150,7 +152,8 @@ module RuboCop
150
152
  return node.child_nodes.first if node.match_with_lvasgn_type?
151
153
 
152
154
  if node.receiver.lvar_type? &&
153
- (block.numblock_type? || node.receiver.source == block.first_argument.source)
155
+ (block.type?(:numblock, :itblock) ||
156
+ node.receiver.source == block.first_argument.source)
154
157
  node.first_argument
155
158
  elsif node.first_argument.lvar_type?
156
159
  node.receiver
@@ -164,7 +164,7 @@ module RuboCop
164
164
 
165
165
  ast = processed_source.ast
166
166
  @range_nodes = ast.range_type? ? [ast] : []
167
- @range_nodes.concat(ast.each_descendant(:irange, :erange).to_a)
167
+ @range_nodes.concat(ast.each_descendant(:range).to_a)
168
168
  end
169
169
  end
170
170
  end
@@ -68,7 +68,7 @@ module RuboCop
68
68
  def on_send(node)
69
69
  return if allow_send? && !node.method?(:public_send)
70
70
  return unless (first_argument = node.first_argument)
71
- return unless STATIC_METHOD_NAME_NODE_TYPES.include?(first_argument.type)
71
+ return unless first_argument.type?(*STATIC_METHOD_NAME_NODE_TYPES)
72
72
 
73
73
  offense_range = offense_range(node)
74
74
  method_name = first_argument.value
@@ -83,6 +83,7 @@ module RuboCop
83
83
  end
84
84
  end
85
85
  end
86
+ alias on_csend on_send
86
87
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
87
88
 
88
89
  private
@@ -10,7 +10,7 @@ module RuboCop
10
10
  # parameters.
11
11
  #
12
12
  # Configuration option: Methods
13
- # Should be set to use this cop. Array of hashes, where each key is the
13
+ # Should be set to use this cop. `Array` of hashes, where each key is the
14
14
  # method name and value - array of argument names.
15
15
  #
16
16
  # @example Methods: [{reduce: %w[a b]}]
@@ -56,11 +56,13 @@ module RuboCop
56
56
  end
57
57
  # rubocop:enable Metrics/AbcSize
58
58
  alias on_numblock on_block
59
+ alias on_itblock on_block
59
60
 
60
61
  private
61
62
 
62
63
  def do_line(node)
63
- if node.numblock_type? || node.arguments.children.empty? || node.send_node.lambda_literal?
64
+ if node.type?(:numblock, :itblock) ||
65
+ node.arguments.children.empty? || node.send_node.lambda_literal?
64
66
  node.loc.begin
65
67
  else
66
68
  node.arguments
@@ -68,8 +70,7 @@ module RuboCop
68
70
  end
69
71
 
70
72
  def single_line_blocks_preferred?
71
- redundant_line_break_config = @config.for_cop('Layout/RedundantLineBreak')
72
- redundant_line_break_config['Enabled'] && redundant_line_break_config['InspectBlocks']
73
+ @config.for_enabled_cop('Layout/RedundantLineBreak')['InspectBlocks']
73
74
  end
74
75
  end
75
76
  end
@@ -8,9 +8,9 @@ module RuboCop
8
8
  #
9
9
  # Endless methods added in Ruby 3.0 are also accepted by this cop.
10
10
  #
11
- # If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line` or
12
- # `allow_always`, single-line methods will be autocorrected to endless
13
- # methods if there is only one statement in the body.
11
+ # If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`, `allow_always`,
12
+ # `require_single_line`, or `require_always`, single-line methods will be autocorrected
13
+ # to endless methods if there is only one statement in the body.
14
14
  #
15
15
  # @example
16
16
  # # bad
@@ -68,7 +68,7 @@ module RuboCop
68
68
  return false if body_node.parent.assignment_method? ||
69
69
  NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES.include?(body_node.type)
70
70
 
71
- !(body_node.begin_type? || body_node.kwbegin_type?)
71
+ !body_node.type?(:begin, :kwbegin)
72
72
  end
73
73
 
74
74
  def correct_to_multiline(corrector, node)
@@ -134,10 +134,9 @@ module RuboCop
134
134
  end
135
135
 
136
136
  def disallow_endless_method_style?
137
- endless_method_config = config.for_cop('Style/EndlessMethod')
138
- return true unless endless_method_config['Enabled']
137
+ return true unless config.cop_enabled?('Style/EndlessMethod')
139
138
 
140
- endless_method_config['EnforcedStyle'] == 'disallow'
139
+ config.for_cop('Style/EndlessMethod')['EnforcedStyle'] == 'disallow'
141
140
  end
142
141
  end
143
142
  end
@@ -78,38 +78,67 @@ module RuboCop
78
78
  return unless node.arguments.one?
79
79
 
80
80
  range_node = node.first_argument
81
- selector = node.loc.selector
82
- unless (message, removal_range = offense_message_with_removal_range(range_node, selector))
83
- return
84
- end
81
+ offense_range = find_offense_range(node)
82
+ return unless (message, removal_range =
83
+ offense_message_with_removal_range(node, range_node, offense_range))
84
+
85
+ # Changing the range to beginningless or endless when unparenthesized
86
+ # changes the semantics of the code, and thus will not be considered
87
+ # an offense.
88
+ return if removal_range != offense_range && unparenthesized_call?(node)
85
89
 
86
- add_offense(selector, message: message) do |corrector|
90
+ add_offense(offense_range, message: message) do |corrector|
87
91
  corrector.remove(removal_range)
88
92
  end
89
93
  end
94
+ alias on_csend on_send
90
95
 
91
96
  private
92
97
 
93
- def offense_message_with_removal_range(range_node, selector)
98
+ def unparenthesized_call?(node)
99
+ node.loc.dot && !node.parenthesized?
100
+ end
101
+
102
+ def find_offense_range(node)
103
+ if node.loc.dot
104
+ node.loc.dot.join(node.source_range.end)
105
+ else
106
+ node.loc.selector
107
+ end
108
+ end
109
+
110
+ def offense_message_with_removal_range(node, range_node, offense_range)
94
111
  if range_from_zero_till_minus_one?(range_node)
95
- [format(MSG_USELESS_RANGE, prefer: selector.source), selector]
112
+ [format(MSG_USELESS_RANGE, prefer: offense_range.source), offense_range]
96
113
  elsif range_till_minus_one?(range_node)
97
114
  [
98
- format(MSG, prefer: endless(range_node), current: selector.source), range_node.end
115
+ offense_message_for_partial_range(node, endless(range_node), offense_range),
116
+ range_node.end
99
117
  ]
100
118
  elsif range_from_zero?(range_node) && target_ruby_version >= 2.7
101
119
  [
102
- format(MSG, prefer: beginless(range_node), current: selector.source), range_node.begin
120
+ offense_message_for_partial_range(node, beginless(range_node), offense_range),
121
+ range_node.begin
103
122
  ]
104
123
  end
105
124
  end
106
125
 
126
+ def offense_message_for_partial_range(node, prefer, offense_range)
127
+ current = node.loc.dot ? arguments_source(node) : offense_range.source
128
+ prefer = "[#{prefer}]" unless node.loc.dot
129
+ format(MSG, prefer: prefer, current: current)
130
+ end
131
+
107
132
  def endless(range_node)
108
- "[#{range_node.begin.source}#{range_node.loc.operator.source}]"
133
+ "#{range_node.begin.source}#{range_node.loc.operator.source}"
109
134
  end
110
135
 
111
136
  def beginless(range_node)
112
- "[#{range_node.loc.operator.source}#{range_node.end.source}]"
137
+ "#{range_node.loc.operator.source}#{range_node.end.source}"
138
+ end
139
+
140
+ def arguments_source(node)
141
+ node.first_argument.source_range.join(node.last_argument.source_range.end).source
113
142
  end
114
143
  end
115
144
  end