rubocop 1.81.7 → 1.92.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/README.md +2 -2
  4. data/config/default.yml +626 -111
  5. data/config/obsoletion.yml +39 -1
  6. data/exe/rubocop +1 -1
  7. data/lib/rubocop/cache_config.rb +29 -0
  8. data/lib/rubocop/cached_data.rb +50 -5
  9. data/lib/rubocop/changed_files.rb +134 -0
  10. data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
  11. data/lib/rubocop/cli/command/cop_names.rb +57 -0
  12. data/lib/rubocop/cli/command/execute_runner.rb +54 -3
  13. data/lib/rubocop/cli/command/explain.rb +34 -0
  14. data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
  15. data/lib/rubocop/cli/command/lsp.rb +1 -1
  16. data/lib/rubocop/cli/command/mcp.rb +19 -0
  17. data/lib/rubocop/cli/command/show_cops.rb +8 -2
  18. data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
  19. data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
  20. data/lib/rubocop/cli.rb +41 -14
  21. data/lib/rubocop/comment_config/directive_range.rb +34 -0
  22. data/lib/rubocop/comment_config/disable_next.rb +143 -0
  23. data/lib/rubocop/comment_config/push_pop.rb +55 -0
  24. data/lib/rubocop/comment_config.rb +97 -44
  25. data/lib/rubocop/config.rb +100 -15
  26. data/lib/rubocop/config_finder.rb +1 -1
  27. data/lib/rubocop/config_loader.rb +49 -27
  28. data/lib/rubocop/config_loader_resolver.rb +95 -20
  29. data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
  30. data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
  31. data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
  32. data/lib/rubocop/config_obsoletion.rb +1 -1
  33. data/lib/rubocop/config_store.rb +2 -2
  34. data/lib/rubocop/config_validator.rb +69 -7
  35. data/lib/rubocop/cop/autocorrect_logic.rb +24 -6
  36. data/lib/rubocop/cop/badge.rb +10 -2
  37. data/lib/rubocop/cop/base.rb +128 -35
  38. data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
  39. data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
  40. data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -10
  41. data/lib/rubocop/cop/bundler.rb +19 -0
  42. data/lib/rubocop/cop/commissioner.rb +13 -11
  43. data/lib/rubocop/cop/cop_documentation.rb +81 -0
  44. data/lib/rubocop/cop/cop_explanation.rb +140 -0
  45. data/lib/rubocop/cop/corrector.rb +4 -4
  46. data/lib/rubocop/cop/correctors/alignment_corrector.rb +87 -9
  47. data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
  48. data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
  49. data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
  50. data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
  51. data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
  52. data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
  53. data/lib/rubocop/cop/correctors/parentheses_corrector.rb +70 -2
  54. data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
  55. data/lib/rubocop/cop/correctors.rb +28 -0
  56. data/lib/rubocop/cop/documentation.rb +3 -4
  57. data/lib/rubocop/cop/exclude_limit.rb +31 -5
  58. data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
  59. data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
  60. data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +14 -4
  61. data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -8
  62. data/lib/rubocop/cop/gemspec/require_mfa.rb +9 -6
  63. data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
  64. data/lib/rubocop/cop/gemspec.rb +22 -0
  65. data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
  66. data/lib/rubocop/cop/generator.rb +5 -1
  67. data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
  68. data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
  69. data/lib/rubocop/cop/internal_affairs/location_exists.rb +28 -2
  70. data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
  71. data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +12 -16
  72. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
  73. data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
  74. data/lib/rubocop/cop/internal_affairs/node_type_group.rb +0 -7
  75. data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
  76. data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
  77. data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
  78. data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
  79. data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
  80. data/lib/rubocop/cop/internal_affairs.rb +1 -0
  81. data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
  82. data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
  83. data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
  84. data/lib/rubocop/cop/layout/block_alignment.rb +84 -4
  85. data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
  86. data/lib/rubocop/cop/layout/class_structure.rb +156 -41
  87. data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
  88. data/lib/rubocop/cop/layout/condition_position.rb +13 -3
  89. data/lib/rubocop/cop/layout/def_end_alignment.rb +4 -0
  90. data/lib/rubocop/cop/layout/dot_position.rb +26 -16
  91. data/lib/rubocop/cop/layout/else_alignment.rb +2 -14
  92. data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
  93. data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +25 -7
  94. data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
  95. data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
  96. data/lib/rubocop/cop/layout/empty_line_between_defs.rb +15 -2
  97. data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
  98. data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
  99. data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
  100. data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +21 -5
  101. data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
  102. data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
  103. data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
  104. data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
  105. data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
  106. data/lib/rubocop/cop/layout/first_argument_indentation.rb +81 -2
  107. data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
  108. data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
  109. data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
  110. data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
  111. data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
  112. data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
  113. data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
  114. data/lib/rubocop/cop/layout/hash_alignment.rb +16 -11
  115. data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -4
  116. data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
  117. data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
  118. data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
  119. data/lib/rubocop/cop/layout/indentation_width.rb +158 -12
  120. data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
  121. data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
  122. data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
  123. data/lib/rubocop/cop/layout/line_length.rb +265 -29
  124. data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
  125. data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
  126. data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -1
  127. data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
  128. data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
  129. data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +268 -38
  130. data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
  131. data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
  132. data/lib/rubocop/cop/layout/redundant_line_break.rb +102 -2
  133. data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +19 -5
  134. data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
  135. data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
  136. data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
  137. data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
  138. data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
  139. data/lib/rubocop/cop/layout/space_around_keyword.rb +14 -2
  140. data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
  141. data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
  142. data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
  143. data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
  144. data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +44 -34
  145. data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
  146. data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
  147. data/lib/rubocop/cop/layout.rb +114 -0
  148. data/lib/rubocop/cop/lazy_loader.rb +41 -0
  149. data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
  150. data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
  151. data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
  152. data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
  153. data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
  154. data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
  155. data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
  156. data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
  157. data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
  158. data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
  159. data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
  160. data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
  161. data/lib/rubocop/cop/lint/cop_directive_syntax.rb +165 -15
  162. data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
  163. data/lib/rubocop/cop/lint/debugger.rb +13 -2
  164. data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
  165. data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
  166. data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
  167. data/lib/rubocop/cop/lint/duplicate_methods.rb +405 -28
  168. data/lib/rubocop/cop/lint/else_layout.rb +19 -0
  169. data/lib/rubocop/cop/lint/empty_block.rb +4 -4
  170. data/lib/rubocop/cop/lint/empty_conditional_body.rb +9 -2
  171. data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
  172. data/lib/rubocop/cop/lint/empty_when.rb +8 -1
  173. data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
  174. data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -2
  175. data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
  176. data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
  177. data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
  178. data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
  179. data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
  180. data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
  181. data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
  182. data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
  183. data/lib/rubocop/cop/lint/literal_as_condition.rb +36 -9
  184. data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
  185. data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
  186. data/lib/rubocop/cop/lint/loop.rb +24 -2
  187. data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
  188. data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +46 -18
  189. data/lib/rubocop/cop/lint/missing_super.rb +31 -1
  190. data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
  191. data/lib/rubocop/cop/lint/name_typo.rb +270 -0
  192. data/lib/rubocop/cop/lint/nested_method_definition.rb +1 -1
  193. data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
  194. data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
  195. data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
  196. data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
  197. data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
  198. data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
  199. data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +10 -0
  200. data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
  201. data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
  202. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
  203. data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
  204. data/lib/rubocop/cop/lint/rand_one.rb +1 -1
  205. data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
  206. data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
  207. data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
  208. data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -4
  209. data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +37 -14
  210. data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
  211. data/lib/rubocop/cop/lint/redundant_type_conversion.rb +11 -5
  212. data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -3
  213. data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -0
  214. data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
  215. data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
  216. data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
  217. data/lib/rubocop/cop/lint/require_range_parentheses.rb +2 -1
  218. data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
  219. data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
  220. data/lib/rubocop/cop/lint/safe_navigation_chain.rb +24 -0
  221. data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
  222. data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
  223. data/lib/rubocop/cop/lint/script_permission.rb +5 -1
  224. data/lib/rubocop/cop/lint/self_assignment.rb +33 -2
  225. data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
  226. data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
  227. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
  228. data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
  229. data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
  230. data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
  231. data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +13 -2
  232. data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
  233. data/lib/rubocop/cop/lint/syntax.rb +25 -1
  234. data/lib/rubocop/cop/lint/to_enum_arguments.rb +72 -4
  235. data/lib/rubocop/cop/lint/to_json.rb +20 -17
  236. data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
  237. data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
  238. data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
  239. data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
  240. data/lib/rubocop/cop/lint/unreachable_code.rb +15 -9
  241. data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
  242. data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
  243. data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
  244. data/lib/rubocop/cop/lint/useless_access_modifier.rb +1 -2
  245. data/lib/rubocop/cop/lint/useless_assignment.rb +61 -27
  246. data/lib/rubocop/cop/lint/useless_constant_scoping.rb +40 -4
  247. data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
  248. data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
  249. data/lib/rubocop/cop/lint/useless_numeric_operation.rb +10 -10
  250. data/lib/rubocop/cop/lint/useless_or.rb +15 -2
  251. data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
  252. data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +10 -4
  253. data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
  254. data/lib/rubocop/cop/lint/useless_times.rb +22 -1
  255. data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +94 -14
  256. data/lib/rubocop/cop/lint/void.rb +59 -22
  257. data/lib/rubocop/cop/lint.rb +179 -0
  258. data/lib/rubocop/cop/metrics/block_length.rb +1 -1
  259. data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
  260. data/lib/rubocop/cop/metrics/class_length.rb +4 -2
  261. data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
  262. data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
  263. data/lib/rubocop/cop/metrics/method_length.rb +2 -2
  264. data/lib/rubocop/cop/metrics/module_length.rb +4 -2
  265. data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
  266. data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
  267. data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
  268. data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
  269. data/lib/rubocop/cop/metrics.rb +31 -0
  270. data/lib/rubocop/cop/migration/department_name.rb +11 -5
  271. data/lib/rubocop/cop/migration.rb +13 -0
  272. data/lib/rubocop/cop/mixin/alignment.rb +5 -1
  273. data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
  274. data/lib/rubocop/cop/mixin/allowed_pattern.rb +5 -1
  275. data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
  276. data/lib/rubocop/cop/mixin/check_line_breakable.rb +47 -25
  277. data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +12 -8
  278. data/lib/rubocop/cop/mixin/code_length.rb +10 -2
  279. data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
  280. data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
  281. data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
  282. data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +12 -1
  283. data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
  284. data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
  285. data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
  286. data/lib/rubocop/cop/mixin/forbidden_pattern.rb +5 -1
  287. data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +58 -12
  288. data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +37 -10
  289. data/lib/rubocop/cop/mixin/hash_subset.rb +9 -2
  290. data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
  291. data/lib/rubocop/cop/mixin/hash_transform_method.rb +14 -60
  292. data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
  293. data/lib/rubocop/cop/mixin/line_length_help.rb +28 -3
  294. data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
  295. data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
  296. data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
  297. data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
  298. data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
  299. data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
  300. data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
  301. data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
  302. data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
  303. data/lib/rubocop/cop/mixin/range_help.rb +1 -2
  304. data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
  305. data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
  306. data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
  307. data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -6
  308. data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
  309. data/lib/rubocop/cop/mixin.rb +93 -0
  310. data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
  311. data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
  312. data/lib/rubocop/cop/naming/block_forwarding.rb +4 -1
  313. data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
  314. data/lib/rubocop/cop/naming/file_name.rb +4 -3
  315. data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
  316. data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
  317. data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
  318. data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -5
  319. data/lib/rubocop/cop/naming/method_name.rb +6 -3
  320. data/lib/rubocop/cop/naming/predicate_method.rb +13 -2
  321. data/lib/rubocop/cop/naming/predicate_prefix.rb +30 -17
  322. data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
  323. data/lib/rubocop/cop/naming/variable_number.rb +3 -1
  324. data/lib/rubocop/cop/naming.rb +31 -0
  325. data/lib/rubocop/cop/offense.rb +108 -9
  326. data/lib/rubocop/cop/registry.rb +232 -66
  327. data/lib/rubocop/cop/security/eval.rb +15 -2
  328. data/lib/rubocop/cop/security/io_methods.rb +2 -2
  329. data/lib/rubocop/cop/security/json_load.rb +16 -4
  330. data/lib/rubocop/cop/security/marshal_load.rb +1 -1
  331. data/lib/rubocop/cop/security.rb +19 -0
  332. data/lib/rubocop/cop/severity.rb +12 -0
  333. data/lib/rubocop/cop/style/access_modifier_declarations.rb +55 -8
  334. data/lib/rubocop/cop/style/accessor_grouping.rb +16 -5
  335. data/lib/rubocop/cop/style/alias.rb +33 -8
  336. data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
  337. data/lib/rubocop/cop/style/and_or.rb +8 -3
  338. data/lib/rubocop/cop/style/arguments_forwarding.rb +61 -17
  339. data/lib/rubocop/cop/style/array_first_last.rb +13 -3
  340. data/lib/rubocop/cop/style/array_intersect.rb +28 -5
  341. data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -0
  342. data/lib/rubocop/cop/style/array_join.rb +4 -2
  343. data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
  344. data/lib/rubocop/cop/style/attr.rb +8 -6
  345. data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
  346. data/lib/rubocop/cop/style/begin_block.rb +3 -1
  347. data/lib/rubocop/cop/style/bitwise_predicate.rb +7 -6
  348. data/lib/rubocop/cop/style/block_delimiters.rb +74 -38
  349. data/lib/rubocop/cop/style/case_equality.rb +29 -15
  350. data/lib/rubocop/cop/style/case_like_if.rb +11 -10
  351. data/lib/rubocop/cop/style/character_literal.rb +2 -2
  352. data/lib/rubocop/cop/style/class_and_module_children.rb +151 -35
  353. data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
  354. data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
  355. data/lib/rubocop/cop/style/collection_compact.rb +37 -17
  356. data/lib/rubocop/cop/style/collection_querying.rb +79 -46
  357. data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
  358. data/lib/rubocop/cop/style/combinable_loops.rb +91 -9
  359. data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
  360. data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
  361. data/lib/rubocop/cop/style/conditional_assignment.rb +34 -18
  362. data/lib/rubocop/cop/style/constant_visibility.rb +13 -7
  363. data/lib/rubocop/cop/style/copyright.rb +27 -12
  364. data/lib/rubocop/cop/style/data_inheritance.rb +18 -0
  365. data/lib/rubocop/cop/style/date_time.rb +4 -4
  366. data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -2
  367. data/lib/rubocop/cop/style/dig_chain.rb +5 -0
  368. data/lib/rubocop/cop/style/dir_empty.rb +4 -0
  369. data/lib/rubocop/cop/style/directive_scope.rb +304 -0
  370. data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +184 -20
  371. data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
  372. data/lib/rubocop/cop/style/documentation.rb +53 -6
  373. data/lib/rubocop/cop/style/documentation_method.rb +8 -12
  374. data/lib/rubocop/cop/style/double_negation.rb +11 -0
  375. data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
  376. data/lib/rubocop/cop/style/each_with_object.rb +2 -0
  377. data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
  378. data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
  379. data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
  380. data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
  381. data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
  382. data/lib/rubocop/cop/style/empty_literal.rb +8 -3
  383. data/lib/rubocop/cop/style/empty_method.rb +15 -9
  384. data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +74 -22
  385. data/lib/rubocop/cop/style/encoding.rb +7 -1
  386. data/lib/rubocop/cop/style/end_block.rb +3 -1
  387. data/lib/rubocop/cop/style/endless_method.rb +100 -21
  388. data/lib/rubocop/cop/style/env_home.rb +4 -0
  389. data/lib/rubocop/cop/style/even_odd.rb +11 -1
  390. data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
  391. data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
  392. data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
  393. data/lib/rubocop/cop/style/file_null.rb +6 -4
  394. data/lib/rubocop/cop/style/file_open.rb +84 -0
  395. data/lib/rubocop/cop/style/file_write.rb +21 -16
  396. data/lib/rubocop/cop/style/float_division.rb +28 -14
  397. data/lib/rubocop/cop/style/for.rb +60 -1
  398. data/lib/rubocop/cop/style/format_string.rb +44 -9
  399. data/lib/rubocop/cop/style/format_string_token.rb +50 -7
  400. data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
  401. data/lib/rubocop/cop/style/global_vars.rb +5 -2
  402. data/lib/rubocop/cop/style/guard_clause.rb +57 -40
  403. data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
  404. data/lib/rubocop/cop/style/hash_conversion.rb +39 -11
  405. data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
  406. data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
  407. data/lib/rubocop/cop/style/hash_slice.rb +16 -0
  408. data/lib/rubocop/cop/style/hash_syntax.rb +19 -5
  409. data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
  410. data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
  411. data/lib/rubocop/cop/style/identical_conditional_branches.rb +38 -10
  412. data/lib/rubocop/cop/style/if_inside_else.rb +36 -8
  413. data/lib/rubocop/cop/style/if_unless_modifier.rb +80 -76
  414. data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +17 -14
  415. data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
  416. data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
  417. data/lib/rubocop/cop/style/inline_comment.rb +5 -2
  418. data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
  419. data/lib/rubocop/cop/style/invertible_unless_condition.rb +25 -5
  420. data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
  421. data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
  422. data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
  423. data/lib/rubocop/cop/style/keyword_parameters_order.rb +10 -4
  424. data/lib/rubocop/cop/style/lambda.rb +45 -2
  425. data/lib/rubocop/cop/style/lambda_call.rb +24 -8
  426. data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
  427. data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
  428. data/lib/rubocop/cop/style/map_into_array.rb +2 -3
  429. data/lib/rubocop/cop/style/map_join.rb +123 -0
  430. data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
  431. data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +102 -20
  432. data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
  433. data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +42 -6
  434. data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
  435. data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
  436. data/lib/rubocop/cop/style/min_max_comparison.rb +4 -1
  437. data/lib/rubocop/cop/style/missing_else.rb +7 -1
  438. data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
  439. data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
  440. data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
  441. data/lib/rubocop/cop/style/module_function.rb +4 -2
  442. data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
  443. data/lib/rubocop/cop/style/multiline_if_modifier.rb +45 -5
  444. data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
  445. data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
  446. data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
  447. data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -13
  448. data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
  449. data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
  450. data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
  451. data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
  452. data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
  453. data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
  454. data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
  455. data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
  456. data/lib/rubocop/cop/style/next.rb +24 -10
  457. data/lib/rubocop/cop/style/nil_comparison.rb +50 -12
  458. data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
  459. data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
  460. data/lib/rubocop/cop/style/not.rb +12 -3
  461. data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
  462. data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
  463. data/lib/rubocop/cop/style/numeric_predicate.rb +22 -6
  464. data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
  465. data/lib/rubocop/cop/style/one_line_conditional.rb +18 -6
  466. data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
  467. data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
  468. data/lib/rubocop/cop/style/option_hash.rb +1 -1
  469. data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
  470. data/lib/rubocop/cop/style/parallel_assignment.rb +26 -7
  471. data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
  472. data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
  473. data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
  474. data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
  475. data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
  476. data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
  477. data/lib/rubocop/cop/style/proc.rb +3 -2
  478. data/lib/rubocop/cop/style/raise_args.rb +20 -10
  479. data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -0
  480. data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
  481. data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
  482. data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
  483. data/lib/rubocop/cop/style/redundant_begin.rb +25 -7
  484. data/lib/rubocop/cop/style/redundant_condition.rb +41 -23
  485. data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
  486. data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +13 -1
  487. data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
  488. data/lib/rubocop/cop/style/redundant_each.rb +4 -5
  489. data/lib/rubocop/cop/style/redundant_exception.rb +21 -3
  490. data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -2
  491. data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
  492. data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
  493. data/lib/rubocop/cop/style/redundant_format.rb +43 -7
  494. data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
  495. data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
  496. data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
  497. data/lib/rubocop/cop/style/redundant_line_continuation.rb +82 -115
  498. data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
  499. data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -83
  500. data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
  501. data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -2
  502. data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
  503. data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
  504. data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -4
  505. data/lib/rubocop/cop/style/redundant_return.rb +4 -3
  506. data/lib/rubocop/cop/style/redundant_self.rb +11 -2
  507. data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
  508. data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
  509. data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
  510. data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
  511. data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
  512. data/lib/rubocop/cop/style/regexp_literal.rb +106 -28
  513. data/lib/rubocop/cop/style/require_order.rb +25 -8
  514. data/lib/rubocop/cop/style/rescue_modifier.rb +15 -14
  515. data/lib/rubocop/cop/style/return_nil.rb +17 -2
  516. data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
  517. data/lib/rubocop/cop/style/reverse_find.rb +51 -0
  518. data/lib/rubocop/cop/style/safe_navigation.rb +18 -9
  519. data/lib/rubocop/cop/style/sample.rb +19 -13
  520. data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
  521. data/lib/rubocop/cop/style/select_by_range.rb +197 -0
  522. data/lib/rubocop/cop/style/select_by_regexp.rb +52 -23
  523. data/lib/rubocop/cop/style/self_assignment.rb +13 -16
  524. data/lib/rubocop/cop/style/semicolon.rb +39 -13
  525. data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
  526. data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
  527. data/lib/rubocop/cop/style/single_line_do_end_block.rb +19 -7
  528. data/lib/rubocop/cop/style/single_line_methods.rb +24 -5
  529. data/lib/rubocop/cop/style/sole_nested_conditional.rb +25 -7
  530. data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
  531. data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +31 -5
  532. data/lib/rubocop/cop/style/static_class.rb +21 -0
  533. data/lib/rubocop/cop/style/string_concatenation.rb +25 -6
  534. data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
  535. data/lib/rubocop/cop/style/struct_inheritance.rb +36 -1
  536. data/lib/rubocop/cop/style/super_arguments.rb +6 -4
  537. data/lib/rubocop/cop/style/symbol_proc.rb +32 -14
  538. data/lib/rubocop/cop/style/tally_method.rb +181 -0
  539. data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
  540. data/lib/rubocop/cop/style/time_now.rb +41 -0
  541. data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
  542. data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
  543. data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
  544. data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
  545. data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
  546. data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
  547. data/lib/rubocop/cop/style/while_until_do.rb +7 -0
  548. data/lib/rubocop/cop/style/while_until_modifier.rb +16 -0
  549. data/lib/rubocop/cop/style/word_array.rb +1 -0
  550. data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
  551. data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
  552. data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
  553. data/lib/rubocop/cop/style.rb +311 -0
  554. data/lib/rubocop/cop/team.rb +171 -48
  555. data/lib/rubocop/cop/util.rb +5 -8
  556. data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
  557. data/lib/rubocop/cop/variable_force/branch.rb +30 -6
  558. data/lib/rubocop/cop/variable_force/variable.rb +33 -9
  559. data/lib/rubocop/cops_documentation_generator.rb +27 -9
  560. data/lib/rubocop/directive_comment.rb +116 -7
  561. data/lib/rubocop/feature_loader.rb +0 -6
  562. data/lib/rubocop/file_patterns.rb +9 -1
  563. data/lib/rubocop/formatter/base_formatter.rb +22 -0
  564. data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
  565. data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -10
  566. data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
  567. data/lib/rubocop/formatter/formatter_set.rb +7 -2
  568. data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
  569. data/lib/rubocop/formatter/html_formatter.rb +2 -4
  570. data/lib/rubocop/formatter/json_formatter.rb +82 -7
  571. data/lib/rubocop/formatter/junit_formatter.rb +27 -10
  572. data/lib/rubocop/formatter/offense_count_formatter.rb +4 -3
  573. data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
  574. data/lib/rubocop/formatter/sarif_formatter.rb +186 -0
  575. data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
  576. data/lib/rubocop/formatter/tap_formatter.rb +8 -3
  577. data/lib/rubocop/formatter/worst_offenders_formatter.rb +5 -4
  578. data/lib/rubocop/formatter.rb +23 -21
  579. data/lib/rubocop/lockfile.rb +18 -0
  580. data/lib/rubocop/lsp/diagnostic.rb +22 -42
  581. data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
  582. data/lib/rubocop/lsp/routes.rb +130 -83
  583. data/lib/rubocop/lsp/runtime.rb +64 -15
  584. data/lib/rubocop/lsp/server.rb +6 -2
  585. data/lib/rubocop/lsp/stdin_runner.rb +35 -2
  586. data/lib/rubocop/lsp.rb +5 -2
  587. data/lib/rubocop/magic_comment.rb +47 -0
  588. data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
  589. data/lib/rubocop/mcp/explain_tool.rb +68 -0
  590. data/lib/rubocop/mcp/scope.rb +65 -0
  591. data/lib/rubocop/mcp/server.rb +307 -0
  592. data/lib/rubocop/mcp/source_files.rb +35 -0
  593. data/lib/rubocop/offense_limit.rb +30 -0
  594. data/lib/rubocop/options.rb +141 -13
  595. data/lib/rubocop/path_util.rb +16 -5
  596. data/lib/rubocop/pending_cops_reporter.rb +1 -6
  597. data/lib/rubocop/plugin/configuration_integrator.rb +13 -3
  598. data/lib/rubocop/plugin/loader.rb +2 -2
  599. data/lib/rubocop/project_index_loader.rb +82 -0
  600. data/lib/rubocop/rake_task.rb +2 -3
  601. data/lib/rubocop/remote_config.rb +18 -13
  602. data/lib/rubocop/result_cache.rb +102 -59
  603. data/lib/rubocop/rspec/cop_helper.rb +8 -0
  604. data/lib/rubocop/rspec/expect_offense.rb +2 -4
  605. data/lib/rubocop/rspec/shared_contexts.rb +53 -5
  606. data/lib/rubocop/rspec/support.rb +2 -1
  607. data/lib/rubocop/runner.rb +362 -106
  608. data/lib/rubocop/server/cache.rb +21 -40
  609. data/lib/rubocop/server/cli.rb +2 -4
  610. data/lib/rubocop/server/core.rb +8 -0
  611. data/lib/rubocop/server.rb +14 -0
  612. data/lib/rubocop/target_finder.rb +18 -8
  613. data/lib/rubocop/target_ruby.rb +42 -22
  614. data/lib/rubocop/todo_audit.rb +111 -0
  615. data/lib/rubocop/unified_diff.rb +257 -0
  616. data/lib/rubocop/util.rb +69 -0
  617. data/lib/rubocop/version.rb +23 -7
  618. data/lib/rubocop.rb +34 -701
  619. data/lib/ruby_lsp/rubocop/addon.rb +1 -2
  620. metadata +80 -14
  621. data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
