rubocop 1.71.1 → 1.88.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +23 -19
  4. data/config/default.yml +513 -149
  5. data/config/internal_affairs.yml +20 -0
  6. data/config/obsoletion.yml +38 -4
  7. data/exe/rubocop +1 -8
  8. data/lib/rubocop/cache_config.rb +29 -0
  9. data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
  10. data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
  11. data/lib/rubocop/cli/command/lsp.rb +1 -1
  12. data/lib/rubocop/cli/command/mcp.rb +19 -0
  13. data/lib/rubocop/cli/command/show_cops.rb +2 -2
  14. data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
  15. data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
  16. data/lib/rubocop/cli.rb +48 -11
  17. data/lib/rubocop/comment_config.rb +60 -18
  18. data/lib/rubocop/config.rb +53 -16
  19. data/lib/rubocop/config_finder.rb +1 -1
  20. data/lib/rubocop/config_loader.rb +65 -49
  21. data/lib/rubocop/config_loader_resolver.rb +44 -19
  22. data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
  23. data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
  24. data/lib/rubocop/config_obsoletion.rb +46 -2
  25. data/lib/rubocop/config_store.rb +7 -2
  26. data/lib/rubocop/config_validator.rb +7 -6
  27. data/lib/rubocop/cop/autocorrect_logic.rb +27 -14
  28. data/lib/rubocop/cop/base.rb +38 -12
  29. data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
  30. data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
  31. data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
  32. data/lib/rubocop/cop/commissioner.rb +13 -11
  33. data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
  34. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  35. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
  36. data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
  37. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
  38. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
  39. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
  40. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
  41. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  42. data/lib/rubocop/cop/correctors.rb +28 -0
  43. data/lib/rubocop/cop/documentation.rb +2 -3
  44. data/lib/rubocop/cop/exclude_limit.rb +31 -5
  45. data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
  46. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  47. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
  48. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
  49. data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
  50. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
  51. data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
  52. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
  53. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  54. data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
  55. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  56. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +13 -13
  57. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
  58. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -1
  59. data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
  60. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
  61. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
  62. data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
  63. data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
  64. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
  65. data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
  66. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
  67. data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
  68. data/lib/rubocop/cop/internal_affairs.rb +3 -16
  69. data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
  70. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  71. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  72. data/lib/rubocop/cop/layout/block_alignment.rb +60 -4
  73. data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
  74. data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
  75. data/lib/rubocop/cop/layout/class_structure.rb +56 -10
  76. data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
  77. data/lib/rubocop/cop/layout/comment_indentation.rb +9 -2
  78. data/lib/rubocop/cop/layout/condition_position.rb +13 -3
  79. data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
  80. data/lib/rubocop/cop/layout/dot_position.rb +2 -2
  81. data/lib/rubocop/cop/layout/else_alignment.rb +2 -15
  82. data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
  83. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +28 -9
  84. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
  85. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
  86. data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
  87. data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
  88. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
  89. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
  90. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
  91. data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
  92. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  93. data/lib/rubocop/cop/layout/end_alignment.rb +10 -3
  94. data/lib/rubocop/cop/layout/first_argument_indentation.rb +35 -2
  95. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
  96. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
  97. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
  98. data/lib/rubocop/cop/layout/hash_alignment.rb +5 -8
  99. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
  100. data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
  101. data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
  102. data/lib/rubocop/cop/layout/indentation_width.rb +152 -7
  103. data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
  104. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
  105. data/lib/rubocop/cop/layout/line_length.rb +62 -15
  106. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
  107. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
  108. data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
  109. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
  110. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
  111. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +236 -41
  112. data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
  113. data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
  114. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  115. data/lib/rubocop/cop/layout/redundant_line_break.rb +12 -6
  116. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -7
  117. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
  118. data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
  119. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
  120. data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
  121. data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
  122. data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
  123. data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
  124. data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
  125. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
  126. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +12 -3
  127. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
  128. data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
  129. data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
  130. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -11
  131. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
  132. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
  133. data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
  134. data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
  135. data/lib/rubocop/cop/lint/assignment_in_condition.rb +13 -1
  136. data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
  137. data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
  138. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
  139. data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
  140. data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
  141. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
  142. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  143. data/lib/rubocop/cop/lint/debugger.rb +13 -4
  144. data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
  145. data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
  146. data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
  147. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
  148. data/lib/rubocop/cop/lint/duplicate_methods.rb +219 -32
  149. data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
  150. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  151. data/lib/rubocop/cop/lint/empty_block.rb +4 -4
  152. data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
  153. data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
  154. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  155. data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
  156. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  157. data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
  158. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
  159. data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
  160. data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
  161. data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
  162. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
  163. data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
  164. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  165. data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -11
  166. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
  167. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
  168. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
  169. data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
  170. data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
  171. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  172. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  173. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
  174. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
  175. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
  176. data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
  177. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  178. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
  179. data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
  180. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
  181. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
  182. data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
  183. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  184. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
  185. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
  186. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
  187. data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
  188. data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -23
  189. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -11
  190. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
  191. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +268 -0
  192. data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -1
  193. data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
  194. data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
  195. data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
  196. data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
  197. data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
  198. data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
  199. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
  200. data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
  201. data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
  202. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +22 -4
  203. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
  204. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  205. data/lib/rubocop/cop/lint/script_permission.rb +5 -1
  206. data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
  207. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
  208. data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
  209. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  210. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
  211. data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
  212. data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
  213. data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
  214. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +123 -0
  215. data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
  216. data/lib/rubocop/cop/lint/syntax.rb +25 -1
  217. data/lib/rubocop/cop/lint/to_enum_arguments.rb +36 -3
  218. data/lib/rubocop/cop/lint/to_json.rb +20 -17
  219. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  220. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
  221. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
  222. data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
  223. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
  224. data/lib/rubocop/cop/lint/unreachable_code.rb +17 -9
  225. data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
  226. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  227. data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
  228. data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
  229. data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
  230. data/lib/rubocop/cop/lint/useless_assignment.rb +55 -25
  231. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
  232. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
  233. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
  234. data/lib/rubocop/cop/lint/useless_or.rb +111 -0
  235. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
  236. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +11 -7
  237. data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
  238. data/lib/rubocop/cop/lint/useless_times.rb +22 -1
  239. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +147 -0
  240. data/lib/rubocop/cop/lint/void.rb +50 -21
  241. data/lib/rubocop/cop/message_annotator.rb +7 -3
  242. data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
  243. data/lib/rubocop/cop/metrics/block_length.rb +2 -1
  244. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  245. data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
  246. data/lib/rubocop/cop/metrics/method_length.rb +3 -2
  247. data/lib/rubocop/cop/metrics/perceived_complexity.rb +38 -7
  248. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
  249. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  250. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
  251. data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
  252. data/lib/rubocop/cop/migration/department_name.rb +12 -1
  253. data/lib/rubocop/cop/mixin/alignment.rb +3 -3
  254. data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
  255. data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
  256. data/lib/rubocop/cop/mixin/check_line_breakable.rb +4 -4
  257. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
  258. data/lib/rubocop/cop/mixin/code_length.rb +1 -1
  259. data/lib/rubocop/cop/mixin/comments_help.rb +1 -1
  260. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
  261. data/lib/rubocop/cop/mixin/def_node.rb +1 -1
  262. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
  263. data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
  264. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
  265. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
  266. data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
  267. data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
  268. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
  269. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
  270. data/lib/rubocop/cop/mixin/hash_subset.rb +27 -4
  271. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  272. data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
  273. data/lib/rubocop/cop/mixin/line_length_help.rb +45 -10
  274. data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
  275. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
  276. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
  277. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  278. data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
  279. data/lib/rubocop/cop/mixin/project_index_help.rb +48 -0
  280. data/lib/rubocop/cop/mixin/range_help.rb +15 -3
  281. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  282. data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -7
  283. data/lib/rubocop/cop/mixin/string_help.rb +1 -1
  284. data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
  285. data/lib/rubocop/cop/mixin/trailing_comma.rb +25 -6
  286. data/lib/rubocop/cop/mixin.rb +86 -0
  287. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
  288. data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
  289. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  290. data/lib/rubocop/cop/naming/file_name.rb +6 -5
  291. data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
  292. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -2
  293. data/lib/rubocop/cop/naming/method_name.rb +187 -15
  294. data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
  295. data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
  296. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -4
  297. data/lib/rubocop/cop/naming/variable_name.rb +51 -6
  298. data/lib/rubocop/cop/offense.rb +17 -1
  299. data/lib/rubocop/cop/registry.rb +66 -39
  300. data/lib/rubocop/cop/security/eval.rb +17 -3
  301. data/lib/rubocop/cop/security/io_methods.rb +2 -2
  302. data/lib/rubocop/cop/security/json_load.rb +33 -11
  303. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  304. data/lib/rubocop/cop/security/open.rb +1 -0
  305. data/lib/rubocop/cop/style/access_modifier_declarations.rb +45 -12
  306. data/lib/rubocop/cop/style/accessor_grouping.rb +46 -8
  307. data/lib/rubocop/cop/style/alias.rb +15 -3
  308. data/lib/rubocop/cop/style/and_or.rb +2 -1
  309. data/lib/rubocop/cop/style/arguments_forwarding.rb +46 -31
  310. data/lib/rubocop/cop/style/array_first_last.rb +12 -1
  311. data/lib/rubocop/cop/style/array_intersect.rb +117 -38
  312. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
  313. data/lib/rubocop/cop/style/array_join.rb +4 -2
  314. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  315. data/lib/rubocop/cop/style/attr.rb +5 -2
  316. data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
  317. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  318. data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
  319. data/lib/rubocop/cop/style/block_delimiters.rb +42 -34
  320. data/lib/rubocop/cop/style/case_equality.rb +29 -15
  321. data/lib/rubocop/cop/style/case_like_if.rb +1 -1
  322. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  323. data/lib/rubocop/cop/style/class_and_module_children.rb +67 -12
  324. data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
  325. data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
  326. data/lib/rubocop/cop/style/collection_compact.rb +37 -17
  327. data/lib/rubocop/cop/style/collection_methods.rb +1 -0
  328. data/lib/rubocop/cop/style/collection_querying.rb +167 -0
  329. data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
  330. data/lib/rubocop/cop/style/combinable_loops.rb +6 -0
  331. data/lib/rubocop/cop/style/command_literal.rb +1 -1
  332. data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
  333. data/lib/rubocop/cop/style/comparable_between.rb +78 -0
  334. data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
  335. data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
  336. data/lib/rubocop/cop/style/conditional_assignment.rb +33 -24
  337. data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
  338. data/lib/rubocop/cop/style/copyright.rb +22 -11
  339. data/lib/rubocop/cop/style/data_inheritance.rb +11 -0
  340. data/lib/rubocop/cop/style/date_time.rb +4 -4
  341. data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
  342. data/lib/rubocop/cop/style/dig_chain.rb +6 -1
  343. data/lib/rubocop/cop/style/dir_empty.rb +4 -0
  344. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
  345. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
  346. data/lib/rubocop/cop/style/documentation.rb +6 -6
  347. data/lib/rubocop/cop/style/documentation_method.rb +12 -8
  348. data/lib/rubocop/cop/style/double_negation.rb +3 -3
  349. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  350. data/lib/rubocop/cop/style/each_with_object.rb +4 -3
  351. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  352. data/lib/rubocop/cop/style/empty_case_condition.rb +12 -2
  353. data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
  354. data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
  355. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  356. data/lib/rubocop/cop/style/empty_literal.rb +11 -2
  357. data/lib/rubocop/cop/style/empty_method.rb +0 -6
  358. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
  359. data/lib/rubocop/cop/style/encoding.rb +7 -1
  360. data/lib/rubocop/cop/style/end_block.rb +3 -1
  361. data/lib/rubocop/cop/style/endless_method.rb +181 -18
  362. data/lib/rubocop/cop/style/env_home.rb +4 -0
  363. data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
  364. data/lib/rubocop/cop/style/even_odd.rb +11 -1
  365. data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
  366. data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
  367. data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
  368. data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
  369. data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
  370. data/lib/rubocop/cop/style/file_null.rb +4 -2
  371. data/lib/rubocop/cop/style/file_open.rb +84 -0
  372. data/lib/rubocop/cop/style/file_write.rb +21 -16
  373. data/lib/rubocop/cop/style/float_division.rb +15 -1
  374. data/lib/rubocop/cop/style/for.rb +4 -0
  375. data/lib/rubocop/cop/style/format_string.rb +17 -4
  376. data/lib/rubocop/cop/style/format_string_token.rb +85 -14
  377. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
  378. data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
  379. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  380. data/lib/rubocop/cop/style/guard_clause.rb +29 -23
  381. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
  382. data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
  383. data/lib/rubocop/cop/style/hash_each_methods.rb +3 -2
  384. data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
  385. data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
  386. data/lib/rubocop/cop/style/hash_slice.rb +16 -0
  387. data/lib/rubocop/cop/style/hash_syntax.rb +6 -1
  388. data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
  389. data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
  390. data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -7
  391. data/lib/rubocop/cop/style/if_inside_else.rb +26 -20
  392. data/lib/rubocop/cop/style/if_unless_modifier.rb +83 -16
  393. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +16 -19
  394. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
  395. data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
  396. data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
  397. data/lib/rubocop/cop/style/inline_comment.rb +5 -2
  398. data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
  399. data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
  400. data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
  401. data/lib/rubocop/cop/style/it_assignment.rb +69 -12
  402. data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
  403. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
  404. data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
  405. data/lib/rubocop/cop/style/lambda.rb +8 -1
  406. data/lib/rubocop/cop/style/lambda_call.rb +26 -10
  407. data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
  408. data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
  409. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
  410. data/lib/rubocop/cop/style/map_into_array.rb +5 -2
  411. data/lib/rubocop/cop/style/map_join.rb +123 -0
  412. data/lib/rubocop/cop/style/map_to_hash.rb +12 -3
  413. data/lib/rubocop/cop/style/map_to_set.rb +1 -3
  414. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
  415. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
  416. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +33 -4
  417. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -5
  418. data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
  419. data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
  420. data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
  421. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -7
  422. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  423. data/lib/rubocop/cop/style/module_function.rb +4 -2
  424. data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
  425. data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
  426. data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
  427. data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
  428. data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
  429. data/lib/rubocop/cop/style/multiline_method_signature.rb +13 -16
  430. data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
  431. data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
  432. data/lib/rubocop/cop/style/next.rb +44 -0
  433. data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
  434. data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
  435. data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
  436. data/lib/rubocop/cop/style/not.rb +2 -0
  437. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  438. data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
  439. data/lib/rubocop/cop/style/object_then.rb +1 -0
  440. data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
  441. data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
  442. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  443. data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
  444. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  445. data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
  446. data/lib/rubocop/cop/style/parallel_assignment.rb +57 -25
  447. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  448. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
  449. data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
  450. data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
  451. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  452. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
  453. data/lib/rubocop/cop/style/proc.rb +4 -2
  454. data/lib/rubocop/cop/style/raise_args.rb +9 -9
  455. data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
  456. data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
  457. data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
  458. data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
  459. data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
  460. data/lib/rubocop/cop/style/redundant_condition.rb +61 -1
  461. data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
  462. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
  463. data/lib/rubocop/cop/style/redundant_each.rb +3 -3
  464. data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
  465. data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
  466. data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
  467. data/lib/rubocop/cop/style/redundant_format.rb +312 -0
  468. data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
  469. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
  470. data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
  471. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
  472. data/lib/rubocop/cop/style/redundant_line_continuation.rb +28 -7
  473. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  474. data/lib/rubocop/cop/style/redundant_parentheses.rb +111 -37
  475. data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
  476. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
  477. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
  478. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
  479. data/lib/rubocop/cop/style/redundant_return.rb +3 -1
  480. data/lib/rubocop/cop/style/redundant_self.rb +20 -7
  481. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
  482. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
  483. data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
  484. data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
  485. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
  486. data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
  487. data/lib/rubocop/cop/style/rescue_modifier.rb +6 -3
  488. data/lib/rubocop/cop/style/return_nil.rb +2 -2
  489. data/lib/rubocop/cop/style/reverse_find.rb +51 -0
  490. data/lib/rubocop/cop/style/safe_navigation.rb +67 -20
  491. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  492. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  493. data/lib/rubocop/cop/style/select_by_regexp.rb +53 -20
  494. data/lib/rubocop/cop/style/self_assignment.rb +1 -1
  495. data/lib/rubocop/cop/style/semicolon.rb +45 -12
  496. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  497. data/lib/rubocop/cop/style/single_line_do_end_block.rb +21 -6
  498. data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
  499. data/lib/rubocop/cop/style/sole_nested_conditional.rb +77 -101
  500. data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
  501. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
  502. data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
  503. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
  504. data/lib/rubocop/cop/style/struct_inheritance.rb +24 -2
  505. data/lib/rubocop/cop/style/super_arguments.rb +3 -4
  506. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  507. data/lib/rubocop/cop/style/symbol_proc.rb +10 -7
  508. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  509. data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
  510. data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
  511. data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
  512. data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
  513. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
  514. data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
  515. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  516. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
  517. data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
  518. data/lib/rubocop/cop/style/unless_else.rb +10 -9
  519. data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
  520. data/lib/rubocop/cop/style/while_until_do.rb +7 -0
  521. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
  522. data/lib/rubocop/cop/style/word_array.rb +1 -0
  523. data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
  524. data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
  525. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
  526. data/lib/rubocop/cop/team.rb +105 -40
  527. data/lib/rubocop/cop/util.rb +4 -5
  528. data/lib/rubocop/cop/utils/format_string.rb +20 -5
  529. data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
  530. data/lib/rubocop/cop/variable_force/branch.rb +30 -6
  531. data/lib/rubocop/cop/variable_force/scope.rb +1 -1
  532. data/lib/rubocop/cop/variable_force/variable.rb +10 -3
  533. data/lib/rubocop/cop/variable_force.rb +26 -9
  534. data/lib/rubocop/cops_documentation_generator.rb +23 -7
  535. data/lib/rubocop/directive_comment.rb +80 -3
  536. data/lib/rubocop/ext/regexp_node.rb +0 -1
  537. data/lib/rubocop/file_patterns.rb +9 -1
  538. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
  539. data/lib/rubocop/formatter/disabled_config_formatter.rb +38 -13
  540. data/lib/rubocop/formatter/formatter_set.rb +2 -2
  541. data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
  542. data/lib/rubocop/formatter/html_formatter.rb +1 -1
  543. data/lib/rubocop/formatter/junit_formatter.rb +1 -1
  544. data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
  545. data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
  546. data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
  547. data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
  548. data/lib/rubocop/formatter/tap_formatter.rb +5 -2
  549. data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
  550. data/lib/rubocop/formatter.rb +22 -21
  551. data/lib/rubocop/lsp/diagnostic.rb +22 -37
  552. data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
  553. data/lib/rubocop/lsp/routes.rb +47 -11
  554. data/lib/rubocop/lsp/runtime.rb +19 -8
  555. data/lib/rubocop/lsp/server.rb +0 -2
  556. data/lib/rubocop/lsp/stdin_runner.rb +11 -18
  557. data/lib/rubocop/magic_comment.rb +28 -0
  558. data/lib/rubocop/mcp/server.rb +200 -0
  559. data/lib/rubocop/options.rb +60 -14
  560. data/lib/rubocop/path_util.rb +18 -2
  561. data/lib/rubocop/pending_cops_reporter.rb +56 -0
  562. data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
  563. data/lib/rubocop/plugin/load_error.rb +26 -0
  564. data/lib/rubocop/plugin/loader.rb +100 -0
  565. data/lib/rubocop/plugin/not_supported_error.rb +29 -0
  566. data/lib/rubocop/plugin.rb +46 -0
  567. data/lib/rubocop/project_index_loader.rb +66 -0
  568. data/lib/rubocop/rake_task.rb +5 -2
  569. data/lib/rubocop/remote_config.rb +10 -8
  570. data/lib/rubocop/result_cache.rb +72 -47
  571. data/lib/rubocop/rspec/cop_helper.rb +21 -1
  572. data/lib/rubocop/rspec/expect_offense.rb +9 -3
  573. data/lib/rubocop/rspec/shared_contexts.rb +71 -3
  574. data/lib/rubocop/rspec/support.rb +4 -0
  575. data/lib/rubocop/runner.rb +188 -65
  576. data/lib/rubocop/server/cache.rb +56 -41
  577. data/lib/rubocop/server/cli.rb +2 -2
  578. data/lib/rubocop/server/client_command/base.rb +10 -0
  579. data/lib/rubocop/server/client_command/exec.rb +2 -1
  580. data/lib/rubocop/server/client_command/start.rb +11 -1
  581. data/lib/rubocop/server/core.rb +8 -0
  582. data/lib/rubocop/target_finder.rb +21 -10
  583. data/lib/rubocop/target_ruby.rb +31 -14
  584. data/lib/rubocop/version.rb +50 -10
  585. data/lib/rubocop.rb +47 -96
  586. data/lib/ruby_lsp/rubocop/addon.rb +29 -17
  587. data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
  588. metadata +86 -16
  589. data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
  590. data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
