rubocop 1.69.0 → 1.76.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +22 -16
  4. data/config/default.yml +234 -47
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +8 -3
  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 +25 -14
  19. data/lib/rubocop/cop/autocorrect_logic.rb +44 -39
  20. data/lib/rubocop/cop/base.rb +6 -0
  21. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  22. data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
  23. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  24. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +50 -6
  25. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  26. data/lib/rubocop/cop/generator.rb +6 -0
  27. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  28. data/lib/rubocop/cop/internal_affairs/example_description.rb +8 -4
  29. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  30. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  31. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  32. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
  33. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
  34. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  35. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  36. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +231 -0
  37. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -0
  38. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  39. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  40. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  41. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +4 -2
  42. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  43. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  44. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
  45. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  46. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  47. data/lib/rubocop/cop/internal_affairs.rb +6 -16
  48. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
  49. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
  50. data/lib/rubocop/cop/layout/block_alignment.rb +3 -1
  51. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  52. data/lib/rubocop/cop/layout/class_structure.rb +44 -9
  53. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
  54. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  55. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  56. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  57. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +2 -2
  58. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
  59. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -3
  60. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  61. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  62. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
  63. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  64. data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
  65. data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
  66. data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
  67. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
  68. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  69. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  70. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
  71. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -6
  72. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
  73. data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
  74. data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
  75. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
  76. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  77. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  78. data/lib/rubocop/cop/layout/line_length.rb +9 -4
  79. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  80. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  81. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  82. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -0
  83. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  84. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  85. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +1 -1
  86. data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
  87. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -5
  88. data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
  89. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  90. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  91. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  92. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  93. data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
  94. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  95. data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
  96. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  97. data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -32
  98. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  99. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  100. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -1
  101. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  102. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
  103. data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
  104. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  105. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  106. data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
  107. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +2 -3
  108. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  109. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -3
  110. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  111. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  112. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
  113. data/lib/rubocop/cop/lint/debugger.rb +3 -3
  114. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  115. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
  116. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  117. data/lib/rubocop/cop/lint/duplicate_methods.rb +86 -19
  118. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
  119. data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
  120. data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
  121. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  122. data/lib/rubocop/cop/lint/empty_interpolation.rb +3 -1
  123. data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
  124. data/lib/rubocop/cop/lint/float_comparison.rb +33 -8
  125. data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
  126. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
  127. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  128. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
  129. data/lib/rubocop/cop/lint/literal_as_condition.rb +110 -9
  130. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
  131. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -1
  132. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  133. data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
  134. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  135. data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
  136. data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
  137. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -2
  138. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
  139. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  140. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
  141. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  142. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
  143. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
  144. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  145. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  146. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  147. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
  148. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  149. data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
  150. data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
  151. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  152. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  153. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  154. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
  155. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
  156. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  157. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  158. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  159. data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
  160. data/lib/rubocop/cop/lint/syntax.rb +4 -1
  161. data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
  162. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  163. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +1 -1
  164. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  165. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
  166. data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
  167. data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
  168. data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
  169. data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
  170. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  171. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +87 -0
  172. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
  173. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  174. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
  175. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  176. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  177. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
  178. data/lib/rubocop/cop/lint/void.rb +14 -11
  179. data/lib/rubocop/cop/message_annotator.rb +7 -3
  180. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  181. data/lib/rubocop/cop/metrics/block_length.rb +1 -0
  182. data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
  183. data/lib/rubocop/cop/metrics/class_length.rb +9 -9
  184. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  185. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
  186. data/lib/rubocop/cop/metrics/method_length.rb +9 -1
  187. data/lib/rubocop/cop/metrics/module_length.rb +1 -1
  188. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  189. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
  190. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  191. data/lib/rubocop/cop/mixin/alignment.rb +2 -2
  192. data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
  193. data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
  194. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +2 -2
  195. data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
  196. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  197. data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
  198. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  199. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  200. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  201. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +0 -1
  202. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  203. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  204. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  205. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  206. data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
  207. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  208. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -0
  209. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  210. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  211. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  212. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  213. data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
  214. data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
  215. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  216. data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
  217. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  218. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  219. data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
  220. data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
  221. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
  222. data/lib/rubocop/cop/naming/method_name.rb +64 -8
  223. data/lib/rubocop/cop/naming/predicate_method.rb +216 -0
  224. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +46 -2
  225. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +4 -4
  226. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  227. data/lib/rubocop/cop/registry.rb +9 -6
  228. data/lib/rubocop/cop/security/compound_hash.rb +2 -0
  229. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  230. data/lib/rubocop/cop/style/access_modifier_declarations.rb +66 -15
  231. data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
  232. data/lib/rubocop/cop/style/and_or.rb +1 -1
  233. data/lib/rubocop/cop/style/arguments_forwarding.rb +47 -28
  234. data/lib/rubocop/cop/style/array_first_last.rb +18 -2
  235. data/lib/rubocop/cop/style/array_intersect.rb +39 -28
  236. data/lib/rubocop/cop/style/block_delimiters.rb +26 -23
  237. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  238. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  239. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  240. data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
  241. data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
  242. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  243. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  244. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  245. data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
  246. data/lib/rubocop/cop/style/conditional_assignment.rb +20 -6
  247. data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
  248. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
  249. data/lib/rubocop/cop/style/dig_chain.rb +5 -6
  250. data/lib/rubocop/cop/style/documentation.rb +1 -1
  251. data/lib/rubocop/cop/style/double_negation.rb +4 -4
  252. data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
  253. data/lib/rubocop/cop/style/each_with_object.rb +2 -3
  254. data/lib/rubocop/cop/style/empty_else.rb +4 -2
  255. data/lib/rubocop/cop/style/empty_literal.rb +5 -1
  256. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  257. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  258. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  259. data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
  260. data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
  261. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  262. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  263. data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
  264. data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
  265. data/lib/rubocop/cop/style/file_null.rb +20 -4
  266. data/lib/rubocop/cop/style/float_division.rb +8 -4
  267. data/lib/rubocop/cop/style/for.rb +1 -0
  268. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  269. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  270. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  271. data/lib/rubocop/cop/style/guard_clause.rb +2 -1
  272. data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
  273. data/lib/rubocop/cop/style/hash_except.rb +35 -147
  274. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  275. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  276. data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
  277. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  278. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  279. data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
  280. data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
  281. data/lib/rubocop/cop/style/if_unless_modifier.rb +25 -7
  282. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  283. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -2
  284. data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
  285. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  286. data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
  287. data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
  288. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  289. data/lib/rubocop/cop/style/it_assignment.rb +36 -0
  290. data/lib/rubocop/cop/style/it_block_parameter.rb +119 -0
  291. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  292. data/lib/rubocop/cop/style/lambda.rb +1 -0
  293. data/lib/rubocop/cop/style/lambda_call.rb +10 -3
  294. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  295. data/lib/rubocop/cop/style/map_into_array.rb +5 -2
  296. data/lib/rubocop/cop/style/map_to_hash.rb +12 -1
  297. data/lib/rubocop/cop/style/map_to_set.rb +3 -2
  298. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
  299. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
  300. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +3 -2
  301. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  302. data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
  303. data/lib/rubocop/cop/style/missing_else.rb +2 -0
  304. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  305. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  306. data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
  307. data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
  308. data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
  309. data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
  310. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
  311. data/lib/rubocop/cop/style/next.rb +44 -0
  312. data/lib/rubocop/cop/style/object_then.rb +15 -15
  313. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  314. data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
  315. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  316. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  317. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  318. data/lib/rubocop/cop/style/proc.rb +2 -2
  319. data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
  320. data/lib/rubocop/cop/style/raise_args.rb +14 -12
  321. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  322. data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
  323. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  324. data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
  325. data/lib/rubocop/cop/style/redundant_condition.rb +59 -2
  326. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
  327. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
  328. data/lib/rubocop/cop/style/redundant_each.rb +1 -1
  329. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  330. data/lib/rubocop/cop/style/redundant_format.rb +262 -0
  331. data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
  332. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  333. data/lib/rubocop/cop/style/redundant_line_continuation.rb +38 -21
  334. data/lib/rubocop/cop/style/redundant_parentheses.rb +61 -17
  335. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
  336. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  337. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
  338. data/lib/rubocop/cop/style/redundant_self.rb +2 -1
  339. data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
  340. data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
  341. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  342. data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
  343. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  344. data/lib/rubocop/cop/style/rescue_modifier.rb +3 -0
  345. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  346. data/lib/rubocop/cop/style/safe_navigation.rb +44 -16
  347. data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
  348. data/lib/rubocop/cop/style/semicolon.rb +1 -1
  349. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
  350. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  351. data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
  352. data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
  353. data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
  354. data/lib/rubocop/cop/style/sole_nested_conditional.rb +42 -105
  355. data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
  356. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  357. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  358. data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
  359. data/lib/rubocop/cop/style/super_arguments.rb +66 -19
  360. data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
  361. data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
  362. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  363. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +11 -2
  364. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  365. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  366. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  367. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
  368. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  369. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  370. data/lib/rubocop/cop/team.rb +1 -1
  371. data/lib/rubocop/cop/util.rb +12 -5
  372. data/lib/rubocop/cop/utils/format_string.rb +10 -5
  373. data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
  374. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  375. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  376. data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
  377. data/lib/rubocop/cop/variable_force.rb +1 -1
  378. data/lib/rubocop/cops_documentation_generator.rb +31 -16
  379. data/lib/rubocop/directive_comment.rb +45 -11
  380. data/lib/rubocop/ext/regexp_node.rb +0 -1
  381. data/lib/rubocop/formatter/disabled_config_formatter.rb +2 -1
  382. data/lib/rubocop/formatter/formatter_set.rb +1 -1
  383. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  384. data/lib/rubocop/formatter/pacman_formatter.rb +1 -1
  385. data/lib/rubocop/lsp/diagnostic.rb +189 -0
  386. data/lib/rubocop/lsp/logger.rb +2 -2
  387. data/lib/rubocop/lsp/routes.rb +7 -23
  388. data/lib/rubocop/lsp/runtime.rb +18 -50
  389. data/lib/rubocop/lsp/server.rb +0 -2
  390. data/lib/rubocop/lsp/stdin_runner.rb +85 -0
  391. data/lib/rubocop/magic_comment.rb +11 -3
  392. data/lib/rubocop/options.rb +28 -12
  393. data/lib/rubocop/path_util.rb +15 -8
  394. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  395. data/lib/rubocop/plugin/load_error.rb +26 -0
  396. data/lib/rubocop/plugin/loader.rb +100 -0
  397. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  398. data/lib/rubocop/plugin.rb +46 -0
  399. data/lib/rubocop/rake_task.rb +4 -1
  400. data/lib/rubocop/result_cache.rb +13 -13
  401. data/lib/rubocop/rspec/cop_helper.rb +13 -1
  402. data/lib/rubocop/rspec/expect_offense.rb +15 -5
  403. data/lib/rubocop/rspec/shared_contexts.rb +38 -1
  404. data/lib/rubocop/rspec/support.rb +4 -2
  405. data/lib/rubocop/runner.rb +10 -7
  406. data/lib/rubocop/server/cache.rb +47 -11
  407. data/lib/rubocop/server/cli.rb +2 -2
  408. data/lib/rubocop/target_finder.rb +7 -2
  409. data/lib/rubocop/target_ruby.rb +16 -1
  410. data/lib/rubocop/version.rb +30 -8
  411. data/lib/rubocop.rb +22 -2
  412. data/lib/ruby_lsp/rubocop/addon.rb +75 -0
  413. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
  414. metadata +67 -19
  415. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  416. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -11,6 +11,9 @@ module RuboCop
