rubocop 1.57.1 → 1.81.6

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 (638) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +92 -89
  4. data/assets/output.css.erb +159 -0
  5. data/assets/output.html.erb +1 -160
  6. data/config/default.yml +540 -86
  7. data/config/internal_affairs.yml +31 -0
  8. data/config/obsoletion.yml +8 -3
  9. data/exe/rubocop +1 -7
  10. data/lib/rubocop/cached_data.rb +21 -5
  11. data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
  12. data/lib/rubocop/cli/command/execute_runner.rb +4 -4
  13. data/lib/rubocop/cli/command/lsp.rb +4 -4
  14. data/lib/rubocop/cli/command/show_cops.rb +24 -2
  15. data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
  16. data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
  17. data/lib/rubocop/cli/command/version.rb +2 -2
  18. data/lib/rubocop/cli.rb +28 -4
  19. data/lib/rubocop/comment_config.rb +3 -3
  20. data/lib/rubocop/config.rb +92 -22
  21. data/lib/rubocop/config_finder.rb +12 -2
  22. data/lib/rubocop/config_loader.rb +71 -58
  23. data/lib/rubocop/config_loader_resolver.rb +48 -17
  24. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
  25. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  26. data/lib/rubocop/config_obsoletion.rb +56 -9
  27. data/lib/rubocop/config_store.rb +5 -0
  28. data/lib/rubocop/config_validator.rb +39 -20
  29. data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
  30. data/lib/rubocop/cop/base.rb +79 -18
  31. data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
  32. data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
  33. data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
  34. data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
  35. data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
  36. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
  37. data/lib/rubocop/cop/cop.rb +30 -4
  38. data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
  39. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
  40. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
  41. data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
  42. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
  43. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
  44. data/lib/rubocop/cop/documentation.rb +32 -5
  45. data/lib/rubocop/cop/exclude_limit.rb +1 -1
  46. data/lib/rubocop/cop/force.rb +12 -0
  47. data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
  48. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  49. data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
  50. data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
  51. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
  52. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
  53. data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
  54. data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
  55. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
  56. data/lib/rubocop/cop/generator.rb +6 -0
  57. data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
  58. data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
  59. data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
  60. data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
  61. data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
  62. data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
  63. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
  64. data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
  65. data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
  66. data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
  67. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
  68. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
  69. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
  70. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
  71. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  72. data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
  73. data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
  74. data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
  75. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
  76. data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
  77. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  78. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  79. data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
  80. data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
  81. data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
  82. data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
  83. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
  84. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
  85. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
  86. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  87. data/lib/rubocop/cop/internal_affairs.rb +9 -0
  88. data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
  89. data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
  90. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  91. data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
  92. data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
  93. data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
  94. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  95. data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
  96. data/lib/rubocop/cop/layout/class_structure.rb +45 -10
  97. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  98. data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
  99. data/lib/rubocop/cop/layout/condition_position.rb +0 -4
  100. data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
  101. data/lib/rubocop/cop/layout/dot_position.rb +1 -1
  102. data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
  103. data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
  104. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
  105. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
  106. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
  107. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
  108. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  109. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
  110. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  111. data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
  112. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
  113. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
  114. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
  115. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
  116. data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
  117. data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
  118. data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
  119. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
  120. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
  121. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
  122. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
  123. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
  124. data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
  125. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
  126. data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
  127. data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
  128. data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
  129. data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
  130. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
  131. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
  132. data/lib/rubocop/cop/layout/line_length.rb +177 -29
  133. data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
  134. data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
  135. data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
  136. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
  137. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
  138. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
  139. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  140. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
  141. data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
  142. data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
  143. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
  144. data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
  145. data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
  146. data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
  147. data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
  148. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  149. data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
  150. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  151. data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
  152. data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
  153. data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
  154. data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
  155. data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
  156. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
  157. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
  158. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
  159. data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
  160. data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
  161. data/lib/rubocop/cop/legacy/corrector.rb +12 -2
  162. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
  163. data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
  164. data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
  165. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
  166. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
  167. data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
  168. data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
  169. data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
  170. data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
  171. data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
  172. data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
  173. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
  174. data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
  175. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
  176. data/lib/rubocop/cop/lint/debugger.rb +30 -8
  177. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
  178. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
  179. data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
  180. data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
  181. data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
  182. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
  183. data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
  184. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
  185. data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
  186. data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
  187. data/lib/rubocop/cop/lint/else_layout.rb +0 -2
  188. data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
  189. data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
  190. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  191. data/lib/rubocop/cop/lint/empty_file.rb +0 -2
  192. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
  193. data/lib/rubocop/cop/lint/empty_when.rb +1 -3
  194. data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
  195. data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
  196. data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
  197. data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
  198. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
  199. data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
  200. data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
  201. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  202. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
  203. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
  204. data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
  205. data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
  206. data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
  207. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
  208. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
  209. data/lib/rubocop/cop/lint/loop.rb +6 -12
  210. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
  211. data/lib/rubocop/cop/lint/missing_super.rb +2 -2
  212. data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
  213. data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
  214. data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
  215. data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
  216. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
  217. data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
  218. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
  219. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
  220. data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
  221. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
  222. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
  223. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
  224. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
  225. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
  226. data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
  227. data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
  228. data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
  229. data/lib/rubocop/cop/lint/rand_one.rb +0 -4
  230. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
  231. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
  232. data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
  233. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
  234. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
  235. data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
  236. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
  237. data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
  238. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
  239. data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
  240. data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
  241. data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
  242. data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
  243. data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
  244. data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
  245. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
  246. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
  247. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
  248. data/lib/rubocop/cop/lint/script_permission.rb +3 -3
  249. data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
  250. data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
  251. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  252. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
  253. data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
  254. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  255. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
  256. data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
  257. data/lib/rubocop/cop/lint/syntax.rb +10 -4
  258. data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
  259. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  260. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
  261. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
  262. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
  263. data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
  264. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
  265. data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
  266. data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
  267. data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
  268. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  269. data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
  270. data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
  271. data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
  272. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  273. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
  274. data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
  275. data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
  276. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  277. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
  278. data/lib/rubocop/cop/lint/useless_or.rb +98 -0
  279. data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
  280. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
  281. data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
  282. data/lib/rubocop/cop/lint/useless_times.rb +2 -2
  283. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
  284. data/lib/rubocop/cop/lint/void.rb +92 -18
  285. data/lib/rubocop/cop/message_annotator.rb +7 -3
  286. data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
  287. data/lib/rubocop/cop/metrics/block_length.rb +7 -5
  288. data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
  289. data/lib/rubocop/cop/metrics/class_length.rb +21 -15
  290. data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
  291. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
  292. data/lib/rubocop/cop/metrics/method_length.rb +15 -6
  293. data/lib/rubocop/cop/metrics/module_length.rb +7 -6
  294. data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
  295. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
  296. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
  297. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  298. data/lib/rubocop/cop/mixin/alignment.rb +8 -4
  299. data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
  300. data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
  301. data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
  302. data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
  303. data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
  304. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
  305. data/lib/rubocop/cop/mixin/code_length.rb +12 -1
  306. data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
  307. data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
  308. data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
  309. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  310. data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
  311. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  312. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  313. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
  314. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  315. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
  316. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
  317. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  318. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  319. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
  320. data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
  321. data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
  322. data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
  323. data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
  324. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
  325. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  326. data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
  327. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  328. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
  329. data/lib/rubocop/cop/mixin/range_help.rb +15 -4
  330. data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
  331. data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
  332. data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
  333. data/lib/rubocop/cop/mixin/string_help.rb +2 -2
  334. data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
  335. data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
  336. data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
  337. data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
  338. data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
  339. data/lib/rubocop/cop/naming/constant_name.rb +7 -9
  340. data/lib/rubocop/cop/naming/file_name.rb +4 -6
  341. data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
  342. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
  343. data/lib/rubocop/cop/naming/method_name.rb +185 -15
  344. data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
  345. data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
  346. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
  347. data/lib/rubocop/cop/naming/variable_name.rb +50 -6
  348. data/lib/rubocop/cop/naming/variable_number.rb +2 -3
  349. data/lib/rubocop/cop/offense.rb +4 -5
  350. data/lib/rubocop/cop/registry.rb +9 -6
  351. data/lib/rubocop/cop/security/compound_hash.rb +4 -2
  352. data/lib/rubocop/cop/security/eval.rb +2 -1
  353. data/lib/rubocop/cop/security/json_load.rb +33 -11
  354. data/lib/rubocop/cop/security/open.rb +3 -2
  355. data/lib/rubocop/cop/security/yaml_load.rb +3 -2
  356. data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
  357. data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
  358. data/lib/rubocop/cop/style/alias.rb +2 -1
  359. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
  360. data/lib/rubocop/cop/style/and_or.rb +1 -1
  361. data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
  362. data/lib/rubocop/cop/style/array_first_last.rb +80 -0
  363. data/lib/rubocop/cop/style/array_intersect.rb +115 -39
  364. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
  365. data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
  366. data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
  367. data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
  368. data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
  369. data/lib/rubocop/cop/style/case_like_if.rb +14 -17
  370. data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
  371. data/lib/rubocop/cop/style/class_check.rb +1 -0
  372. data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
  373. data/lib/rubocop/cop/style/class_vars.rb +3 -3
  374. data/lib/rubocop/cop/style/collection_compact.rb +25 -15
  375. data/lib/rubocop/cop/style/collection_methods.rb +2 -1
  376. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  377. data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
  378. data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
  379. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  380. data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
  381. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  382. data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
  383. data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
  384. data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
  385. data/lib/rubocop/cop/style/copyright.rb +31 -21
  386. data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
  387. data/lib/rubocop/cop/style/date_time.rb +5 -4
  388. data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
  389. data/lib/rubocop/cop/style/dig_chain.rb +89 -0
  390. data/lib/rubocop/cop/style/documentation.rb +25 -25
  391. data/lib/rubocop/cop/style/documentation_method.rb +20 -0
  392. data/lib/rubocop/cop/style/double_negation.rb +5 -5
  393. data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
  394. data/lib/rubocop/cop/style/each_with_object.rb +3 -4
  395. data/lib/rubocop/cop/style/empty_else.rb +10 -7
  396. data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
  397. data/lib/rubocop/cop/style/empty_literal.rb +36 -23
  398. data/lib/rubocop/cop/style/empty_method.rb +1 -1
  399. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
  400. data/lib/rubocop/cop/style/endless_method.rb +163 -18
  401. data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
  402. data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
  403. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  404. data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
  405. data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
  406. data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
  407. data/lib/rubocop/cop/style/file_null.rb +89 -0
  408. data/lib/rubocop/cop/style/file_read.rb +2 -5
  409. data/lib/rubocop/cop/style/file_touch.rb +75 -0
  410. data/lib/rubocop/cop/style/file_write.rb +2 -5
  411. data/lib/rubocop/cop/style/float_division.rb +8 -4
  412. data/lib/rubocop/cop/style/for.rb +3 -1
  413. data/lib/rubocop/cop/style/format_string.rb +9 -9
  414. data/lib/rubocop/cop/style/format_string_token.rb +38 -11
  415. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  416. data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
  417. data/lib/rubocop/cop/style/global_vars.rb +1 -3
  418. data/lib/rubocop/cop/style/guard_clause.rb +20 -4
  419. data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
  420. data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
  421. data/lib/rubocop/cop/style/hash_except.rb +38 -146
  422. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  423. data/lib/rubocop/cop/style/hash_slice.rb +80 -0
  424. data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
  425. data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
  426. data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
  427. data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
  428. data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
  429. data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
  430. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
  431. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
  432. data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
  433. data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
  434. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  435. data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
  436. data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
  437. data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
  438. data/lib/rubocop/cop/style/it_assignment.rb +93 -0
  439. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  440. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
  441. data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
  442. data/lib/rubocop/cop/style/lambda.rb +2 -1
  443. data/lib/rubocop/cop/style/lambda_call.rb +10 -4
  444. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  445. data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
  446. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
  447. data/lib/rubocop/cop/style/map_into_array.rb +236 -0
  448. data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
  449. data/lib/rubocop/cop/style/map_to_set.rb +4 -5
  450. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
  451. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
  452. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
  453. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
  454. data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
  455. data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
  456. data/lib/rubocop/cop/style/missing_else.rb +2 -4
  457. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
  458. data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
  459. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  460. data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
  461. data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
  462. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
  463. data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
  464. data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
  465. data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
  466. data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
  467. data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
  468. data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
  469. data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
  470. data/lib/rubocop/cop/style/next.rb +45 -1
  471. data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
  472. data/lib/rubocop/cop/style/not.rb +1 -1
  473. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
  474. data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
  475. data/lib/rubocop/cop/style/object_then.rb +16 -14
  476. data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
  477. data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
  478. data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
  479. data/lib/rubocop/cop/style/or_assignment.rb +3 -6
  480. data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
  481. data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
  482. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
  483. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  484. data/lib/rubocop/cop/style/proc.rb +2 -2
  485. data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
  486. data/lib/rubocop/cop/style/raise_args.rb +19 -14
  487. data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
  488. data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
  489. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  490. data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
  491. data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
  492. data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
  493. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
  494. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
  495. data/lib/rubocop/cop/style/redundant_each.rb +7 -4
  496. data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
  497. data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
  498. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
  499. data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
  500. data/lib/rubocop/cop/style/redundant_format.rb +283 -0
  501. data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
  502. data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
  503. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  504. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
  505. data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
  506. data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
  507. data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
  508. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
  509. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
  510. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
  511. data/lib/rubocop/cop/style/redundant_return.rb +9 -3
  512. data/lib/rubocop/cop/style/redundant_self.rb +32 -20
  513. data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
  514. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
  515. data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
  516. data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
  517. data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
  518. data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
  519. data/lib/rubocop/cop/style/require_order.rb +2 -2
  520. data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
  521. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  522. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
  523. data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
  524. data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
  525. data/lib/rubocop/cop/style/sample.rb +3 -4
  526. data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
  527. data/lib/rubocop/cop/style/self_assignment.rb +12 -18
  528. data/lib/rubocop/cop/style/semicolon.rb +30 -7
  529. data/lib/rubocop/cop/style/send.rb +4 -4
  530. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
  531. data/lib/rubocop/cop/style/signal_exception.rb +2 -3
  532. data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
  533. data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
  534. data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
  535. data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
  536. data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
  537. data/lib/rubocop/cop/style/sole_nested_conditional.rb +72 -87
  538. data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
  539. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  540. data/lib/rubocop/cop/style/string_chars.rb +1 -0
  541. data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
  542. data/lib/rubocop/cop/style/string_literals.rb +1 -1
  543. data/lib/rubocop/cop/style/string_methods.rb +1 -1
  544. data/lib/rubocop/cop/style/strip.rb +7 -4
  545. data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
  546. data/lib/rubocop/cop/style/super_arguments.rb +221 -0
  547. data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
  548. data/lib/rubocop/cop/style/swap_values.rb +4 -15
  549. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  550. data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
  551. data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
  552. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
  553. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
  554. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  555. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  556. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  557. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
  558. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  559. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  560. data/lib/rubocop/cop/style/unpack_first.rb +11 -14
  561. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
  562. data/lib/rubocop/cop/style/while_until_do.rb +0 -2
  563. data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
  564. data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
  565. data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
  566. data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
  567. data/lib/rubocop/cop/team.rb +28 -4
  568. data/lib/rubocop/cop/util.rb +19 -6
  569. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  570. data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
  571. data/lib/rubocop/cop/variable_force/branch.rb +1 -1
  572. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  573. data/lib/rubocop/cop/variable_force/variable.rb +14 -3
  574. data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
  575. data/lib/rubocop/cop/variable_force.rb +43 -20
  576. data/lib/rubocop/cops_documentation_generator.rb +135 -58
  577. data/lib/rubocop/core_ext/string.rb +2 -6
  578. data/lib/rubocop/directive_comment.rb +54 -18
  579. data/lib/rubocop/ext/regexp_node.rb +17 -35
  580. data/lib/rubocop/ext/regexp_parser.rb +4 -21
  581. data/lib/rubocop/file_finder.rb +9 -4
  582. data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
  583. data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
  584. data/lib/rubocop/formatter/formatter_set.rb +8 -2
  585. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  586. data/lib/rubocop/formatter/html_formatter.rb +38 -15
  587. data/lib/rubocop/formatter/json_formatter.rb +0 -1
  588. data/lib/rubocop/formatter/junit_formatter.rb +70 -23
  589. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  590. data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
  591. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  592. data/lib/rubocop/formatter/tap_formatter.rb +3 -7
  593. data/lib/rubocop/formatter.rb +1 -1
  594. data/lib/rubocop/lockfile.rb +58 -7
  595. data/lib/rubocop/lsp/diagnostic.rb +190 -0
  596. data/lib/rubocop/lsp/logger.rb +3 -3
  597. data/lib/rubocop/lsp/routes.rb +77 -40
  598. data/lib/rubocop/lsp/runtime.rb +20 -50
  599. data/lib/rubocop/lsp/server.rb +6 -4
  600. data/lib/rubocop/lsp/severity.rb +1 -1
  601. data/lib/rubocop/lsp/stdin_runner.rb +69 -0
  602. data/lib/rubocop/lsp.rb +36 -0
  603. data/lib/rubocop/magic_comment.rb +12 -4
  604. data/lib/rubocop/options.rb +43 -22
  605. data/lib/rubocop/path_util.rb +21 -10
  606. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  607. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  608. data/lib/rubocop/plugin/load_error.rb +26 -0
  609. data/lib/rubocop/plugin/loader.rb +100 -0
  610. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  611. data/lib/rubocop/plugin.rb +46 -0
  612. data/lib/rubocop/rake_task.rb +5 -2
  613. data/lib/rubocop/remote_config.rb +5 -1
  614. data/lib/rubocop/result_cache.rb +29 -34
  615. data/lib/rubocop/rspec/cop_helper.rb +20 -2
  616. data/lib/rubocop/rspec/expect_offense.rb +31 -12
  617. data/lib/rubocop/rspec/shared_contexts.rb +112 -18
  618. data/lib/rubocop/rspec/support.rb +7 -2
  619. data/lib/rubocop/runner.rb +40 -13
  620. data/lib/rubocop/server/cache.rb +63 -11
  621. data/lib/rubocop/server/cli.rb +2 -2
  622. data/lib/rubocop/server/client_command/base.rb +10 -0
  623. data/lib/rubocop/server/client_command/exec.rb +3 -3
  624. data/lib/rubocop/server/client_command/start.rb +11 -1
  625. data/lib/rubocop/server/core.rb +5 -0
  626. data/lib/rubocop/server/server_command/exec.rb +0 -1
  627. data/lib/rubocop/target_finder.rb +93 -82
  628. data/lib/rubocop/target_ruby.rb +111 -81
  629. data/lib/rubocop/version.rb +67 -9
  630. data/lib/rubocop/yaml_duplication_checker.rb +20 -26
  631. data/lib/rubocop.rb +61 -3
  632. data/lib/ruby_lsp/rubocop/addon.rb +90 -0
  633. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  634. metadata +103 -51
  635. data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
  636. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  637. data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
  638. /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