@@ -9,8 +9,11 @@ module RuboCop
9
9
  # For performance reasons, Team will first dispatch cops & forces in two groups,
10
10
  # first the ones needed for autocorrection (if any), then the rest
11
11
  # (unless autocorrections happened).
12
- # rubocop:disable Metrics/ClassLength
12
+ # rubocop:disable-next Metrics/ClassLength
13
13
  class Team
14
+ InvestigationResult = Struct.new(:report, :corrector)
15
+ private_constant :InvestigationResult
16
+
14
17
  # @return [Team]
15
18
  def self.new(cop_or_classes, config, options = {})
16
19
  # Support v0 api:
@@ -26,8 +29,17 @@ module RuboCop
26
29
 
27
30
  # @return [Team] with cops assembled from the given `cop_classes`
28
31
  def self.mobilize(cop_classes, config, options = {})
29
- cops = mobilize_cops(cop_classes, config, options)
30
- new(cops, config, options)
32
+ if cop_classes.is_a?(Registry)
33
+ # Instantiate only the enabled cops so that disabled lazy-loaded cops are not loaded.
34
+ # The registry is kept on standby to mobilize a disabled cop when a comment directive
35
+ # opts it back in.
36
+ cops = cop_classes.enabled(config).map { |cop_class| cop_class.new(config, options) }
37
+ team = new(cops, config, options)
38
+ team.standby_registry = cop_classes
39
+ team
40
+ else
41
+ new(mobilize_cops(cop_classes, config, options), config, options)
42
+ end
31
43
  end