11
11
  # will not register an offense, because it allows the initializer to take a different
12
12
  # number of arguments as its superclass potentially does.
13
13
  #
14
+ # NOTE: If an initializer takes any arguments and has an empty body, RuboCop
15
+ # assumes it to *not* be redundant. This is to prevent potential `ArgumentError`.
16
+ #
14
17
  # NOTE: If an initializer argument has a default value, RuboCop assumes it
15
18
  # to *not* be redundant.
16
19
  #
@@ -19,8 +22,10 @@ module RuboCop
19
22
  # initializer.
20
23
  #
21
24
  # @safety
22
- # This cop is unsafe because if subclass overrides `initialize` method with
23
- # a different arity than superclass.
25
+ # This cop is unsafe because removing an empty initializer may alter
26
+ # the behavior of the code, particularly if the superclass initializer
27
+ # raises an exception. In such cases, the empty initializer may act as
28
+ # a safeguard to prevent unintended errors from propagating.
24
29
  #
25
30
  # @example
26
31
  # # bad
@@ -69,6 +74,10 @@ module RuboCop
69
74
  # end
70
75
  #
71
76
  # # good (changes the parameter requirements)
77
+ # def initialize(_)
78
+ # end
79
+ #
80
+ # # good (changes the parameter requirements)
72
81
  # def initialize(*)