@@ -29,9 +29,10 @@ module RuboCop
29
29
  def on_hash(node)
30
30
  return if node.pairs.empty? || node.pairs.any?(&:hash_rocket?)
31
31
  return unless (parent = node.parent)
32
- return if parent.call_type? && !merge_method?(parent)
32
+ return unless parent.type?(:call, :kwsplat)
33
+ return unless mergeable?(parent)
33
34
  return unless (kwsplat = node.each_ancestor(:kwsplat).first)
34
- return if allowed_double_splat_receiver?(kwsplat)
35
+ return if !node.braces? || allowed_double_splat_receiver?(kwsplat)
35
36
 
36
37
  add_offense(kwsplat) do |corrector|
37
38
  autocorrect(corrector, node, kwsplat)
@@ -42,9 +43,11 @@ module RuboCop
42
43
  private
43
44
 
44
45
  def allowed_double_splat_receiver?(kwsplat)
45
- return false unless kwsplat.children.first.call_type?
46
+ first_child = kwsplat.children.first
47
+ return true if first_child.any_block_type?
48
+ return false unless first_child.call_type?
46
49
 
47
- root_receiver = root_receiver(kwsplat.children.first)
50
+ root_receiver = root_receiver(first_child)
48
51
 
49
52
  !root_receiver&.hash_type?