32
44
 
33
45
  # @return [Array<Cop::Base>]
@@ -56,12 +68,30 @@ module RuboCop
56
68
 
57
69
  attr_reader :errors, :warnings, :updated_source_file, :cops
58
70
 
71
+ # When set to true, the corrected source is not written back to the
72
+ # inspected file; it is exposed through `#updated_source` instead.
73
+ # @api private
74
+ attr_accessor :defer_corrections
75
+
76
+ # The corrected source of the last investigation, if corrections were
77
+ # made with `#defer_corrections` enabled.
78
+ # @api private
79
+ attr_reader :updated_source
80
+
81
+ # Registry used to mobilize cops that were not instantiated because they are disabled in
82
+ # the config, when a comment directive opts them back in for a file.
83
+ #
84
+ # @api private
85
+ attr_writer :standby_registry
86
+
59
87
  alias updated_source_file? updated_source_file
60
88
 
61
89
  def initialize(cops, config = nil, options = {})
62
90
  @cops = cops
63
91
  @config = config
64
92
  @options = options
93
+ @standby_registry = nil
94
+ @standby_cops = {}
65
95
  reset
66
96
  @ready = true
67
97
  @registry = Registry.new(cops, options.dup)
@@ -89,31 +119,25 @@ module RuboCop
89
119
 