73
82
  # end
74
83
  #
@@ -111,7 +120,7 @@ module RuboCop
111
120
  return if acceptable?(node)
112
121
 
113
122
  if node.body.nil?
114
- register_offense(node, MSG_EMPTY)
123
+ register_offense(node, MSG_EMPTY) if node.arguments.empty?
115
124
  else
116
125
  return if node.body.begin_type?
117
126
 
@@ -73,10 +73,15 @@ module RuboCop
73
73
  LINE_CONTINUATION_PATTERN = /(\\\n)/.freeze
74
74
  ALLOWED_STRING_TOKENS = %i[tSTRING tSTRING_CONTENT].freeze
75
75
  ARGUMENT_TYPES = %i[
76
- kFALSE kNIL kSELF kTRUE tCONSTANT tCVAR tFLOAT tGVAR tIDENTIFIER tINTEGER tIVAR
77
- tLBRACK tLCURLY tLPAREN_ARG tSTRING tSTRING_BEG tSYMBOL tXSTRING_BEG
76
+ kDEF kDEFINED kFALSE kNIL kSELF kTRUE tAMPER tBANG tCARET tCHARACTER tCOLON3 tCONSTANT
77
+ tCVAR tDOT2 tDOT3 tFLOAT tGVAR tIDENTIFIER tINTEGER tIVAR tLAMBDA tLBRACK tLCURLY
78
+ tLPAREN_ARG tPIPE tQSYMBOLS_BEG tQWORDS_BEG tREGEXP_BEG tSTAR tSTRING tSTRING_BEG tSYMBEG
79
+ tSYMBOL tSYMBOLS_BEG tTILDE tUMINUS tUNARY_NUM tUPLUS tWORDS_BEG tXSTRING_BEG
78
80
  ].freeze