50
53
  end
@@ -70,8 +73,8 @@ module RuboCop
70
73
  end
71
74
 
72
75
  def select_merge_method_nodes(kwsplat)
73
- extract_send_methods(kwsplat).select do |node|
74
- merge_method?(node)
76
+ kwsplat.each_descendant(:call).select do |node|
77
+ mergeable?(node)
75
78
  end
76
79
  end
77
80
 
@@ -86,7 +89,7 @@ module RuboCop
86
89
  def autocorrect_merge_methods(corrector, merge_methods, kwsplat)
87
90
  range = range_of_merge_methods(merge_methods)
88
91
 
89
- new_kwsplat_arguments = extract_send_methods(kwsplat).map do |descendant|
92
+ new_kwsplat_arguments = kwsplat.each_descendant(:call).map do |descendant|
90
93
  convert_to_new_arguments(descendant)
91
94
  end
92
95
  new_source = new_kwsplat_arguments.compact.reverse.unshift('').join(', ')
@@ -101,12 +104,8 @@ module RuboCop
101
104
  begin_merge_method.loc.dot.begin.join(end_merge_method.source_range.end)
102
105
  end
103
106
 
104
- def extract_send_methods(kwsplat)
105
- kwsplat.each_descendant(:send, :csend)
106
- end
107
-
108
107
  def convert_to_new_arguments(node)