90
120
  # @return [Commissioner::InvestigationReport]
91
121
  def investigate(processed_source, offset: 0, original: processed_source)
92
- be_ready
93
-
94
- # The autocorrection process may have to be repeated multiple times
95
- # until there are no corrections left to perform
96
- # To speed things up, run autocorrecting cops by themselves, and only
97
- # run the other cops when no corrections are left
98
- on_duty = roundup_relevant_cops(processed_source)
122
+ result = investigate_with_corrector(processed_source, offset: offset, original: original)
123
+ autocorrect(processed_source, result.corrector)
124
+ result.report
125
+ end
99
126
 
100
- autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?)
101
- report = investigate_partial(autocorrect_cops, processed_source,
102
- offset: offset, original: original)
127
+ # @return [Array<Offense>]
128
+ def investigate_fragments(fragments, original:)
129
+ @updated_source_file = false
103
130
 
104
- unless autocorrect(processed_source, report, offset: offset, original: original)
105
- # If we corrected some errors, another round of inspection will be
106
- # done, and any other offenses will be caught then, so only need
107
- # to check other_cops if no correction was done
108
- report = report.merge(investigate_partial(other_cops, processed_source,
109
- offset: offset, original: original))
110
- end
131
+ offenses, errors, warnings, corrector =
132
+ fragments.each_with_object([[], [], [], nil]) do |fragment, data|
133
+ investigate_fragment(fragment, original, data)
134
+ end
111
135
 