79
- ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[tIDENTIFIER kRETURN kBREAK kNEXT kYIELD].freeze
81
+ ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
82
+ tIDENTIFIER kBREAK kNEXT kRETURN kSUPER kYIELD
83
+ ].freeze
84
+ ARITHMETIC_OPERATOR_TOKENS = %i[tDIVIDE tDSTAR tMINUS tPERCENT tPLUS tSTAR2].freeze
80
85
 
81
86
  def on_new_investigation
82
87
  return unless processed_source.ast
@@ -96,15 +101,20 @@ module RuboCop
96
101
  private
97
102
 
98
103
  def require_line_continuation?(range)
99
- !ends_with_backslash_without_comment?(range.source_line) ||
104
+ !ends_with_uncommented_backslash?(range) ||
100
105
  string_concatenation?(range.source_line) ||
101
- start_with_arithmetic_operator?(processed_source[range.line]) ||
106
+ start_with_arithmetic_operator?(range) ||
102
107
  inside_string_literal_or_method_with_argument?(range) ||
103
108
  leading_dot_method_chain_with_blank_line?(range)
104
109
  end
105
110
 
106
- def ends_with_backslash_without_comment?(source_line)
107
- source_line.gsub(/#.+/, '').end_with?('\\')
111
+ def ends_with_uncommented_backslash?(range)
112
+ # A line continuation always needs to be the last character on the line, which
113
+ # means that it is impossible to have a comment following a continuation.
114
+ # Therefore, if the line contains a comment, it cannot end with a continuation.
115
+ return false if processed_source.line_with_comment?(range.line)
116
+
117
+ range.source_line.end_with?(LINE_CONTINUATION)
108
118
  end
109
119
 
110
120
  def string_concatenation?(source_line)
@@ -112,10 +122,13 @@ module RuboCop
112
122
  end
113
123
 
114
124
  def inside_string_literal_or_method_with_argument?(range)
125
+ line_range = range_by_whole_lines(range)
126
+
115
127
  processed_source.tokens.each_cons(2).any? do |token, next_token|
116
128
  next if token.line == next_token.line
117
129
 
118
- inside_string_literal?(range, token) || method_with_argument?(token, next_token)
130
+ inside_string_literal?(range, token) ||
131
+ method_with_argument?(line_range, token, next_token)
119
132
  end
120
133
  end
121
134
 
@@ -129,16 +142,15 @@ module RuboCop
129
142
  return true unless (node = find_node_for_line(range.last_line))
130
143
  return false if argument_newline?(node)
131
144
 
132
- source = node.source
133
- while (node = node.parent)
134
- source = node.source
135
- end
136
- parse(source.gsub("\\\n", "\n")).valid_syntax?
145
+ # Check if source is still valid without the continuation
146
+ source = processed_source.raw_source.dup
147
+ source[range.begin_pos, range.length] = "\n"
148
+ parse(source).valid_syntax?
137
149
  end
138
150
 
139
151
  def inspect_end_of_ruby_code_line_continuation
140
152
  last_line = processed_source.lines[processed_source.ast.last_line - 1]
141
- return unless last_line.end_with?(LINE_CONTINUATION)
153
+ return unless code_ends_with_continuation?(last_line)
142
154
 
143
155
  last_column = last_line.length
144
156
  line_continuation_range = range_between(last_column - 1, last_column)
@@ -148,6 +160,12 @@ module RuboCop
148
160
  end
149
161
  end
150
162
 
163
+ def code_ends_with_continuation?(last_line)
164
+ return false if processed_source.line_with_comment?(processed_source.ast.last_line)
165
+
166
+ last_line.end_with?(LINE_CONTINUATION)
167
+ end
168
+
151
169
  def inside_string_literal?(range, token)
152
170
  ALLOWED_STRING_TOKENS.include?(token.type) && token.pos.overlaps?(range)
153
171
  end
@@ -156,15 +174,14 @@ module RuboCop
156
174
  #
157
175
  # do_something \
158
176
  # argument
159
- def method_with_argument?(current_token, next_token)
177
+ def method_with_argument?(line_range, current_token, next_token)
160
178
  return false unless ARGUMENT_TAKING_FLOW_TOKEN_TYPES.include?(current_token.type)
179
+ return false unless current_token.pos.overlaps?(line_range)
161
180
 
162
181
  ARGUMENT_TYPES.include?(next_token.type)
163
182
  end
164
183
 
165
- # rubocop:disable Metrics/AbcSize
166
184
  def argument_newline?(node)
167
- node = node.to_a.last if node.assignment?
168
185
  return false if node.parenthesized_call?
169
186
 
170
187
  node = node.children.first if node.root? && node.begin_type?
@@ -177,11 +194,10 @@ module RuboCop
177
194
  node.loc.selector.line != node.first_argument.loc.line
178
195
  end
179
196
  end
180
- # rubocop:enable Metrics/AbcSize
181
197
 
182
198
  def find_node_for_line(last_line)
183
199
  processed_source.ast.each_node do |node|
184
- return node if node.respond_to?(:expression) && node.expression&.last_line == last_line
200
+ return node if same_line?(node, last_line)
185
201
  end
186
202
  end
187
203
 
@@ -210,8 +226,9 @@ module RuboCop
210
226
  node.call_type? && !node.arguments.empty?
211
227
  end
212
228
 
213
- def start_with_arithmetic_operator?(source_line)
214
- %r{\A\s*[+\-*/%]}.match?(source_line)
229
+ def start_with_arithmetic_operator?(range)
230
+ line_range = processed_source.buffer.line_range(range.line + 1)
231
+ ARITHMETIC_OPERATOR_TOKENS.include?(processed_source.first_token_of(line_range).type)
215
232
  end
216
233
  end
217
234
  end
@@ -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,10 +41,15 @@ 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) ||
45
51
  rescue?(node) ||