109
- return unless merge_method?(node)
108
+ return unless mergeable?(node)
110
109
 
111
110
  node.arguments.map do |arg|
112
111
  if arg.hash_type?
@@ -117,8 +116,12 @@ module RuboCop
117
116
  end
118
117
  end
119
118
 
120
- def merge_method?(node)
121
- MERGE_METHODS.include?(node.method_name)
119
+ def mergeable?(node)
120
+ return true unless node.call_type?
121
+ return false unless MERGE_METHODS.include?(node.method_name)
122
+ return true unless (parent = node.parent)
123
+
124
+ mergeable?(parent)
122
125
  end
123
126
  end
124
127
  end
@@ -56,6 +56,7 @@ module RuboCop
56
56
  end
57
57
  end
58
58
  end
59
+ alias on_csend on_send
59
60
 
60
61
  private
61
62
 
@@ -64,7 +65,7 @@ module RuboCop
64
65
  return if node.last_argument&.block_pass_type?
65
66
 
66
67
  if node.method?(:each) && !node.parent&.block_type?
67
- ancestor_node = node.each_ancestor(:send).detect do |ancestor|
68
+ ancestor_node = node.each_ancestor(:call).detect do |ancestor|
68
69
  ancestor.receiver == node &&
69
70
  (RESTRICT_ON_SEND.include?(ancestor.method_name) || ancestor.method?(:reverse_each))