112
- process_errors(processed_source.path, report.errors)
136
+ autocorrect(original, corrector)
137
+ @errors = errors
138
+ @warnings = warnings
113
139
 
114
- report
115
- ensure
116
- @ready = false
140
+ offenses
117
141
  end
118
142
 
119
143
  # @deprecated
@@ -136,23 +160,26 @@ module RuboCop
136
160
 
137
161
  private
138
162
 
139
- def autocorrect(processed_source, report, original:, offset:)
163
+ def autocorrect(processed_source, corrector)
140
164
  @updated_source_file = false
165
+ @updated_source = nil
141
166
  return unless autocorrect?
142
- return if report.processed_source.parser_error
167
+ return unless corrector
168
+ return if corrector.empty?
143
169
 
144
- new_source = autocorrect_report(report, original: original, offset: offset)
145
-
146
- return unless new_source
170
+ apply_correction(processed_source, corrector.rewrite)
171
+ @updated_source_file = true
172
+ end
147
173
 
174
+ def apply_correction(processed_source, new_source)
148
175
  if @options[:stdin]
149
176
  # holds source read in from stdin, when --stdin option is used
150
177
  @options[:stdin] = new_source
178
+ elsif defer_corrections
179
+ @updated_source = new_source
151
180
  else
152
- filename = processed_source.file_path
153
- File.write(filename, new_source)
181
+ RuboCop::Util.replace_file_contents(processed_source.file_path, new_source)
154
182
  end