@@ -9,16 +9,16 @@ module RuboCop
9
9
 
10
10
  # @api private
11
11
  COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
12
- Enabled].freeze
12
+ Enabled Reference References Safe SafeAutoCorrect].freeze
13
13
  # @api private
14
14
  INTERNAL_PARAMS = %w[Description StyleGuide
15
15
  VersionAdded VersionChanged VersionRemoved
16
- Reference Safe SafeAutoCorrect].freeze
16
+ Reference References Safe SafeAutoCorrect].freeze
17
17
  # @api private
18
18
  NEW_COPS_VALUES = %w[pending disable enable].freeze
19
19
 
20
20
  # @api private
21
- CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
21
+ CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
22
22
  CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
23
23
  CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
24
24
  private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
@@ -118,6 +118,7 @@ module RuboCop
118
118
  invalid_cop_names.each do |name|
119
119
  # There could be a custom cop with this name. If so, don't warn
120
120
  next if Cop::Registry.global.contains_cop_matching?([name])
121
+ next if ConfigObsoletion.deprecated_cop_name?(name)
121
122
 
122
123
  # Special case for inherit_mode, which is a directive that we keep in
123
124
  # the configuration (even though it's not a cop), because it's easier
@@ -259,8 +260,7 @@ module RuboCop
259
260
  end