52
+ in_pattern_matching_in_method_argument?(node) ||
46
53
  allowed_pin_operator?(node) ||
47
54
  allowed_expression?(node)
48
55
  end
@@ -50,7 +57,7 @@ module RuboCop
50
57
  def ignore_syntax?(node)
51
58
  return false unless (parent = node.parent)
52
59
 
53
- parent.while_post_type? || parent.until_post_type? || parent.match_with_lvasgn_type? ||
60
+ parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
54
61
  like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
55
62
  end
56
63
 
@@ -72,7 +79,7 @@ module RuboCop
72
79
  ancestor = node.ancestors.first
73
80
  return false unless ancestor
74
81
 
75
- !ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
82
+ !ancestor.type?(:begin, :any_def, :any_block)
76
83
  end
77
84
 
78
85
  def allowed_ternary?(node)
@@ -89,17 +96,17 @@ module RuboCop
89
96
  end
90
97
 
91
98
  def like_method_argument_parentheses?(node)
92
- return false if !node.send_type? && !node.super_type? && !node.yield_type?
99
+ return false unless node.type?(:send, :super, :yield)
93
100
 
94
101
  node.arguments.one? && !node.parenthesized? &&
95
- !node.arithmetic_operation? && node.first_argument.begin_type?
102
+ !node.operator_method? && node.first_argument.begin_type?
96
103
  end