155
- @updated_source_file = true
156
183
  end
157
184
 
158
185
  def be_ready
@@ -160,6 +187,7 @@ module RuboCop
160
187
 
161
188
  reset
162
189
  @cops.map!(&:ready)
190
+ @standby_cops.transform_values! { |cop| cop&.ready }
163
191
  @ready = true
164
192
  end
165
193
 
@@ -174,17 +202,101 @@ module RuboCop
174
202
  commissioner.investigate(processed_source, offset: offset, original: original)
175
203
  end
176
204
 
205
+ def investigate_with_corrector(processed_source, offset:, original:)
206
+ be_ready
207
+
208
+ # The autocorrection process may have to be repeated multiple times
209
+ # until there are no corrections left to perform
210
+ # To speed things up, run autocorrecting cops by themselves, and only
211
+ # run the other cops when no corrections are left
212
+ on_duty = roundup_relevant_cops(processed_source)
213
+
214
+ autocorrect_cops, other_cops = partition_by_correcting(on_duty)
215
+ report = investigate_partial(autocorrect_cops, processed_source,
216
+ offset: offset, original: original)
217
+
218
+ corrector = collated_corrector(report, offset: offset, original: original)
219
+
220
+ unless corrector
221
+ # If we corrected some errors, another round of inspection will be
222
+ # done, and any other offenses will be caught then, so only need
223
+ # to check other_cops if no correction was done
224
+ report = report.merge(investigate_partial(other_cops, processed_source,
225
+ offset: offset, original: original))
226
+ end
227
+
228
+ process_errors(processed_source.path, report.errors)
229
+
230
+ InvestigationResult.new(report, corrector)
231
+ ensure
232
+ @ready = false
233
+ end
234
+
235
+ def investigate_fragment(fragment, original, data)
236
+ offenses, errors, warnings, corrector = data
237
+ result = investigate_with_corrector(
238
+ fragment[:processed_source],
239
+ offset: fragment[:offset],
240
+ original: original
241
+ )
242
+
243
+ offenses.concat(result.report.offenses)
244
+ if result.corrector
245
+ corrector ||= Corrector.new(original)
246
+ merge_corrector!(corrector, result.corrector, offset: 0)
247
+ data[3] = corrector
248
+ end
249
+ errors.concat(@errors)
250
+ warnings.concat(@warnings)
251
+ end
252
+
177
253
  # @return [Array<cop>]
254
+ # A cop whose unsafe correction is skipped still inserts todo comments
255
+ # under `--disable-uncorrectable`, so it must run with the correcting
256
+ # cops - correctors of the later `other_cops` round are never applied.
257
+ def partition_by_correcting(cops)
258
+ cops.partition do |cop|
259
+ cop.autocorrect? || cop.skipped_unsafe_correction_with_disable_uncorrectable?
260
+ end
261
+ end
262
+
178
263
  def roundup_relevant_cops(processed_source)
179
- cops.select do |cop|
180
- next true if processed_source.comment_config.cop_opted_in?(cop)
264
+ (cops + opted_in_standby_cops(processed_source)).select do |cop|
181
265
  next false if cop.excluded_file?(processed_source.file_path)
266
+ next true if processed_source.comment_config.cop_opted_in?(cop)
182
267
  next false unless @registry.enabled?(cop, @config)
183
268
 
184
269
  support_target_ruby_version?(cop) && support_target_rails_version?(cop)
185
270
  end
186
271
  end
187
272
 
273
+ # Cops that were not mobilized because they are disabled in the config,
274
+ # but are opted back in for the given file by an `enable` comment directive.
275
+ # Their classes are loaded on demand.
276
+ #
277
+ # @return [Array<cop>]
278
+ def opted_in_standby_cops(processed_source)
279
+ return [] unless @standby_registry
280
+
281
+ opted_in_names = processed_source.comment_config.opt_in_cops
282
+ return [] if opted_in_names.empty?
283
+
284
+ @mobilized_cop_names ||= Set.new(cops.map(&:cop_name))
285
+ opted_in_names.filter_map do |cop_name|
286
+ next if @mobilized_cop_names.include?(cop_name)
287
+
288
+ standby_cop(cop_name)
289
+ end
290
+ end
291
+
292
+ def standby_cop(cop_name)
293
+ return @standby_cops[cop_name] if @standby_cops.key?(cop_name)
294
+
295
+ cop_class = @standby_registry.find_by_cop_name(cop_name)
296
+
297
+ @standby_cops[cop_name] = cop_class&.new(@config, @options)
298
+ end
299
+
188
300
  def support_target_ruby_version?(cop)
189
301
  return true unless cop.class.respond_to?(:support_target_ruby_version?)
190
302
 
@@ -200,43 +312,55 @@ module RuboCop
200
312
  cop.class.support_target_rails_version?(cop.target_rails_version)
201
313
  end
202
314
 
203
- def autocorrect_report(report, offset:, original:)
315
+ def collated_corrector(report, offset:, original:)
316
+ return unless autocorrect?
317
+ return if report.processed_source.parser_error
318
+
204
319
  corrector = collate_corrections(report, offset: offset, original: original)
205
320
 
206
- corrector.rewrite unless corrector.empty?
321
+ corrector unless corrector.empty?
207
322
  end
208
323
 
209
324
  def collate_corrections(report, offset:, original:)
210
325
  corrector = Corrector.new(original)
211
326
 
212
327
  each_corrector(report) do |to_merge|
213
- suppress_clobbering do
214
- if offset.positive?
215
- corrector.import!(to_merge, offset: offset)
216
- else
217
- corrector.merge!(to_merge)
218
- end
219
- end
328
+ merge_corrector!(corrector, to_merge, offset: offset)
220
329
  end
221
330
 
222
331
  corrector
223
332
  end
224
333
 
334
+ def merge_corrector!(corrector, to_merge, offset:)
335
+ suppress_clobbering do
336
+ if corrector.source_buffer == to_merge.source_buffer
337
+ corrector.merge!(to_merge)
338
+ else
339
+ corrector.import!(to_merge, offset: offset)
340
+ end
341
+ end
342
+ end
343
+
225
344
  def each_corrector(report)
226
- skips = Set.new
345
+ applied = []
227
346
  report.cop_reports.each do |cop_report|