260
261
  end
261
262
 
262
- # rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
263
- def check_cop_config_value(hash, parent = nil)
263
+ def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
264
264
  hash.each do |key, value|
265
265
  check_cop_config_value(value, key) if value.is_a?(Hash)
266
266
 
@@ -270,6 +270,8 @@ module RuboCop
270
270
  supposed_values = 'a boolean'
271
271
  elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
272
272
  supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
273
+ elsif key == 'References'
274
+ supposed_values = 'an array of strings'
273
275
  else
274
276
  next
275
277
  end
@@ -277,7 +279,6 @@ module RuboCop
277
279
  raise ValidationError, param_error_message(parent, key, value, supposed_values)
278
280
  end
279
281
  end
280
- # rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
281
282
 
282
283
  # FIXME: Handling colors in exception messages like this is ugly.
283
284
  def param_error_message(parent, key, value, supposed_values)
@@ -35,8 +35,8 @@ module RuboCop
35
35
  # `false` is the same as `disabled` for backward compatibility.
36
36
  return false if ['disabled', false].include?(cop_config['AutoCorrect'])
37
37
 
38
- # When LSP is enabled, it is considered as editing source code,
39
- # and autocorrection with `AutoCorrect: contextual` will not be performed.
38
+ # When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
39
+ # source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
40
40
  return false if contextual_autocorrect? && LSP.enabled?