97
104
 
98
105
  def multiline_control_flow_statements?(node)
99
106
  return false unless (parent = node.parent)
100
107
  return false if parent.single_line?
101
108
 
102
- parent.return_type? || parent.next_type? || parent.break_type?
109
+ parent.type?(:return, :next, :break)
103
110
  end
104
111
 
105
112
  def empty_parentheses?(node)
@@ -116,6 +123,13 @@ module RuboCop
116
123
  hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
117
124
  end
118
125
 
126
+ def in_pattern_matching_in_method_argument?(begin_node)
127
+ return false unless begin_node.parent&.call_type?
128
+ return false unless (node = begin_node.children.first)
129
+
130
+ target_ruby_version <= 2.7 ? node.match_pattern_type? : node.match_pattern_p_type?
131
+ end
132
+
119
133
  def method_chain_begins_with_hash_literal(node)
120
134
  return if node.nil?
121
135
  return node if node.hash_type?
@@ -128,6 +142,10 @@ module RuboCop
128
142
  node = begin_node.children.first
129
143
 
130
144
  if (message = find_offense_message(begin_node, node))
145
+ if node.range_type? && !argument_of_parenthesized_method_call?(begin_node, node)
146
+ begin_node = begin_node.parent
147
+ end
148
+
131
149
  return offense(begin_node, message)
132
150
  end
133
151
 
@@ -137,13 +155,20 @@ module RuboCop
137
155
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
138
156
  def find_offense_message(begin_node, node)
139
157
  return 'a keyword' if keyword_with_redundant_parentheses?(node)
140
- return 'a literal' if disallowed_literal?(begin_node, node)
158
+ return 'a literal' if node.literal? && disallowed_literal?(begin_node, node)
141
159
  return 'a variable' if node.variable?
142
160
  return 'a constant' if node.const_type?
161
+ if node.assignment? && (begin_node.parent.nil? || begin_node.parent.begin_type?)
162
+ return 'an assignment'
163
+ end
143
164
  if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
144
165
  return 'an expression'
145
166
  end
167
+ if node.any_match_pattern_type? && node.each_ancestor.none?(&:operator_keyword?)
168
+ return 'a one-line pattern matching'
169
+ end
146
170
  return 'an interpolated expression' if interpolation?(begin_node)
171
+ return 'a method argument' if argument_of_parenthesized_method_call?(begin_node, node)
147
172
 