228
- cop = cop_report.cop
347
+ cop_class = cop_report.cop.class
229
348
  corrector = cop_report.corrector
230
349
 
231
350
  next if corrector.nil? || corrector.empty?
232
- next if skips.include?(cop.class)
351
+ next if applied.any? { |other| autocorrect_incompatible?(cop_class, other) }
233
352
 
234
353
  yield corrector
235
354
 
236
- skips.merge(cop.class.autocorrect_incompatible_with)
355
+ applied << cop_class
237
356
  end
238
357
  end
239
358
 
359
+ def autocorrect_incompatible?(cop_class, other)
360
+ cop_class.autocorrect_incompatible_with.include?(other) ||
361
+ other.autocorrect_incompatible_with.include?(cop_class)
362
+ end
363
+
240
364
  def suppress_clobbering
241
365
  yield
242
366
  rescue ::Parser::ClobberingError
@@ -285,6 +409,5 @@ module RuboCop
285
409
  end
286
410
  end
287
411
  end
288
- # rubocop:enable Metrics/ClassLength
289
412
  end
290
413
  end
@@ -3,7 +3,7 @@
3
3
  module RuboCop
4
4
  module Cop
5
5
  # This module contains a collection of useful utility methods.
6
- # rubocop:disable Metrics/ModuleLength
6
+ # rubocop:disable-next Metrics/ModuleLength
7
7
  module Util
8
8
  include PathUtil
9
9
 
@@ -35,7 +35,7 @@ module RuboCop
35
35
  node.loc_is?(:end, ')')
36
36
  end
37
37
 
38
- # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
38
+ # rubocop:disable-next Metrics/AbcSize, Metrics/MethodLength
39
39
  def add_parentheses(node, corrector)
40
40
  if node.args_type?
41
41
  arguments_range = node.source_range
@@ -55,7 +55,6 @@ module RuboCop
55
55
  corrector.insert_after(args_end(node), ')')
56
56
  end
57
57
  end
58
- # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
59
58
 
60
59
  def any_descendant?(node, *types)
61
60
  if block_given?
@@ -64,7 +63,7 @@ module RuboCop
64
63
  end
65
64
  else
66
65
  # Use a block version to avoid allocating enumerators.
67
- node.each_descendant do # rubocop:disable Lint/UnreachableLoop
66
+ node.each_descendant do # rubocop:disable Lint/UnreachableLoop -- the block form avoids allocating an enumerator
68
67
  return true
69
68
  end
70
69
  end
@@ -117,10 +116,9 @@ module RuboCop
117
116
  # with calls chained to the end of it.
118
117
  def first_part_of_call_chain(node)
119
118
  while node
120
- case node.type
121
- when :send
119
+ if node.call_type?
122
120
  node = node.receiver
123
- when :block
121
+ elsif node.any_block_type?
124
122
  node = node.send_node
125
123
  else
126
124
  break
@@ -211,6 +209,5 @@ module RuboCop
211
209
  source == target || (source.is_a?(Array) && source.include?(target))
212
210
  end
213
211
  end
214
- # rubocop:enable Metrics/ModuleLength
215
212
  end
216
213
  end
@@ -48,7 +48,7 @@ module RuboCop
48
48
  end
49
49
 
50
50
  def used?
51
- (!reassigned? && @variable.captured_by_block?) || @referenced
51
+ (!reassigned? && @variable.captured_by_block? && @variable.referenced?) || @referenced
52
52
  end
53
53
 
54
54
  def regexp_named_capture?
@@ -254,8 +254,8 @@ module RuboCop
254
254
  end
255
255
  end
256
256
 
257
- # Mix-in module for logical operator control structures.
258
- module LogicalOperator
257
+ # Mix-in module for operator control structures.
258
+ module Operator
259
259
  def always_run?
260
260
  left_body?
261
261
  end
@@ -263,7 +263,15 @@ module RuboCop
263
263
 
264
264
  # left_body && right_body
265
265
  class And < Base
266
- include LogicalOperator
266
+ include Operator
267
+
268
+ define_predicate :left_body?, child_index: 0
269
+ define_predicate :right_body?, child_index: 1
270
+ end
271
+
272
+ # left_body &&= right_body
273
+ class AndAsgn < Base
274
+ include Operator
267
275
 
268
276
  define_predicate :left_body?, child_index: 0
269
277
  define_predicate :right_body?, child_index: 1
@@ -271,7 +279,23 @@ module RuboCop
271
279
 
272
280
  # left_body || right_body
273
281
  class Or < Base
274
- include LogicalOperator
282
+ include Operator
283
+
284
+ define_predicate :left_body?, child_index: 0
285
+ define_predicate :right_body?, child_index: 1
286
+ end
287
+
288
+ # left_body ||= right_body
289
+ class OrAsgn < Base
290
+ include Operator
291
+
292
+ define_predicate :left_body?, child_index: 0
293
+ define_predicate :right_body?, child_index: 1
294
+ end
295
+
296
+ # e.g. left_body += right_body
297
+ class OpAsgn < Base
298
+ include Operator
275
299
 
276
300
  define_predicate :left_body?, child_index: 0
277
301
  define_predicate :right_body?, child_index: 1
@@ -322,8 +346,8 @@ module RuboCop
322
346
  end
323
347
  end
324
348
 
325
- CLASSES_BY_TYPE = Base.classes.each_with_object({}) do |klass, classes|
326
- classes[klass.type] = klass
349
+ CLASSES_BY_TYPE = Base.classes.to_h do |klass|
350
+ [klass.type, klass]
327
351
  end
328
352
  end
329
353
  end
@@ -47,7 +47,7 @@ module RuboCop
47
47
  !@references.empty?
48
48
  end
49
49
 
50
- # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
50
+ # rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
51
51
  def reference!(node)
52
52
  reference = Reference.new(node, @scope)
53
53
  @references << reference
@@ -63,23 +63,47 @@ module RuboCop
63
63
  # if/unless keyword. A preceding assignment is needed to put the
64
64
  # variable in scope. For this reason we skip to the next assignment
65
65
  # here.
66
- next if in_modifier_conditional?(assignment)
66
+ next if in_modifier_conditional?(assignment, node)
67
67
 
68
68
  break if !assignment.branch || assignment.branch == reference.branch
69
69
 
70
- unless assignment.branch.may_run_incompletely?
70
+ unless assignment.branch.may_run_incompletely? ||
71
+ exception_may_reach?(assignment.branch, node)
71
72
  (consumed_branches ||= Set.new) << assignment.branch