41
41
 
42
42
  # :safe_autocorrect is a derived option based on several command-line
@@ -50,7 +50,8 @@ module RuboCop
50
50
 
51
51
  def disable_offense(offense_range)
52
52
  unbreakable_range = multiline_ranges(offense_range)&.find do |range|
53
- range_overlaps_offense?(offense_range, range)
53
+ offense_range.overlaps?(range) &&
54
+ eol_comment_would_be_inside_literal?(offense_range, range)
54
55
  end
55
56
 
56
57
  if unbreakable_range
@@ -75,22 +76,28 @@ module RuboCop
75
76
  end
76
77
 
77
78
  def disable_offense_with_eol_or_surround_comment(range)
78
- eol_comment = " # rubocop:todo #{cop_name}"
79
- needed_line_length = (range.source_line + eol_comment).length
80
-
81
- if needed_line_length <= max_line_length
82
- disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
83
- else
79
+ if line_with_eol_comment_too_long?(range)
84
80
  disable_offense_before_and_after(range_by_lines(range))
81
+ else
82
+ disable_offense_at_end_of_line(range_of_first_line(range))
85
83
  end
86
84
  end
87
85
 
88
- def range_overlaps_offense?(offense_range, range)
89
- offense_range.begin_pos > range.begin_pos && range.overlaps?(offense_range)
86
+ def eol_comment_would_be_inside_literal?(offense_range, literal_range)
87
+ return true if line_with_eol_comment_too_long?(offense_range)
88
+
89
+ offense_line = offense_range.line
90
+ offense_line >= literal_range.first_line && offense_line < literal_range.last_line
91
+ end
92
+
93
+ def line_with_eol_comment_too_long?(range)
94
+ return false unless max_line_length
95
+
96
+ (range.source_line + eol_comment).length > max_line_length
90
97
  end