148
173
  return if begin_node.chained?
149
174
 
@@ -151,6 +176,7 @@ module RuboCop
151
176
  return if node.semantic_operator? && begin_node.parent
152
177
  return if node.multiline? && allow_in_multiline_conditions?
153
178
  return if ALLOWED_NODE_TYPES.include?(begin_node.parent&.type)
179
+ return if !node.and_type? && begin_node.parent&.and_type?
154
180
  return if begin_node.parent&.if_type? && begin_node.parent.ternary?
155
181
 
156
182
  'a logical expression'
@@ -165,11 +191,23 @@ module RuboCop
165
191
  # @!method interpolation?(node)
166
192
  def_node_matcher :interpolation?, '[^begin ^^dstr]'
167
193
 
168
- def allow_in_multiline_conditions?
169
- parentheses_around_condition_config = config.for_cop('Style/ParenthesesAroundCondition')
170
- return false unless parentheses_around_condition_config['Enabled']
194
+ def argument_of_parenthesized_method_call?(begin_node, node)
195
+ if node.basic_conditional? || node.rescue_type? || method_call_parentheses_required?(node)
196
+ return false
197
+ end
198
+ return false unless (parent = begin_node.parent)
171
199
 
172
- !!parentheses_around_condition_config['AllowInMultilineConditions']
200
+ parent.call_type? && parent.parenthesized? && parent.receiver != begin_node
201
+ end
202
+
203
+ def method_call_parentheses_required?(node)
204
+ return false unless node.call_type?
205
+
206
+ (node.receiver.nil? || node.loc.dot) && node.arguments.any?
207
+ end
208
+
209
+ def allow_in_multiline_conditions?
210
+ !!config.for_enabled_cop('Style/ParenthesesAroundCondition')['AllowInMultilineConditions']
173
211
  end
174
212
 
175
213
  def check_send(begin_node, node)
@@ -207,7 +245,13 @@ module RuboCop
207
245
  end
208
246
 
209
247
  def disallowed_literal?(begin_node, node)
210
- node.literal? && !node.range_type? && !raised_to_power_negative_numeric?(begin_node, node)
248
+ if node.range_type?
249
+ return false unless (parent = begin_node.parent)
250
+
251
+ parent.begin_type? && parent.children.one?
252
+ else
253
+ !raised_to_power_negative_numeric?(begin_node, node)
254
+ end
211
255
  end
212
256
 
213
257
  def raised_to_power_negative_numeric?(begin_node, node)
@@ -244,7 +288,7 @@ module RuboCop
244
288
  end
245
289
 
246
290
  def only_begin_arg?(args)
247
- args.one? && args.first.begin_type?
291
+ args.one? && args.first&.begin_type?
248
292
  end
249
293
 
250
294
  def first_argument?(node)
@@ -279,9 +323,9 @@ module RuboCop
279
323
  end
280
324
 
281
325
  def do_end_block_in_method_chain?(begin_node, node)
282
- return false unless (block = node.each_descendant(:block, :numblock).first)
326
+ return false unless (block = node.each_descendant(:any_block).first)
283
327
 
284
- block.keywords? && begin_node.each_ancestor(:send, :csend).any?
328
+ block.keywords? && begin_node.each_ancestor(:call).any?
285
329
  end
286
330
  end
287
331
  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
@@ -175,7 +176,7 @@ module RuboCop
175
176
  def on_argument(node)
176
177
  if node.mlhs_type?
177
178
  on_args(node)
178
- else
179
+ elsif node.respond_to?(:name)
179
180
  @local_variables_scopes[node] << node.name
180
181
  end
181
182
  end
@@ -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)
@@ -155,7 +155,7 @@ module RuboCop
155
155
  end
156
156
 
157
157
  def preferred_delimiters
158
- config.for_cop('Style/PercentLiteralDelimiters') ['PreferredDelimiters']['%r'].chars
158
+ config.for_cop('Style/PercentLiteralDelimiters')['PreferredDelimiters']['%r'].chars
159
159
  end
160
160
 
161
161
  def allowed_omit_parentheses_with_percent_r_literal?(node)
@@ -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)