72
73
  end
73
74
  end
74
75
  end
75
- # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
76
76
 
77
- def in_modifier_conditional?(assignment)
78
- parent = assignment.node.parent
79
- parent = parent.parent if parent&.begin_type?
80
- return false if parent.nil?
77
+ def in_modifier_conditional?(assignment, reference_node)
78
+ conditional = modifier_conditional_of(assignment.node)
79
+ return false unless conditional
81
80
 
82
- parent.basic_conditional? && parent.modifier_form?
81
+ # The out-of-scope problem only affects a reference in the modifier body (to the
82
+ # left of the keyword); a reference after the modifier is put in scope by the
83
+ # condition's assignment, so an earlier assignment there is genuinely useless.
84
+ covers?(conditional, reference_node) && !covers?(conditional.condition, reference_node)
85
+ end
86
+
87
+ # A branch nested in the main body of `begin` can be cut short by an exception
88
+ # too. An earlier assignment in it is visible to a reference in the `rescue` or
89
+ # `ensure` clause, or after a `rescue` that handles the exception.
90
+ def exception_may_reach?(branch, reference_node)
91
+ branch.each_ancestor.any? do |ancestor|
92
+ next false unless ancestor.may_run_incompletely?
93
+ next false if covers?(ancestor.child_node, reference_node)
94
+
95
+ ancestor.control_node.rescue_type? || covers?(ancestor.control_node, reference_node)
96
+ end
97
+ end
98
+
99
+ def modifier_conditional_of(node)
100
+ node.each_ancestor(:if, :while, :until).find do |conditional|
101
+ conditional.modifier_form? && covers?(conditional.condition, node)
102
+ end
103
+ end
104
+
105
+ def covers?(container, node)
106
+ container.equal?(node) || container.source_range.contains?(node.source_range)
83
107
  end
84
108
 
85
109
  def capture_with_block!
@@ -6,7 +6,7 @@ require 'yard'
6
6
  # Class for generating documentation of all cops departments
7
7
  # @api private
8
8
  class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
9
- include ::RuboCop::Cop::Documentation
9
+ include RuboCop::Cop::Documentation
10
10
 
11
11
  CopData = Struct.new(
12
12
  :cop, :description, :example_objects, :safety_objects, :see_objects, :config, keyword_init: true
@@ -20,6 +20,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
20
20
  safety: ->(data) { safety_object(data.safety_objects, data.cop) },
21
21
  examples: ->(data) { examples(data.example_objects, data.cop) },
22
22
  configuration: ->(data) { configurations(data.cop.department, data.cop, data.config) },
23
+ preview: ->(data) { preview_defaults(data.cop) },
23
24
  references: ->(data) { references(data.cop, data.see_objects) }
24
25
  }.freeze
25
26
 
@@ -137,7 +138,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
137
138
  "NOTE: Requires Ruby version #{requirement}\n\n"
138
139
  end
139
140
 
140
- # rubocop:disable Metrics/MethodLength
141
+ # rubocop:disable-next Metrics/MethodLength
141
142
  def properties(cop)
142
143
  header = [
143
144
  'Enabled by default', 'Safe', 'Supports autocorrection', 'Version Added',
@@ -160,7 +161,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
160
161
  ]]
161
162
  "#{to_table(header, content)}\n"
162
163
  end
163
- # rubocop:enable Metrics/MethodLength
164
164
 
165
165
  def cop_header(cop)
166
166
  content = +"\n"
@@ -195,7 +195,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
195
195
  def configurations(department, cop, cop_config)
196
196
  header = ['Name', 'Default value', 'Configurable values']
197
197
  configs = cop_config.each_key.reject do |key|
198
- key == 'AllowMultipleStyles' ||
198
+ key == 'AllowMultipleStyles' || key == 'Preview' ||
199
199
  (key != 'SupportedTypes' && key.start_with?('Supported'))
200
200
  end
201
201
  return '' if configs.empty?
@@ -210,6 +210,22 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
210
210
  cop_subsection('Configurable attributes', cop) + to_table(header, content)
211
211
  end
212
212
 
213
+ def preview_defaults(cop)
214
+ cop_config = config.for_cop(cop)
215
+ preview = cop_config['Preview']
216
+ return '' unless preview.is_a?(Hash)
217
+
218
+ header = ['Name', 'Current default', 'Preview default']
219
+ content = preview.map do |name, value|
220
+ [name, format_table_value(cop_config[name]), format_table_value(value)]
221
+ end
222
+
223
+ cop_subsection('Preview defaults', cop) +
224
+ 'These defaults apply under xref:versioning.adoc#preview[Preview] and are ' \
225
+ "expected to become the regular defaults in the next major release.\n\n" +
226
+ to_table(header, content)
227
+ end
228
+
213
229
  def configuration_name(department, name)
214
230
  return name unless name == 'AllowMultilineFinalElement'
215
231
 
@@ -217,7 +233,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
217
233
  "xref:#{filename}#allowmultilinefinalelement[AllowMultilineFinalElement]"
218
234
  end
219
235
 
220
- # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
236
+ # rubocop:disable-next Metrics/CyclomaticComplexity,Metrics/MethodLength
221
237
  def configurable_values(cop_config, name)
222
238
  case name
223
239
  when /^Enforced/
@@ -244,7 +260,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
244
260
  end
245
261
  end
246
262
  end
247
- # rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
248
263
 
249
264
  def to_table(header, content)
250
265
  table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
@@ -303,7 +318,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
303
318
  "\ninclude::../partials/#{filename}[]\n"
304
319
  end
305
320
 
306
- # rubocop:disable Metrics/MethodLength
321
+ # rubocop:disable-next Metrics/MethodLength
307
322
  def print_cops_of_department(department)
308
323
  selected_cops = cops_of_department(department)
309
324
  content = +<<~HEADER
@@ -323,7 +338,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
323
338
  file.write("#{content.strip}\n")
324
339
  end
325
340
  end
326
- # rubocop:enable Metrics/MethodLength
327
341
 
328
342
  def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
329
343
  cop_config = config.for_cop(cop)
@@ -392,7 +406,11 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
392
406
  def cop_status(status)
393
407
  return 'Disabled' unless status
394
408
 
395
- status == 'pending' ? 'Pending' : 'Enabled'
409
+ case status
410
+ when 'pending' then 'Pending'
411
+ when 'preview' then 'Preview'
412
+ else 'Enabled'
413
+ end
396
414
  end
397
415
 
398
416
  # HTML anchor are somewhat limited in what characters they can contain, just