91
98
 
92
99
  def surrounding_heredoc?(node)
93
- node.type?(:str, :dstr, :xstr) && node.heredoc?
100
+ node.any_str_type? && node.heredoc?
94
101
  end
95
102
 
96
103
  def heredoc_range(node)
@@ -102,7 +109,7 @@ module RuboCop
102
109
  end
103
110
 
104
111
  def string_continuation?(node)
105
- node.type?(:str, :dstr, :xstr) && node.source.match?(/\\\s*$/)
112
+ node.any_str_type? && node.source.match?(/\\\s*$/)
106
113
  end
107
114
 
108
115
  def multiline_string?(node)
@@ -129,13 +136,19 @@ module RuboCop
129
136
  end
130
137
 
131
138
  def max_line_length
139
+ return unless config.cop_enabled?('Layout/LineLength')
140
+
132
141
  config.for_cop('Layout/LineLength')['Max'] || 120
133
142
  end
134
143
 
135
- def disable_offense_at_end_of_line(range, eol_comment)
144
+ def disable_offense_at_end_of_line(range)
136
145
  Corrector.new(range).insert_after(range, eol_comment)
137
146
  end
138
147
 
148
+ def eol_comment
149
+ " # rubocop:todo #{cop_name}"
150
+ end
151
+
139
152
  def disable_offense_before_and_after(range_by_lines)
140
153
  range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
141
154
  leading_whitespace = range_by_lines.source_line[/^\s*/]
@@ -41,6 +41,7 @@ module RuboCop
41
41
  include AutocorrectLogic
42
42
 
43
43
  attr_reader :config, :processed_source
44
+ attr_accessor :project_index
44
45
 
45
46
  # Reports of an investigation.
46
47
  # Immutable
@@ -306,7 +307,9 @@ module RuboCop
306
307
  def ready
307
308
  return self if self.class.support_multiple_source?
308
309
 
309
- self.class.new(@config, @options)
310
+ self.class.new(@config, @options).tap do |fresh|
311
+ fresh.project_index = @project_index
312
+ end
310
313
  end
311
314
 
312
315
  ### Reserved for Cop::Cop
@@ -328,12 +331,11 @@ module RuboCop
328
331
  # @api private
329
332
  def self.callbacks_needed
330
333
  @callbacks_needed ||= public_instance_methods.select do |m|
331
- # OPTIMIZE: Check method existence first to make fewer `start_with?` calls.
332
- # At the time of writing this comment, this excludes 98 of ~104 methods.
333
- # `start_with?` with two string arguments instead of a regex is faster
334
- # in this specific case as well.
335
- !Base.method_defined?(m) && # exclude standard "callbacks" like 'on_begin_investigation'
336
- m.start_with?('on_', 'after_')
334
+ # OPTIMIZE: `start_with?` with two string arguments instead of a regex
335
+ # is faster in this specific case.
336
+ m.start_with?('on_', 'after_') &&
337
+ # exclude standard "callbacks" like 'on_new_investigation' unless refined
338
+ instance_method(m).owner != Base
337
339
  end
338
340
  end
339
341
  # rubocop:enable Layout/ClassStructure
@@ -416,7 +418,10 @@ module RuboCop
416
418
  ### Actually private methods
417
419
 
418
420
  def reset_investigation
419
- @currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
421
+ @currently_disabled_lines = nil
422
+ @current_offenses = nil
423
+ @processed_source = nil
424
+ @current_corrector = nil
420
425
  end
421
426
 
422
427
  # @return [Symbol, Corrector] offense status
@@ -492,8 +497,23 @@ module RuboCop
492
497
  patterns = cop_config[parameter]
493
498
  return default_result unless patterns
494
499
 
495
- patterns = FilePatterns.from(patterns)
496
- patterns.match?(config.path_relative_to_config(file)) || patterns.match?(file)
500
+ file_patterns = FilePatterns.from(patterns)
501
+ relative_file_path = config.path_relative_to_config(file)
502
+ return true if file_patterns.match?(relative_file_path)
503
+
504
+ if parameter == 'Include' && !relative_file_path.start_with?('..')
505
+ matches_absolute_include_pattern?(patterns, file)
506
+ else
507
+ file_patterns.match?(file)
508
+ end
509
+ end
510
+
511
+ def matches_absolute_include_pattern?(patterns, file)
512
+ absolute_file_path = absolute?(file) ? file : File.expand_path(file)
513
+ patterns.any? do |pattern|
514
+ (absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
515
+ match_path?(pattern, absolute_file_path)
516
+ end
497
517
  end
498
518
 
499
519
  def enabled_line?(line_number)
@@ -524,15 +544,21 @@ module RuboCop
524
544
  end
525
545
 
526
546
  def range_for_original(range)
547
+ buffer = @current_original.buffer
548
+ return range if @current_offset.zero? && range.source_buffer.equal?(buffer)
549
+
527
550
  ::Parser::Source::Range.new(
528
- @current_original.buffer,
551
+ buffer,
529
552
  range.begin_pos + @current_offset,
530
553
  range.end_pos + @current_offset
531
554
  )
532
555
  end
533
556
 
534
557
  def target_satisfies_all_gem_version_requirements?
535
- self.class.gem_requirements.all? do |gem_name, version_req|
558
+ gem_requirements = self.class.gem_requirements
559
+ return true if gem_requirements.empty?
560
+
561
+ gem_requirements.all? do |gem_name, version_req|
536
562
  all_gem_versions_in_target = @config.gem_versions_in_target
537
563
  next false unless all_gem_versions_in_target
538
564
 
@@ -128,8 +128,8 @@ module RuboCop
128
128
  end
129
129
 
130
130
  def ignored_gem?(node)
131
- ignored_gems = Array(cop_config['IgnoredGems'])
132
- ignored_gems.include?(node.first_argument.value)
131
+ allowed_gems = Array(cop_config['AllowedGems'])
132
+ allowed_gems.include?(node.first_argument.value)
133
133
  end
134
134
 
135
135
  def checked_options_present?(node)
@@ -163,7 +163,9 @@ module RuboCop
163
163
  def gem_options(node)
164
164
  return [] unless node.last_argument&.hash_type?
165
165
 
166
- node.last_argument.keys.map(&:value)
166
+ # Only literal keys carry an option name to check; a non-literal key
167
+ # (e.g. a variable or method call) has no `value` and must be skipped.
168
+ node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) }
167
169
  end