70
71
  end
@@ -83,10 +84,12 @@ module RuboCop
83
84
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
84
85
 
85
86
  def range(node)
86
- if node.method?(:each)
87
- node.loc.dot.join(node.loc.selector)
87
+ return node.selector unless node.method?(:each)
88
+
89
+ if node.parent&.call_type?
90
+ node.selector.join(node.parent.loc.dot)
88
91
  else
89
- node.loc.selector
92
+ node.loc.dot.join(node.selector)
90
93
  end
91
94
  end
92
95
 
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Checks for RuntimeError as the argument of raise/fail.
6
+ # Checks for `RuntimeError` as the argument of `raise`/`fail`.
7
7
  #
8
8
  # @example
9
9
  # # bad
@@ -51,7 +51,7 @@ module RuboCop
51
51
  end
52
52
 
53
53
  def string_message?(message)
54
- message.str_type? || message.dstr_type? || message.xstr_type?
54
+ message.any_str_type?
55
55
  end
56
56
 
57
57
  def fix_compact(node)
@@ -47,9 +47,9 @@ module RuboCop
47
47
  # @!method redundant_fetch_block_candidate?(node)
48
48
  def_node_matcher :redundant_fetch_block_candidate?, <<~PATTERN
49
49
  (block
50
- $(send _ :fetch _)
50
+ $(call _ :fetch _)
51
51
  (args)
52
- ${nil? #basic_literal? #const_type?})
52
+ ${nil? basic_literal? const_type?})
53
53
  PATTERN
54
54
 
55
55
  def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
@@ -61,24 +61,16 @@ module RuboCop
61
61
  bad = build_bad_method(send, body)
62
62
 
63
63
  add_offense(range, message: format(MSG, good: good, bad: bad)) do |corrector|
64
- receiver, _, key = send.children
64
+ _, _, key = send.children
65
65
  default_value = body ? body.source : 'nil'
66
66
 
67
- corrector.replace(node, "#{receiver.source}.fetch(#{key.source}, #{default_value})")
67
+ corrector.replace(range, "fetch(#{key.source}, #{default_value})")
68
68
  end
69
69
  end
70
70
  end
71
71
 
72
72
  private
73
73
 
74
- def basic_literal?(node)
75
- node&.basic_literal?
76
- end
77
-
78
- def const_type?(node)
79
- node&.const_type?
80
- end
81
-
82
74
  def should_not_check?(send, body)
83
75
  (body&.const_type? && !check_for_constant?) ||
84
76
  (body&.str_type? && !check_for_string?) ||
@@ -6,7 +6,7 @@ module RuboCop
6
6
  # Checks for the presence of superfluous `.rb` extension in
7
7
  # the filename provided to `require` and `require_relative`.
8
8
  #
9
- # Note: If the extension is omitted, Ruby tries adding '.rb', '.so',
9
+ # NOTE: If the extension is omitted, Ruby tries adding '.rb', '.so',
10
10
  # and so on to the name until found. If the file named cannot be found,
11
11
  # a `LoadError` will be raised.
12
12
  # There is an edge case where `foo.so` file is loaded instead of a `LoadError`
@@ -60,10 +60,10 @@ module RuboCop
60
60
 
61
61
  # @!method select_predicate?(node)
62
62
  def_node_matcher :select_predicate?, <<~PATTERN
63
- (send
63
+ (call
64
64
  {
65
- (block $(send _ {:select :filter :find_all}) ...)
66
- $(send _ {:select :filter :find_all} block_pass_type?)
65
+ (block $(call _ {:select :filter :find_all}) ...)
66
+ $(call _ {:select :filter :find_all} block_pass_type?)
67
67
  }
68
68
  ${:#{RESTRICT_ON_SEND.join(' :')}})
69
69
  PATTERN
@@ -79,7 +79,7 @@ module RuboCop
79
79
  private_constant :REPLACEMENT_METHODS
80
80
 
81
81
  def on_send(node)
82
- return if node.arguments? || node.block_node
82
+ return if node.arguments? || node.block_literal?
83
83
 
84
84
  select_predicate?(node) do |select_node, filter_method|
85
85
  return if RAILS_METHODS.include?(filter_method) && !active_support_extensions_enabled?
@@ -87,6 +87,7 @@ module RuboCop
87
87
  register_offense(select_node, node)
88
88
  end
89
89
  end
90
+ alias on_csend on_send
90
91
 
91
92
  private
92
93
 
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Checks for calls to `Kernel#format` or `Kernel#sprintf` that are redundant.
7
+ #
8
+ # Calling `format` with only a single string or constant argument is redundant,
9
+ # as it can be replaced by the string or constant itself.
10
+ #
11
+ # Also looks for `format` calls where the arguments are literals that can be
12
+ # inlined into a string easily. This applies to the `%s`, `%d`, `%i`, `%u`, and
13
+ # `%f` format specifiers.
14
+ #
15
+ # @safety
16
+ # This cop's autocorrection is unsafe because string object returned by
17
+ # `format` and `sprintf` are never frozen. If `format('string')` is autocorrected to
18
+ # `'string'`, `FrozenError` may occur when calling a destructive method like `String#<<`.
19
+ # Consider using `'string'.dup` instead of `format('string')`.
20
+ # Additionally, since the necessity of `dup` cannot be determined automatically,
21
+ # this autocorrection is inherently unsafe.
22
+ #
23
+ # [source,ruby]
24
+ # ----
25
+ # # frozen_string_literal: true
26
+ #
27
+ # format('template').frozen? # => false
28
+ # 'template'.frozen? # => true
29
+ # ----
30
+ #
31
+ # @example
32
+ #
33
+ # # bad
34
+ # format('the quick brown fox jumps over the lazy dog.')
35
+ # sprintf('the quick brown fox jumps over the lazy dog.')
36
+ #
37
+ # # good
38
+ # 'the quick brown fox jumps over the lazy dog.'
39
+ #
40
+ # # bad
41
+ # format(MESSAGE)
42
+ # sprintf(MESSAGE)
43
+ #
44
+ # # good
45
+ # MESSAGE
46
+ #
47
+ # # bad
48
+ # format('%s %s', 'foo', 'bar')
49
+ # sprintf('%s %s', 'foo', 'bar')
50
+ #
51
+ # # good
52
+ # 'foo bar'
53
+ #
54
+ class RedundantFormat < Base
55
+ extend AutoCorrector
56
+
57
+ MSG = 'Use `%<prefer>s` directly instead of `%<method_name>s`.'
58
+
59
+ RESTRICT_ON_SEND = %i[format sprintf].to_set.freeze
60
+ ACCEPTABLE_LITERAL_TYPES = %i[str dstr sym dsym numeric boolean nil].freeze
61
+
62
+ # @!method format_without_additional_args?(node)
63
+ def_node_matcher :format_without_additional_args?, <<~PATTERN
64
+ (send {(const {nil? cbase} :Kernel) nil?} %RESTRICT_ON_SEND ${str dstr const})
65
+ PATTERN
66
+
67
+ # @!method rational_number?(node)
68
+ def_node_matcher :rational_number?, <<~PATTERN
69
+ {rational (send int :/ rational) (begin rational) (begin (send int :/ rational))}
70
+ PATTERN
71
+
72
+ # @!method complex_number?(node)
73
+ def_node_matcher :complex_number?, <<~PATTERN
74
+ {complex (send int :+ complex) (begin complex) (begin (send int :+ complex))}
75
+ PATTERN
76
+
77
+ # @!method find_hash_value_node(node, name)
78
+ def_node_search :find_hash_value_node, <<~PATTERN
79
+ (pair (sym %1) $_)
80
+ PATTERN
81
+
82
+ # @!method splatted_arguments?(node)
83
+ def_node_matcher :splatted_arguments?, <<~PATTERN
84
+ (send _ %RESTRICT_ON_SEND <{
85
+ splat
86
+ (hash <kwsplat ...>)
87
+ } ...>)
88
+ PATTERN
89
+
90
+ def on_send(node)
91
+ format_without_additional_args?(node) do |value|
92
+ replacement = escape_control_chars(value.source)
93
+
94
+ add_offense(node, message: message(node, replacement)) do |corrector|
95
+ corrector.replace(node, replacement)
96
+ end
97
+ return
98
+ end
99
+
100
+ detect_unnecessary_fields(node)
101
+ end
102
+
103
+ private
104
+
105
+ def message(node, prefer)
106
+ format(MSG, prefer: prefer, method_name: node.method_name)
107
+ end
108
+
109
+ def detect_unnecessary_fields(node)
110
+ return unless node.first_argument&.str_type?
111
+
112
+ string = node.first_argument.value
113
+ arguments = node.arguments[1..]
114
+
115
+ return unless string && arguments.any?
116
+ return if splatted_arguments?(node)
117
+
118
+ register_all_fields_literal(node, string, arguments)
119
+ end
120
+
121
+ def register_all_fields_literal(node, string, arguments)
122
+ return unless all_fields_literal?(string, arguments.dup)
123
+
124
+ format_arguments = argument_values(arguments)
125
+ begin
126
+ formatted_string = format(string, *format_arguments)
127
+ rescue ArgumentError
128
+ return
129
+ end
130
+ replacement = quote(formatted_string, node)
131
+
132
+ add_offense(node, message: message(node, replacement)) do |corrector|
133
+ corrector.replace(node, replacement)
134
+ end
135
+ end
136
+
137
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
138
+ def all_fields_literal?(string, arguments)
139
+ count = 0
140
+ sequences = RuboCop::Cop::Utils::FormatString.new(string).format_sequences
141
+ return false unless sequences.any?
142
+
143
+ sequences.each do |sequence|
144
+ next if sequence.percent?
145
+ next if unknown_variable_width?(sequence, arguments)
146
+
147
+ hash = arguments.detect(&:hash_type?)
148
+ next unless (argument = find_argument(sequence, arguments, hash))
149
+ next unless matching_argument?(sequence, argument)
150
+ next if (sequence.width || sequence.precision) && argument.dstr_type?
151
+
152
+ count += 1
153
+ end
154
+
155
+ sequences.size == count
156
+ end
157
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
158
+
159
+ # If the sequence has a variable (`*`) width, it cannot be autocorrected
160
+ # if the width is not given as a numeric literal argument
161
+ def unknown_variable_width?(sequence, arguments)
162
+ return false unless sequence.variable_width?
163
+
164
+ argument = arguments[sequence.variable_width_argument_number - 1]
165
+ !numeric?(argument)
166
+ end
167
+
168
+ # rubocop:disable Metrics/AbcSize
169
+ def find_argument(sequence, arguments, hash)
170
+ if hash && (sequence.annotated? || sequence.template?)
171
+ find_hash_value_node(hash, sequence.name.to_sym).first
172
+ elsif sequence.variable_width?
173
+ # If the specifier contains `*`, the argument for the width can be ignored.
174
+ arguments.delete_at(sequence.variable_width_argument_number - 1)
175
+ arguments.shift
176
+ elsif sequence.arg_number
177
+ arguments[sequence.arg_number.to_i - 1]
178
+ else
179
+ arguments.shift
180
+ end
181
+ end
182
+ # rubocop:enable Metrics/AbcSize
183
+
184
+ def matching_argument?(sequence, argument)
185
+ # Template specifiers don't give a type, any acceptable literal type is ok.
186
+ return argument.type?(*ACCEPTABLE_LITERAL_TYPES) if sequence.template?
187
+
188
+ # An argument matches a specifier if it can be easily converted
189
+ # to that type.
190
+ case sequence.type
191
+ when 's'
192
+ argument.type?(*ACCEPTABLE_LITERAL_TYPES)
193
+ when 'd', 'i', 'u'
194
+ integer?(argument)
195
+ when 'f'
196
+ float?(argument)
197
+ else
198
+ false
199
+ end
200
+ end
201
+
202
+ def numeric?(argument)
203
+ argument.type?(:numeric, :str) ||
204
+ rational_number?(argument) ||
205
+ complex_number?(argument)
206
+ end
207
+
208
+ def integer?(argument)
209
+ numeric?(argument) && Integer(argument_value(argument), exception: false)
210
+ end
211
+
212
+ def float?(argument)
213
+ numeric?(argument) && Float(argument_value(argument), exception: false)
214
+ end
215
+
216
+ # Add correct quotes to the formatted string, preferring retaining the existing
217
+ # quotes if possible.
218
+ def quote(string, node)
219
+ str_node = node.first_argument
220
+ start_delimiter = str_node.loc.begin.source
221
+ end_delimiter = str_node.loc.end.source
222
+
223
+ # If there is any interpolation, the delimiters need to be changed potentially
224
+ if node.each_descendant(:dstr, :dsym).any?
225
+ case start_delimiter
226
+ when "'"
227
+ start_delimiter = end_delimiter = '"'
228
+ when /\A%q(.)/
229
+ start_delimiter = "%Q#{Regexp.last_match[1]}"
230
+ end
231
+ end
232
+
233
+ "#{start_delimiter}#{escape_control_chars(string)}#{end_delimiter}"
234
+ end
235
+
236
+ # Escape any control characters in the string (eg. `\t` or `\n` become `\\t` or `\\n`)
237
+ def escape_control_chars(string)
238
+ string.gsub(/\p{Cc}/) { |s| s.dump[1..-2] }
239
+ end
240
+
241
+ def argument_values(arguments)
242
+ arguments.map { |argument| argument_value(argument) }
243
+ end
244
+
245
+ def argument_value(argument)
246
+ argument = argument.children.first if argument.begin_type?
247
+
248
+ if argument.dsym_type?
249
+ dsym_value(argument)
250
+ elsif argument.hash_type?
251
+ hash_value(argument)
252
+ elsif rational_number?(argument)
253
+ rational_value(argument)
254
+ elsif complex_number?(argument)
255
+ complex_value(argument)
256
+ elsif argument.respond_to?(:value)
257
+ argument.value
258
+ else
259
+ argument.source
260
+ end
261
+ end
262
+
263
+ def dsym_value(dsym_node)
264
+ dsym_node.children.first.source
265
+ end
266
+
267
+ def hash_value(hash_node)
268
+ hash_node.each_pair.with_object({}) do |pair, hash|
269
+ hash[pair.key.value] = argument_value(pair.value)
270
+ end
271
+ end
272
+
273
+ def rational_value(rational_node)
274
+ rational_node.source.to_r
275
+ end
276
+
277
+ def complex_value(complex_node)
278
+ Complex(complex_node.source)
279
+ end
280
+ end
281
+ end
282
+ end
283
+ end
@@ -3,9 +3,9 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  module Style
6
- # Check for uses of `Object#freeze` on immutable objects.
6
+ # Checks for uses of `Object#freeze` on immutable objects.
7
7
  #
8
- # NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
8
+ # NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
9
9
  #
10
10
  # NOTE: From Ruby 3.0, this cop allows explicit freezing of interpolated
11
11
  # string literals when `# frozen-string-literal: true` is used.
@@ -42,7 +42,7 @@ module RuboCop
42
42
  return true if node.immutable_literal?
43
43
  return true if frozen_string_literal?(node)
44
44
 
45
- target_ruby_version >= 3.0 && (node.regexp_type? || node.range_type?)
45
+ target_ruby_version >= 3.0 && node.type?(:regexp, :range)
46
46
  end
47
47
 
48
48
  def strip_parenthesis(node)
@@ -60,7 +60,7 @@ module RuboCop
60
60
  (begin (send !{(str _) array} {:+ :- :* :** :/ :%} {float int}))
61
61
  (begin (send _ {:== :=== :!= :<= :>= :< :>} _))
62
62
  (send _ {:count :length :size} ...)
63
- (block (send _ {:count :length :size} ...) ...)
63
+ (any_block (send _ {:count :length :size} ...) ...)
64
64
  }
65
65
  PATTERN
66
66
  end
@@ -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
 
@@ -49,9 +49,10 @@ module RuboCop
49
49
  def on_dstr(node)
50
50
  return unless single_interpolation?(node)
51
51
 
52
- add_offense(node) do |corrector|
53
- embedded_node = node.children.first
52
+ embedded_node = node.children.first
53
+ return if use_match_pattern?(embedded_node)
54
54
 
55
+ add_offense(node) do |corrector|
55
56
  if variable_interpolation?(embedded_node)
56
57
  autocorrect_variable_interpolation(corrector, embedded_node, node)
57
58
  elsif single_variable_interpolation?(embedded_node)
@@ -71,6 +72,14 @@ module RuboCop
71
72
  !embedded_in_percent_array?(node)
72
73
  end
73
74
 
75
+ def use_match_pattern?(node)
76
+ return false if target_ruby_version <= 2.7
77
+
78
+ node.children.any? do |child|
79
+ child.respond_to?(:match_pattern_type?) && child.match_pattern_type?
80
+ end
81
+ end
82
+
74
83
  def single_variable_interpolation?(node)
75
84
  return false unless node.children.one?
76
85
 
@@ -130,7 +139,7 @@ module RuboCop
130
139
  end
131
140
 
132
141
  def require_parentheses?(node)
133
- node.send_type? && !node.arguments.count.zero? && !node.parenthesized_call?
142
+ node.send_type? && node.arguments.any? && !node.parenthesized_call?
134
143
  end
135
144
  end
136
145
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Style
6
+ # Before Ruby 3.0, interpolated strings followed the frozen string literal
7
+ # magic comment which sometimes made it necessary to explicitly unfreeze them.
8
+ # Ruby 3.0 changed interpolated strings to always be unfrozen which makes
9
+ # unfreezing them redundant.
10
+ #
11
+ # @example
12
+ # # bad
13
+ # +"#{foo} bar"
14
+ #
15
+ # # bad
16
+ # "#{foo} bar".dup
17
+ #
18
+ # # good
19
+ # "#{foo} bar"
20
+ #
21
+ class RedundantInterpolationUnfreeze < Base
22
+ include FrozenStringLiteral
23
+ extend AutoCorrector
24
+ extend TargetRubyVersion
25
+
26
+ MSG = "Don't unfreeze interpolated strings as they are already unfrozen."
27
+
28
+ RESTRICT_ON_SEND = %i[+@ dup].freeze
29
+
30
+ minimum_target_ruby_version 3.0
31
+
32
+ def on_send(node)
33
+ return if node.arguments?
34
+ return unless (receiver = node.receiver)
35
+ return unless receiver.dstr_type?
36
+ return if uninterpolated_string?(receiver) || uninterpolated_heredoc?(receiver)
37
+
38
+ add_offense(node.loc.selector) do |corrector|
39
+ corrector.remove(node.loc.selector)
40
+ corrector.remove(node.loc.dot) unless node.unary_operation?
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end