168
170
  end
169
171
  end
@@ -7,48 +7,48 @@ module RuboCop
7
7
  # ref, or tag) are either required or forbidden.
8
8
  #
9
9
  # @example EnforcedStyle: required (default)
10
- # # bad
11
- # gem 'rubocop'
10
+ # # bad
11
+ # gem 'rubocop'
12
12
  #
13
- # # good
14
- # gem 'rubocop', '~> 1.12'
13
+ # # good
14
+ # gem 'rubocop', '~> 1.12'
15
15
  #
16
- # # good
17
- # gem 'rubocop', '>= 1.10.0'
16
+ # # good
17
+ # gem 'rubocop', '>= 1.10.0'
18
18
  #
19
- # # good
20
- # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
19
+ # # good
20
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
21
21
  #
22
- # # good
23
- # gem 'rubocop', branch: 'feature-branch'
22
+ # # good
23
+ # gem 'rubocop', branch: 'feature-branch'
24
24
  #
25
- # # good
26
- # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
25
+ # # good
26
+ # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
27
27
  #
28
- # # good
29
- # gem 'rubocop', tag: 'v1.17.0'
28
+ # # good
29
+ # gem 'rubocop', tag: 'v1.17.0'
30
30
  #
31
31
  # @example EnforcedStyle: forbidden
32
- # # good
33
- # gem 'rubocop'
32
+ # # good
33
+ # gem 'rubocop'
34
34
  #
35
- # # bad
36
- # gem 'rubocop', '~> 1.12'
35
+ # # bad
36
+ # gem 'rubocop', '~> 1.12'
37
37
  #
38
- # # bad
39
- # gem 'rubocop', '>= 1.10.0'
38
+ # # bad
39
+ # gem 'rubocop', '>= 1.10.0'
40
40
  #
41
- # # bad
42
- # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
41
+ # # bad
42
+ # gem 'rubocop', '>= 1.5.0', '< 1.10.0'
43
43
  #
44
- # # bad
45
- # gem 'rubocop', branch: 'feature-branch'
44
+ # # bad
45
+ # gem 'rubocop', branch: 'feature-branch'
46
46
  #
47
- # # bad
48
- # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
47
+ # # bad
48
+ # gem 'rubocop', ref: '74b5bfbb2c4b6fd6cdbbc7254bd7084b36e0c85b'
49
49
  #
50
- # # bad
51
- # gem 'rubocop', tag: 'v1.17.0'
50
+ # # bad
51
+ # gem 'rubocop', tag: 'v1.17.0'
52
52
  #
53
53
  class GemVersion < Base
54
54
  include ConfigurableEnforcedStyle
@@ -43,9 +43,8 @@ module RuboCop
43
43
  def on_new_investigation
44
44
  return if processed_source.blank?
45
45
 
46
- gem_declarations(processed_source.ast)
47
- .each_cons(2) do |previous, current|
48
- next unless consecutive_lines(previous, current)
46
+ gem_declarations(processed_source.ast).each_cons(2) do |previous, current|
47
+ next unless consecutive_lines?(previous, current)
49
48
  next unless case_insensitive_out_of_order?(gem_name(current), gem_name(previous))
50
49
 
51
50
  register_offense(previous, current)
@@ -64,14 +64,16 @@ module RuboCop
64
64
  r = '#' unless RESTRICTED_CALLBACKS.include?(method_name) # has Restricted?
65
65
  c = '#' if NO_CHILD_NODES.include?(node_type) # has Children?
66
66
 
67
+ # The `after_` calls are guarded because barely any cop defines an `after_`
68
+ # callback, and the guard is cheaper than the method call it avoids.
67
69
  class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
68
- def on_#{node_type}(node) # def on_send(node)
69
- trigger_responding_cops(:on_#{node_type}, node) # trigger_responding_cops(:on_send, node)
70
- #{r} trigger_restricted_cops(:on_#{node_type}, node) # trigger_restricted_cops(:on_send, node)
71
- #{c} super(node) # super(node)
72
- #{c} trigger_responding_cops(:after_#{node_type}, node) # trigger_responding_cops(:after_send, node)
73
- #{c}#{r} trigger_restricted_cops(:after_#{node_type}, node) # trigger_restricted_cops(:after_send, node)
74
- end # end
70
+ def on_#{node_type}(node) # def on_send(node)
71
+ trigger_responding_cops(:on_#{node_type}, node) # trigger_responding_cops(:on_send, node)
72
+ #{r} trigger_restricted_cops(:on_#{node_type}, node) # trigger_restricted_cops(:on_send, node)
73
+ #{c} super(node) # super(node)
74
+ #{c} trigger_responding_cops(:after_#{node_type}, node) if @callbacks[:after_#{node_type}] # trigger_responding_cops(:after_send, node) if @callbacks[:after_send]
75
+ #{c}#{r} trigger_restricted_cops(:after_#{node_type}, node) unless @restricted_map[:after_#{node_type}].empty? # trigger_restricted_cops(:after_send, node) unless @restricted_map[:after_send].empty?
76
+ end # end
75
77
  RUBY
76
78
  end
77
79
 
@@ -81,13 +83,13 @@ module RuboCop
81
83
 
82
84
  begin_investigation(processed_source, offset: offset, original: original)
83
85
  if processed_source.valid_syntax?
84
- invoke(:on_new_investigation, @cops)
86
+ invoke(:on_new_investigation, @callbacks[:on_new_investigation])
85
87
  invoke_with_argument(:investigate, @forces, processed_source)
86
88
 
87
89
  walk(processed_source.ast) unless @cops.empty?
88
- invoke(:on_investigation_end, @cops)
90
+ invoke(:on_investigation_end, @callbacks[:on_investigation_end])
89
91
  else
90
- invoke(:on_other_file, @cops)
92
+ invoke(:on_other_file, @callbacks[:on_other_file])
91
93
  end
92
94
  reports = @cops.map { |cop| cop.send(:complete_investigation) }
93
95
  InvestigationReport.new(processed_source, reports, @errors)
@@ -157,7 +159,7 @@ module RuboCop
157
159
  end
158
160
 
159
161
  def invoke(callback, cops)
160
- cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback) } }
162
+ cops&.each { |cop| with_cop_error_handling(cop) { cop.send(callback) } }
161
163
  end
162
164
 
163
165
  def invoke_with_argument(callback, cops, arg)
@@ -16,6 +16,9 @@ module RuboCop
16
16
  return unless node
17
17
 
18
18
  @processed_source = processed_source
19
+ # Disable autocorrection for tabs as it requires special handling
20
+ return if using_tabs?
21
+
19
22
  expr = node.respond_to?(:loc) ? node.source_range : node
20
23
  return if block_comment_within?(expr)
21
24
 
@@ -29,10 +32,14 @@ module RuboCop
29
32
  def align_end(corrector, processed_source, node, align_to)
30
33
  @processed_source = processed_source
31
34
  whitespace = whitespace_range(node)
32
- return false unless whitespace.source.strip.empty?
33
-
34
35
  column = alignment_column(align_to)
35
- corrector.replace(whitespace, ' ' * column)
36
+ indentation = indentation_string(column)
37
+
38
+ if whitespace.source.strip.empty?
39
+ corrector.replace(whitespace, indentation)
40
+ else
41
+ corrector.insert_after(whitespace, "\n#{indentation}")
42
+ end
36
43
  end
37
44
 
38
45
  private
@@ -54,7 +61,7 @@ module RuboCop
54
61
  def inside_string_ranges(node)
55
62
  return [] unless node.is_a?(Parser::AST::Node)
56
63
 
57
- node.each_node(:str, :dstr, :xstr).filter_map { |n| inside_string_range(n) }
64
+ node.each_node(:any_str).filter_map { |n| inside_string_range(n) }
58
65
  end
59
66
 
60
67
  def inside_string_range(node)
@@ -73,9 +80,7 @@ module RuboCop
73
80
  # nil.
74
81
  # - The source map of `__FILE__` responds to neither :begin nor :end.
75
82
  def delimited_string_literal?(node)
76
- loc = node.location
77
-
78
- loc.respond_to?(:begin) && loc.begin && loc.respond_to?(:end) && loc.end
83
+ node.loc?(:begin) && node.loc?(:end)
79
84
  end
80
85
 
81
86
  def block_comment_within?(expr)
@@ -119,6 +124,20 @@ module RuboCop
119
124
  align_to.column
120
125
  end
121
126
  end
127
+
128
+ def indentation_string(column)
129
+ if using_tabs?
130
+ "\t" * column
131
+ else
132
+ ' ' * column
133
+ end
134
+ end
135
+
136
+ def using_tabs?
137
+ config = processed_source.config
138
+ indentation_style = config.for_cop('Layout/IndentationStyle')['EnforcedStyle']
139
+ indentation_style == 'tabs'
140
+ end
122
141
  end
123
142
  end
124
143
  end
@@ -16,7 +16,7 @@ module RuboCop
16
16
 
17
17
  def negated_condition(node)
18
18
  condition = node.condition
19
- condition = condition.children.first while condition.begin_type?
19
+ condition = condition.children.last while condition.begin_type?
20
20
  condition
21
21
  end
22
22
  end
@@ -27,7 +27,7 @@ module RuboCop
27
27
  if block_node.arguments?
28
28
  format(CORRECTION_WITH_ARGUMENTS,
29
29
  collection: collection_node.source,
30
- variables: argument_node.children.first.source)
30
+ variables: argument_node.children.map(&:source).join(', '))
31
31
  else
32
32
  format(CORRECTION_WITHOUT_ARGUMENTS, enumerable: collection_node.source)
33
33
  end
@@ -6,7 +6,7 @@ module RuboCop
6
6
  class ForToEachCorrector
7
7
  extend NodePattern::Macros
8
8
 
9
- CORRECTION = '%<collection>s.each do |%<argument>s|'
9
+ CORRECTION = '%<collection>s%<dot>seach do |%<argument>s|'
10
10
 
11
11
  def initialize(for_node)
12
12
  @for_node = for_node
@@ -25,7 +25,12 @@ module RuboCop
25
25
  attr_reader :for_node, :variable_node, :collection_node
26
26
 
27
27
  def correction
28
- format(CORRECTION, collection: collection_source, argument: variable_node.source)
28
+ format(
29
+ CORRECTION,
30
+ collection: collection_source,
31
+ dot: collection_node.csend_type? ? '&.' : '.',
32
+ argument: variable_node.source
33
+ )
29
34
  end
30
35
 
31
36
  def collection_source
@@ -86,7 +86,13 @@ module RuboCop
86
86
  end
87
87
 
88
88
  def lambda_arg_string
89
- arguments.children.map(&:source).join(', ')
89
+ # Block-local (shadow) arguments are separated from regular arguments by a
90
+ # `;`; joining everything with `,` would turn them into extra parameters
91
+ # and change the lambda's arity.
92
+ regular, shadow = arguments.children.partition { |arg| !arg.shadowarg_type? }
93
+ arg_string = regular.map(&:source).join(', ')
94
+ arg_string += "; #{shadow.map(&:source).join(', ')}" unless shadow.empty?
95
+ arg_string
90
96
  end
91
97
 
92
98
  def needs_separating_space?
@@ -59,11 +59,7 @@ module RuboCop
59
59
  end
60
60
 
61
61
  def content_if_comment_present(corrector, node)
62
- range = range_with_surrounding_space(
63
- children(node).last.source_range,
64
- side: :right
65
- ).end.resize(1)
66
- if range.source == '#'
62
+ if processed_source.comment_at_line(children(node).last.last_line)
67
63
  select_content_to_be_inserted_after_last_element(corrector, node)
68
64
  else
69
65
  node.loc.end.source
@@ -18,7 +18,14 @@ module RuboCop
18
18
  current_range = declaration_with_comment(node)
19
19
  previous_range = declaration_with_comment(previous_declaration)
20
20
 
21
- ->(corrector) { corrector.swap(current_range, previous_range) }
21
+ lambda do |corrector|
22
+ if current_range.source.end_with?("\n")
23
+ corrector.swap(current_range, previous_range)
24
+ else
25
+ corrector.insert_before(previous_range, "#{current_range.source}\n")
26
+ corrector.remove(current_range)
27
+ end
28
+ end
22
29
  end
23
30
 
24
31
  private
@@ -10,8 +10,10 @@ module RuboCop
10
10
  COMMA_REGEXP = /(?<=\))\s*,/.freeze
11
11
 
12
12
  def correct(corrector, node)
13
- corrector.remove(node.loc.begin)
14
- corrector.remove(node.loc.end)
13
+ buffer = node.source_range.source_buffer
14
+ corrector.remove(range_with_surrounding_space(range: node.loc.begin, buffer: buffer,
15
+ side: :right, whitespace: true))
16
+ remove_close_paren(corrector, node, buffer)
15
17
  handle_orphaned_comma(corrector, node)
16
18
 
17
19
  return unless ternary_condition?(node) && next_char_is_question_mark?(node)
@@ -21,6 +23,38 @@ module RuboCop
21
23
 
22
24
  private
23
25
 
26
+ # When the line above `)` ends with a comment and a chained call follows `)`,
27
+ # crossing the newline would pull the chain into the comment. Preserve the newline.
28
+ def remove_close_paren(corrector, node, buffer)
29
+ newlines = !comment_above_close_paren_swallows_chain?(node, buffer)
30
+ corrector.remove(range_with_surrounding_space(range: node.loc.end, buffer: buffer,
31
+ side: :left, newlines: newlines))
32
+ end
33
+
34
+ def comment_above_close_paren_swallows_chain?(node, buffer)
35
+ last_child = node.children.last
36
+ return false unless last_child
37
+
38
+ body_end = last_child.source_range.end_pos
39
+ close_paren_begin = node.loc.end.begin_pos
40
+ return false if body_end >= close_paren_begin
41
+
42
+ source_between = buffer.source[body_end...close_paren_begin]
43
+ return false unless source_between.match?(/#[^\n]*\n/)
44
+
45
+ chained_after_close_paren?(node)
46
+ end
47
+
48
+ def chained_after_close_paren?(node)
49
+ close_paren = node.loc.end
50
+ line_text = close_paren.source_line
51
+ after_paren = line_text[(close_paren.column + 1)..]
52
+ return false if after_paren.nil?
53
+
54
+ trimmed = after_paren.lstrip
55
+ !trimmed.empty? && !trimmed.start_with?('#')
56
+ end
57
+
24
58
  def ternary_condition?(node)
25
59
  node.parent&.if_type? && node.parent.ternary?
26
60
  end
@@ -97,8 +97,8 @@ module RuboCop
97
97
  if delimiters.first != delimiters.last
98
98
  # With different delimiters (eg. `[]`, `()`), if there are the same
99
99
  # number of each, escaping is not necessary
100
- delimiter_counts = delimiters.each_with_object({}) do |delimiter, counts|
101
- counts[delimiter] = content.count(delimiter)
100
+ delimiter_counts = delimiters.to_h do |delimiter|
101
+ [delimiter, content.count(delimiter)]
102
102
  end
103
103
 
104
104
  return content if delimiter_counts[delimiters.first] == delimiter_counts[delimiters.last]
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop # rubocop:disable Style/Documentation
5
+ # Autoloads corrector classes used by cops. Classes are autoloaded to reduce the number of
6
+ # required classes because they're referenced only when autocorrection is performed.
7
+
8
+ # rubocop:disable Layout/LineLength
9
+ autoload :AlignmentCorrector, 'rubocop/cop/correctors/alignment_corrector'
10
+ autoload :ConditionCorrector, 'rubocop/cop/correctors/condition_corrector'
11
+ autoload :EachToForCorrector, 'rubocop/cop/correctors/each_to_for_corrector'
12
+ autoload :EmptyLineCorrector, 'rubocop/cop/correctors/empty_line_corrector'
13
+ autoload :ForToEachCorrector, 'rubocop/cop/correctors/for_to_each_corrector'
14
+ autoload :IfThenCorrector, 'rubocop/cop/correctors/if_then_corrector'
15
+ autoload :LambdaLiteralToMethodCorrector, 'rubocop/cop/correctors/lambda_literal_to_method_corrector'
16
+ autoload :LineBreakCorrector, 'rubocop/cop/correctors/line_break_corrector'
17
+ autoload :MultilineLiteralBraceCorrector, 'rubocop/cop/correctors/multiline_literal_brace_corrector'
18
+ autoload :OrderedGemCorrector, 'rubocop/cop/correctors/ordered_gem_corrector'
19
+ autoload :ParenthesesCorrector, 'rubocop/cop/correctors/parentheses_corrector'
20
+ autoload :PercentLiteralCorrector, 'rubocop/cop/correctors/percent_literal_corrector'
21
+ autoload :PunctuationCorrector, 'rubocop/cop/correctors/punctuation_corrector'
22
+ autoload :RequireLibraryCorrector, 'rubocop/cop/correctors/require_library_corrector'
23
+ autoload :SpaceCorrector, 'rubocop/cop/correctors/space_corrector'
24
+ autoload :StringLiteralCorrector, 'rubocop/cop/correctors/string_literal_corrector'
25
+ autoload :UnusedArgCorrector, 'rubocop/cop/correctors/unused_arg_corrector'
26
+ # rubocop:enable Layout/LineLength
27
+ end
28
+ end