rubocop 1.71.1 → 1.91.0
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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +883 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +7 -2
- data/lib/rubocop/changed_files.rb +112 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/execute_runner.rb +52 -1
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +58 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +92 -48
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +72 -49
- data/lib/rubocop/config_loader_resolver.rb +94 -28
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +8 -0
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +64 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +35 -14
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +93 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +79 -10
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +14 -15
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +59 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +163 -35
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +56 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -13
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +157 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +2 -3
- data/lib/rubocop/cop/layout/line_length.rb +160 -23
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +245 -40
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +89 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +14 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +42 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +137 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -19
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +185 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +149 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +56 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +60 -21
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +27 -9
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +44 -16
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +29 -26
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +62 -6
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +47 -11
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +80 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +52 -9
- data/lib/rubocop/cop/registry.rb +233 -64
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +47 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +49 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +7 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +6 -8
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +135 -21
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +8 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +54 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +122 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +12 -8
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +191 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +25 -17
- data/lib/rubocop/cop/style/for.rb +9 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +32 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +7 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +25 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +71 -46
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +12 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +31 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +34 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -18
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +111 -12
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +9 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +41 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +5 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +22 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +63 -5
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +11 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +164 -82
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +8 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +11 -6
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +31 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +4 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -9
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +2 -3
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +163 -45
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +28 -10
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +3 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +11 -6
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +181 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +23 -8
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +31 -18
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +129 -21
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +14 -12
- data/lib/rubocop/result_cache.rb +90 -52
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +294 -100
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +30 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +116 -19
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -54,7 +54,7 @@ module RuboCop
|
|
|
54
54
|
|
|
55
55
|
ZERO_ARITY_SUPER_TYPE = :zsuper
|
|
56
56
|
|
|
57
|
-
TWISTED_SCOPE_TYPES = %i[block numblock class sclass defs module].freeze
|
|
57
|
+
TWISTED_SCOPE_TYPES = %i[block numblock itblock class sclass defs module].freeze
|
|
58
58
|
SCOPE_TYPES = (TWISTED_SCOPE_TYPES + [:def]).freeze
|
|
59
59
|
|
|
60
60
|
SEND_TYPE = :send
|
|
@@ -71,6 +71,8 @@ module RuboCop
|
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
|
|
74
|
+
BRANCH_NODES = %i[if case case_match rescue].freeze
|
|
75
|
+
|
|
74
76
|
def variable_table
|
|
75
77
|
@variable_table ||= VariableTable.new(self)
|
|
76
78
|
end
|
|
@@ -236,11 +238,16 @@ module RuboCop
|
|
|
236
238
|
end
|
|
237
239
|
|
|
238
240
|
def process_loop(node)
|
|
239
|
-
if
|
|
241
|
+
if node.post_condition_loop?
|
|
240
242
|
# See the comment at the end of file for this behavior.
|
|
241
243
|
condition_node, body_node = *node
|
|
242
244
|
process_node(body_node)
|
|
243
245
|
process_node(condition_node)
|
|
246
|
+
elsif node.for_type?
|
|
247
|
+
# In `for item in items` the rightmost expression is evaluated first.
|
|
248
|
+
process_node(node.collection)
|
|
249
|
+
process_node(node.variable)
|
|
250
|
+
process_node(node.body) if node.body
|
|
244
251
|
else
|
|
245
252
|
process_children(node)
|
|
246
253
|
end
|
|
@@ -296,7 +303,7 @@ module RuboCop
|
|
|
296
303
|
variable_table.accessible_variables.each { |variable| variable.reference!(node) }
|
|
297
304
|
end
|
|
298
305
|
|
|
299
|
-
# Mark
|
|
306
|
+
# Mark last assignments which are referenced in the same loop
|
|
300
307
|
# as referenced by ignoring AST order since they would be referenced
|
|
301
308
|
# in next iteration.
|
|
302
309
|
def mark_assignments_as_referenced_in_loop(node)
|
|
@@ -308,13 +315,12 @@ module RuboCop
|
|
|
308
315
|
# would be skipped here.
|
|
309
316
|
next unless variable
|
|
310
317
|
|
|
311
|
-
variable.assignments.
|
|
312
|
-
|
|
313
|
-
assignment_node.equal?(assignment.node)
|
|
314
|
-
end
|
|
315
|
-
|
|
316
|
-
assignment.reference!(node)
|
|
318
|
+
loop_assignments = variable.assignments.select do |assignment|
|
|
319
|
+
assignment_nodes_in_loop.include?(assignment.node)
|
|
317
320
|
end
|
|
321
|
+
next unless loop_assignments.any?
|
|
322
|
+
|
|
323
|
+
reference_assignments(loop_assignments, node)
|
|
318
324
|
end
|
|
319
325
|
end
|
|
320
326
|
|
|
@@ -354,6 +360,17 @@ module RuboCop
|
|
|
354
360
|
end
|
|
355
361
|
end
|
|
356
362
|
|
|
363
|
+
def reference_assignments(loop_assignments, loop_node)
|
|
364
|
+
# If inside a branching statement, mark all as referenced.
|
|
365
|
+
# Otherwise, mark only the last assignment as referenced.
|
|
366
|
+
# Note that `rescue` must be considered as branching because of
|
|
367
|
+
# the `retry` keyword.
|
|
368
|
+
loop_assignments.each do |assignment|
|
|
369
|
+
assignment.reference!(loop_node) if assignment.node.each_ancestor(*BRANCH_NODES).any?
|
|
370
|
+
end
|
|
371
|
+
loop_assignments.last&.reference!(loop_node)
|
|
372
|
+
end
|
|
373
|
+
|
|
357
374
|
def scanned_node?(node)
|
|
358
375
|
scanned_nodes.include?(node)
|
|
359
376
|
end
|
|
@@ -6,7 +6,8 @@ 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
|
|
9
|
+
include RuboCop::Cop::Documentation
|
|
10
|
+
|
|
10
11
|
CopData = Struct.new(
|
|
11
12
|
:cop, :description, :example_objects, :safety_objects, :see_objects, :config, keyword_init: true
|
|
12
13
|
)
|
|
@@ -19,6 +20,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
19
20
|
safety: ->(data) { safety_object(data.safety_objects, data.cop) },
|
|
20
21
|
examples: ->(data) { examples(data.example_objects, data.cop) },
|
|
21
22
|
configuration: ->(data) { configurations(data.cop.department, data.cop, data.config) },
|
|
23
|
+
preview: ->(data) { preview_defaults(data.cop) },
|
|
22
24
|
references: ->(data) { references(data.cop, data.see_objects) }
|
|
23
25
|
}.freeze
|
|
24
26
|
|
|
@@ -28,6 +30,12 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
28
30
|
#
|
|
29
31
|
# CopsDocumentationGenerator.new(departments: ['Lint']).call
|
|
30
32
|
#
|
|
33
|
+
# For plugin extensions, specify `:plugin_name` keyword as follows:
|
|
34
|
+
#
|
|
35
|
+
# CopsDocumentationGenerator.new(
|
|
36
|
+
# departments: ['Performance'], plugin_name: 'rubocop-performance'
|
|
37
|
+
# ).call
|
|
38
|
+
#
|
|
31
39
|
# You can append additional information:
|
|
32
40
|
#
|
|
33
41
|
# callback = ->(data) { required_rails_version(data.cop) }
|
|
@@ -36,11 +44,16 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
36
44
|
# This will insert the string returned from the lambda _after_ the section from RuboCop itself.
|
|
37
45
|
# See `CopsDocumentationGenerator::STRUCTURE` for available sections.
|
|
38
46
|
#
|
|
39
|
-
def initialize(departments: [], extra_info: {}, base_dir: Dir.pwd)
|
|
47
|
+
def initialize(departments: [], extra_info: {}, base_dir: Dir.pwd, plugin_name: nil)
|
|
40
48
|
@departments = departments.map(&:to_sym).sort!
|
|
41
49
|
@extra_info = extra_info
|
|
42
50
|
@cops = RuboCop::Cop::Registry.global
|
|
43
51
|
@config = RuboCop::ConfigLoader.default_configuration
|
|
52
|
+
# NOTE: For example, this prevents excessive plugin loading before another task executes,
|
|
53
|
+
# in cases where plugins are already loaded by `internal_investigation`.
|
|
54
|
+
if plugin_name && @config.loaded_plugins.none? { |plugin| plugin.about.name == plugin_name }
|
|
55
|
+
RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, [plugin_name])
|
|
56
|
+
end
|
|
44
57
|
@base_dir = base_dir
|
|
45
58
|
@docs_path = "#{base_dir}/docs/modules/ROOT"
|
|
46
59
|
FileUtils.mkdir_p("#{@docs_path}/pages")
|
|
@@ -125,7 +138,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
125
138
|
"NOTE: Requires Ruby version #{requirement}\n\n"
|
|
126
139
|
end
|
|
127
140
|
|
|
128
|
-
# rubocop:disable Metrics/MethodLength
|
|
141
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
129
142
|
def properties(cop)
|
|
130
143
|
header = [
|
|
131
144
|
'Enabled by default', 'Safe', 'Supports autocorrection', 'Version Added',
|
|
@@ -148,7 +161,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
148
161
|
]]
|
|
149
162
|
"#{to_table(header, content)}\n"
|
|
150
163
|
end
|
|
151
|
-
# rubocop:enable Metrics/MethodLength
|
|
152
164
|
|
|
153
165
|
def cop_header(cop)
|
|
154
166
|
content = +"\n"
|
|
@@ -182,10 +194,10 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
182
194
|
|
|
183
195
|
def configurations(department, cop, cop_config)
|
|
184
196
|
header = ['Name', 'Default value', 'Configurable values']
|
|
185
|
-
configs = cop_config
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
197
|
+
configs = cop_config.each_key.reject do |key|
|
|
198
|
+
key == 'AllowMultipleStyles' || key == 'Preview' ||
|
|
199
|
+
(key != 'SupportedTypes' && key.start_with?('Supported'))
|
|
200
|
+
end
|
|
189
201
|
return '' if configs.empty?
|
|
190
202
|
|
|
191
203
|
content = configs.map do |name|
|
|
@@ -198,6 +210,22 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
198
210
|
cop_subsection('Configurable attributes', cop) + to_table(header, content)
|
|
199
211
|
end
|
|
200
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
|
+
|
|
201
229
|
def configuration_name(department, name)
|
|
202
230
|
return name unless name == 'AllowMultilineFinalElement'
|
|
203
231
|
|
|
@@ -205,7 +233,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
205
233
|
"xref:#{filename}#allowmultilinefinalelement[AllowMultilineFinalElement]"
|
|
206
234
|
end
|
|
207
235
|
|
|
208
|
-
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
236
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
209
237
|
def configurable_values(cop_config, name)
|
|
210
238
|
case name
|
|
211
239
|
when /^Enforced/
|
|
@@ -232,7 +260,6 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
232
260
|
end
|
|
233
261
|
end
|
|
234
262
|
end
|
|
235
|
-
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/MethodLength
|
|
236
263
|
|
|
237
264
|
def to_table(header, content)
|
|
238
265
|
table = ['|===', "| #{header.join(' | ')}\n\n"].join("\n")
|
|
@@ -291,7 +318,7 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
291
318
|
"\ninclude::../partials/#{filename}[]\n"
|
|
292
319
|
end
|
|
293
320
|
|
|
294
|
-
# rubocop:disable Metrics/MethodLength
|
|
321
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
295
322
|
def print_cops_of_department(department)
|
|
296
323
|
selected_cops = cops_of_department(department)
|
|
297
324
|
content = +<<~HEADER
|
|
@@ -311,13 +338,16 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
311
338
|
file.write("#{content.strip}\n")
|
|
312
339
|
end
|
|
313
340
|
end
|
|
314
|
-
# rubocop:enable Metrics/MethodLength
|
|
315
341
|
|
|
316
342
|
def print_cop_with_doc(cop) # rubocop:todo Metrics/AbcSize, Metrics/MethodLength
|
|
317
343
|
cop_config = config.for_cop(cop)
|
|
318
344
|
non_display_keys = %w[
|
|
319
|
-
|
|
320
|
-
|
|
345
|
+
Enabled
|
|
346
|
+
Description
|
|
347
|
+
StyleGuide
|
|
348
|
+
Reference References
|
|
349
|
+
Safe SafeAutoCorrect AutoCorrect
|
|
350
|
+
VersionAdded VersionChanged
|
|
321
351
|
]
|
|
322
352
|
parameters = cop_config.reject { |k| non_display_keys.include? k }
|
|
323
353
|
description = 'No documentation'
|
|
@@ -376,7 +406,11 @@ class CopsDocumentationGenerator # rubocop:disable Metrics/ClassLength
|
|
|
376
406
|
def cop_status(status)
|
|
377
407
|
return 'Disabled' unless status
|
|
378
408
|
|
|
379
|
-
status
|
|
409
|
+
case status
|
|
410
|
+
when 'pending' then 'Pending'
|
|
411
|
+
when 'preview' then 'Preview'
|
|
412
|
+
else 'Enabled'
|
|
413
|
+
end
|
|
380
414
|
end
|
|
381
415
|
|
|
382
416
|
# HTML anchor are somewhat limited in what characters they can contain, just
|
|
@@ -12,16 +12,45 @@ module RuboCop
|
|
|
12
12
|
# @api private
|
|
13
13
|
LINT_SYNTAX_COP = "#{LINT_DEPARTMENT}/Syntax"
|
|
14
14
|
# @api private
|
|
15
|
-
|
|
15
|
+
STYLE_DISABLE_COPS_DIRECTIVE_COP = 'Style/DisableCopsWithinSourceCodeDirective'
|
|
16
|
+
# @api private
|
|
17
|
+
COP_NAME_PATTERN = '([A-Za-z]\w+/)*(?:[A-Za-z]\w+)'
|
|
18
|
+
# @api private
|
|
19
|
+
COP_NAME_PATTERN_NC = '(?:[A-Za-z]\w+/)*[A-Za-z]\w+'
|
|
20
|
+
# @api private
|
|
21
|
+
COP_NAMES_PATTERN_NC = "(?:#{COP_NAME_PATTERN_NC} , )*#{COP_NAME_PATTERN_NC}"
|
|
16
22
|
# @api private
|
|
17
23
|
COP_NAMES_PATTERN = "(?:#{COP_NAME_PATTERN} , )*#{COP_NAME_PATTERN}"
|
|
18
24
|
# @api private
|
|
19
25
|
COPS_PATTERN = "(all|#{COP_NAMES_PATTERN})"
|
|
20
26
|
# @api private
|
|
27
|
+
PUSH_POP_ARGS_PATTERN = "([+\\-]#{COP_NAME_PATTERN_NC}(?:\\s+[+\\-]#{COP_NAME_PATTERN_NC})*)"
|
|
28
|
+
# @api private
|
|
29
|
+
AVAILABLE_MODES = %w[disable enable todo push pop disable-next todo-next enable-next
|
|
30
|
+
next].freeze
|
|
31
|
+
# @api private
|
|
32
|
+
# Longest first, so a `-next` mode is not matched as its prefix
|
|
33
|
+
# (`-` is a word boundary).
|
|
34
|
+
MODES_PATTERN = AVAILABLE_MODES.sort_by { |mode| -mode.length }.join('|').freeze
|
|
35
|
+
# @api private
|
|
36
|
+
DIRECTIVE_MARKER_PATTERN = '# rubocop : '
|
|
37
|
+
# @api private
|
|
38
|
+
DIRECTIVE_MARKER_REGEXP = Regexp.new(DIRECTIVE_MARKER_PATTERN.gsub(' ', '\s*'))
|
|
39
|
+
# @api private
|
|
40
|
+
DIRECTIVE_HEADER_PATTERN = "#{DIRECTIVE_MARKER_PATTERN}((?:#{MODES_PATTERN}))\\b"
|
|
41
|
+
# @api private
|
|
21
42
|
DIRECTIVE_COMMENT_REGEXP = Regexp.new(
|
|
22
|
-
"#
|
|
43
|
+
"#{DIRECTIVE_HEADER_PATTERN}(?:\\s+#{COPS_PATTERN}|\\s+#{PUSH_POP_ARGS_PATTERN})?"
|
|
23
44
|
.gsub(' ', '\s*')
|
|
24
45
|
)
|
|
46
|
+
# @api private
|
|
47
|
+
SIGNED_OPERATIONS = %w[+ -].freeze
|
|
48
|
+
# @api private
|
|
49
|
+
TRAILING_COMMENT_MARKER = '--'
|
|
50
|
+
# @api private
|
|
51
|
+
MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP = Regexp.new(
|
|
52
|
+
"\\A#{DIRECTIVE_HEADER_PATTERN}\\s*\\z".gsub(' ', '\s*')
|
|
53
|
+
)
|
|
25
54
|
|
|
26
55
|
def self.before_comment(line)
|
|
27
56
|
line.split(DIRECTIVE_COMMENT_REGEXP).first
|
|
@@ -32,9 +61,54 @@ module RuboCop
|
|
|
32
61
|
def initialize(comment, cop_registry = Cop::Registry.global)
|
|
33
62
|
@comment = comment
|
|
34
63
|
@cop_registry = cop_registry
|
|
64
|
+
match_data = comment.text.match(DIRECTIVE_COMMENT_REGEXP)
|
|
65
|
+
@match_data = match_data&.pre_match&.match?(/\A#\s*\z/) ? nil : match_data
|
|
35
66
|
@mode, @cops = match_captures
|
|
36
67
|
end
|
|
37
68
|
|
|
69
|
+
# Checks if the comment starts with `# rubocop:` marker
|
|
70
|
+
def start_with_marker?
|
|
71
|
+
comment.text.start_with?(DIRECTIVE_MARKER_REGEXP)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Checks if the comment is malformed as a `# rubocop:` directive
|
|
75
|
+
def malformed?
|
|
76
|
+
return true if !start_with_marker? || @match_data.nil?
|
|
77
|
+
return true if missing_cop_name? || invalid_signed_args?
|
|
78
|
+
|
|
79
|
+
tail = @match_data.post_match.lstrip
|
|
80
|
+
!(tail.empty? || tail.start_with?(TRAILING_COMMENT_MARKER))
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Checks if the directive comment is missing a cop name
|
|
84
|
+
def missing_cop_name?
|
|
85
|
+
return false if push? || pop?
|
|
86
|
+
|
|
87
|
+
MALFORMED_DIRECTIVE_WITHOUT_COP_NAME_REGEXP.match?(comment.text)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# `push` and `next` arguments must be `+`/`-` prefixed cop names, and
|
|
91
|
+
# `pop` takes no arguments at all.
|
|
92
|
+
def invalid_signed_args?
|
|
93
|
+
return cops ? !cops.empty? : false if pop?
|
|
94
|
+
return false unless push? || next?
|
|
95
|
+
return false unless cops
|
|
96
|
+
|
|
97
|
+
cops.split.any? { |cop_spec| !cop_spec.start_with?('+', '-') }
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# The text of the directive's optional `--` trailing comment, or `nil`
|
|
101
|
+
# when there is none.
|
|
102
|
+
def reason
|
|
103
|
+
return unless @match_data
|
|
104
|
+
|
|
105
|
+
tail = @match_data.post_match.lstrip
|
|
106
|
+
return unless tail.start_with?(TRAILING_COMMENT_MARKER)
|
|
107
|
+
|
|
108
|
+
reason = tail.delete_prefix(TRAILING_COMMENT_MARKER).strip
|
|
109
|
+
reason unless reason.empty?
|
|
110
|
+
end
|
|
111
|
+
|
|
38
112
|
# Checks if this directive relates to single line
|
|
39
113
|
def single_line?
|
|
40
114
|
!comment.text.start_with?(DIRECTIVE_COMMENT_REGEXP)
|
|
@@ -53,20 +127,71 @@ module RuboCop
|
|
|
53
127
|
)
|
|
54
128
|
end
|
|
55
129
|
|
|
130
|
+
# `#range` stops at the cop list, so a `--` reason sits outside it. The reason documents the
|
|
131
|
+
# directive and means nothing once the directive is gone, so removal has to cover both. Any
|
|
132
|
+
# other trailing text is an ordinary comment and is left alone.
|
|
133
|
+
def range_with_reason
|
|
134
|
+
directive_range = range
|
|
135
|
+
trailing = Parser::Source::Range.new(
|
|
136
|
+
comment.source_range.source_buffer, directive_range.end_pos, comment.source_range.end_pos
|
|
137
|
+
)
|
|
138
|
+
return directive_range unless trailing.source.lstrip.start_with?(TRAILING_COMMENT_MARKER)
|
|
139
|
+
|
|
140
|
+
directive_range.with(end_pos: comment.source_range.end_pos)
|
|
141
|
+
end
|
|
142
|
+
|
|
56
143
|
# Returns match captures to directive comment pattern
|
|
57
144
|
def match_captures
|
|
58
|
-
@match_captures ||=
|
|
145
|
+
@match_captures ||= @match_data && begin
|
|
146
|
+
captures = @match_data.captures
|
|
147
|
+
mode = captures[0]
|
|
148
|
+
# COPS_PATTERN is at captures[1], PUSH_POP_ARGS_PATTERN is at captures[4]
|
|
149
|
+
cops = captures[1] || captures[4]
|
|
150
|
+
[mode, cops]
|
|
151
|
+
end
|
|
59
152
|
end
|
|
60
153
|
|
|
61
154
|
# Checks if this directive disables cops
|
|
62
155
|
def disabled?
|
|
63
|
-
%w[disable todo].include?(mode)
|
|
156
|
+
%w[disable todo].include?(mode) || disable_next?
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# Checks if this directive disables cops for the next statement only
|
|
160
|
+
def disable_next?
|
|
161
|
+
%w[disable-next todo-next].include?(mode)
|
|
64
162
|
end
|
|
65
163
|
|
|
66
164
|
# Checks if this directive enables cops
|
|
67
165
|
def enabled?
|
|
68
|
-
mode == 'enable'
|
|
166
|
+
mode == 'enable' || enable_next?
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Checks if this directive enables cops for the next statement only
|
|
170
|
+
def enable_next?
|
|
171
|
+
mode == 'enable-next'
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Checks if this directive is a push
|
|
175
|
+
def push?
|
|
176
|
+
mode == 'push'
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Checks if this directive is a pop
|
|
180
|
+
def pop?
|
|
181
|
+
mode == 'pop'
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Checks if this directive toggles cops for the next statement only
|
|
185
|
+
def next?
|
|
186
|
+
mode == 'next'
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
# Returns the `+`/`-` arguments of a `push` or `next` directive as a hash
|
|
190
|
+
# of operations to cop names
|
|
191
|
+
def signed_args
|
|
192
|
+
@signed_args ||= parse_signed_args
|
|
69
193
|
end
|
|
194
|
+
alias push_args signed_args
|
|
70
195
|
|
|
71
196
|
# Checks if this directive enables all cops
|
|
72
197
|
def enabled_all?
|
|
@@ -110,6 +235,8 @@ module RuboCop
|
|
|
110
235
|
end
|
|
111
236
|
|
|
112
237
|
def directive_count
|
|
238
|
+
return signed_args.values.sum(&:count) if push? || next?
|
|
239
|
+
|
|
113
240
|
raw_cop_names.count
|
|
114
241
|
end
|
|
115
242
|
|
|
@@ -143,5 +270,20 @@ module RuboCop
|
|
|
143
270
|
def exclude_lint_department_cops(cops)
|
|
144
271
|
cops - [LINT_REDUNDANT_DIRECTIVE_COP, LINT_SYNTAX_COP]
|
|
145
272
|
end
|
|
273
|
+
|
|
274
|
+
def parse_signed_args
|
|
275
|
+
return {} unless (push? || next?) && cops
|
|
276
|
+
|
|
277
|
+
args = {}
|
|
278
|
+
cops.split.each do |cop_spec|
|
|
279
|
+
op = cop_spec[0]
|
|
280
|
+
cop_name = cop_spec[1..]
|
|
281
|
+
next unless SIGNED_OPERATIONS.include?(op)
|
|
282
|
+
|
|
283
|
+
args[op] ||= []
|
|
284
|
+
args[op] << cop_name
|
|
285
|
+
end
|
|
286
|
+
args
|
|
287
|
+
end
|
|
146
288
|
end
|
|
147
289
|
end
|
|
@@ -21,11 +21,19 @@ module RuboCop
|
|
|
21
21
|
def initialize(patterns)
|
|
22
22
|
@strings = Set.new
|
|
23
23
|
@patterns = []
|
|
24
|
+
@match_cache = {}
|
|
24
25
|
partition_patterns(patterns)
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
def match?(path)
|
|
28
|
-
|
|
29
|
+
# `FilePatterns.from` memoizes one instance per pattern array (by identity),
|
|
30
|
+
# so this cache is shared across every cop using the same Include/Exclude
|
|
31
|
+
# list. Patterns are immutable within a run, so caching by path is safe.
|
|
32
|
+
cached = @match_cache[path]
|
|
33
|
+
return cached unless cached.nil?
|
|
34
|
+
|
|
35
|
+
@match_cache[path] =
|
|
36
|
+
@strings.include?(path) || @patterns.any? { |pattern| PathUtil.match_path?(pattern, path) }
|
|
29
37
|
end
|
|
30
38
|
|
|
31
39
|
private
|
|
@@ -47,8 +47,11 @@ module RuboCop
|
|
|
47
47
|
def report_highlighted_area(highlighted_area)
|
|
48
48
|
space_area = highlighted_area.source_buffer.slice(0...highlighted_area.begin_pos)
|
|
49
49
|
source_area = highlighted_area.source
|
|
50
|
-
output.puts("#{'
|
|
51
|
-
|
|
50
|
+
output.puts("#{to_whitespace(space_area)}#{'^' * Unicode::DisplayWidth.of(source_area)}")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def to_whitespace(string)
|
|
54
|
+
"#{string.delete("^\t")}#{' ' * Unicode::DisplayWidth.of(string.delete("\t"))}"
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
end
|
|
@@ -4,7 +4,7 @@ module RuboCop
|
|
|
4
4
|
module Formatter
|
|
5
5
|
# This formatter displays a YAML configuration file where all cops that
|
|
6
6
|
# detected any offenses are configured to not detect the offense.
|
|
7
|
-
class DisabledConfigFormatter < BaseFormatter
|
|
7
|
+
class DisabledConfigFormatter < BaseFormatter # rubocop:disable Metrics/ClassLength
|
|
8
8
|
include PathUtil
|
|
9
9
|
|
|
10
10
|
HEADING = <<~COMMENTS
|
|
@@ -17,6 +17,24 @@ module RuboCop
|
|
|
17
17
|
# versions of RuboCop, may require this file to be generated again.
|
|
18
18
|
COMMENTS
|
|
19
19
|
|
|
20
|
+
EXCLUDED_CONFIG_KEYS = %w[
|
|
21
|
+
AutoCorrect
|
|
22
|
+
Description
|
|
23
|
+
Enabled
|
|
24
|
+
Exclude
|
|
25
|
+
Include
|
|
26
|
+
Preview
|
|
27
|
+
Reference
|
|
28
|
+
References
|
|
29
|
+
Safe
|
|
30
|
+
SafeAutoCorrect
|
|
31
|
+
Severity
|
|
32
|
+
StyleGuide
|
|
33
|
+
VersionAdded
|
|
34
|
+
VersionChanged
|
|
35
|
+
VersionRemoved
|
|
36
|
+
].freeze
|
|
37
|
+
|
|
20
38
|
@config_to_allow_offenses = {}
|
|
21
39
|
@detected_styles = {}
|
|
22
40
|
|
|
@@ -74,12 +92,10 @@ module RuboCop
|
|
|
74
92
|
command = 'rubocop --auto-gen-config'
|
|
75
93
|
|
|
76
94
|
command += ' --auto-gen-only-exclude' if @options[:auto_gen_only_exclude]
|
|
77
|
-
|
|
78
|
-
if
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
command += format(' --exclude-limit %<limit>d', limit: Integer(@exclude_limit_option))
|
|
82
|
-
end
|
|
95
|
+
command += ' --disable-pending-cops' if @options[:disable_pending_cops]
|
|
96
|
+
command += ' --enable-pending-cops' if @options[:enable_pending_cops]
|
|
97
|
+
command += preview_option
|
|
98
|
+
command += exclude_limit_option
|
|
83
99
|
command += ' --no-offense-counts' unless show_offense_counts?
|
|
84
100
|
|
|
85
101
|
command += ' --no-auto-gen-timestamp' unless show_timestamp?
|
|
@@ -89,6 +105,24 @@ module RuboCop
|
|
|
89
105
|
command
|
|
90
106
|
end
|
|
91
107
|
|
|
108
|
+
def preview_option
|
|
109
|
+
case @options[:preview]
|
|
110
|
+
when true then ' --preview'
|
|
111
|
+
when false then ' --no-preview'
|
|
112
|
+
else ''
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def exclude_limit_option
|
|
117
|
+
if no_exclude_limit?
|
|
118
|
+
' --no-exclude-limit'
|
|
119
|
+
elsif @exclude_limit_option
|
|
120
|
+
format(' --exclude-limit %<limit>d', limit: Integer(@exclude_limit_option))
|
|
121
|
+
else
|
|
122
|
+
''
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
92
126
|
def timestamp
|
|
93
127
|
show_timestamp? ? "on #{Time.now.utc} " : ''
|
|
94
128
|
end
|
|
@@ -114,6 +148,9 @@ module RuboCop
|
|
|
114
148
|
end
|
|
115
149
|
|
|
116
150
|
def set_max(cfg, cop_name)
|
|
151
|
+
exclude_limits = RuboCop::ExcludeLimit.read_limits(cop_name)
|
|
152
|
+
cfg[:exclude_limit] = exclude_limits unless exclude_limits.empty?
|
|
153
|
+
|
|
117
154
|
return unless cfg[:exclude_limit]
|
|
118
155
|
|
|
119
156
|
cfg.merge!(cfg[:exclude_limit]) if should_set_max?(cop_name)
|
|
@@ -138,7 +175,7 @@ module RuboCop
|
|
|
138
175
|
output_buffer.puts "# Offense count: #{offense_count}" if show_offense_counts?
|
|
139
176
|
|
|
140
177
|
cop_class = Cop::Registry.global.find_by_cop_name(cop_name)
|
|
141
|
-
default_cfg = default_config(cop_name)
|
|
178
|
+
default_cfg = default_config(cop_name) || @config_for_pwd[cop_name]
|
|
142
179
|
|
|
143
180
|
if supports_safe_autocorrect?(cop_class, default_cfg)
|
|
144
181
|
output_buffer.puts '# This cop supports safe autocorrection (--autocorrect).'
|
|
@@ -163,10 +200,7 @@ module RuboCop
|
|
|
163
200
|
end
|
|
164
201
|
|
|
165
202
|
def cop_config_params(default_cfg, cfg)
|
|
166
|
-
default_cfg.keys -
|
|
167
|
-
%w[Description StyleGuide Reference Enabled Exclude Safe
|
|
168
|
-
SafeAutoCorrect VersionAdded VersionChanged VersionRemoved] -
|
|
169
|
-
cfg.keys
|
|
203
|
+
default_cfg.keys - EXCLUDED_CONFIG_KEYS - cfg.keys
|
|
170
204
|
end
|
|
171
205
|
|
|
172
206
|
def output_cop_param_comments(output_buffer, params, default_cfg)
|
|
@@ -178,6 +212,7 @@ module RuboCop
|
|
|
178
212
|
next unless value.is_a?(Array)
|
|
179
213
|
next if value.empty?
|
|
180
214
|
|
|
215
|
+
value = value.map { |v| v.nil? ? '~' : v } # Change nil back to ~ as in the YAML file.
|
|
181
216
|
output_buffer.puts "# #{param}: #{value.uniq.join(', ')}"
|
|
182
217
|
end
|
|
183
218
|
end
|
|
@@ -218,7 +253,7 @@ module RuboCop
|
|
|
218
253
|
|
|
219
254
|
def output_exclude_list(output_buffer, offending_files, cop_name)
|
|
220
255
|
require 'pathname'
|
|
221
|
-
parent = Pathname.new(
|
|
256
|
+
parent = Pathname.new(PathUtil.pwd)
|
|
222
257
|
|
|
223
258
|
output_buffer.puts ' Exclude:'
|
|
224
259
|
excludes(offending_files, cop_name, parent).each do |exclude_path|
|
|
@@ -234,7 +269,7 @@ module RuboCop
|
|
|
234
269
|
config = ConfigStore.new.for(parent)
|
|
235
270
|
cfg = config[cop_name] || {}
|
|
236
271
|
|
|
237
|
-
if
|
|
272
|
+
if exclude_merges?(config, cfg)
|
|
238
273
|
offending_files
|
|
239
274
|
else
|
|
240
275
|
cop_exclude = cfg['Exclude']
|
|
@@ -247,6 +282,14 @@ module RuboCop
|
|
|
247
282
|
end
|
|
248
283
|
end
|
|
249
284
|
|
|
285
|
+
# `Preview` merges `Exclude` with the default configuration, so the excludes
|
|
286
|
+
# already in the configuration do not have to be copied into the todo file.
|
|
287
|
+
def exclude_merges?(config, cop_config)
|
|
288
|
+
merge_mode_for_exclude?(config) ||
|
|
289
|
+
merge_mode_for_exclude?(cop_config) ||
|
|
290
|
+
config.preview?(@options)
|
|
291
|
+
end
|
|
292
|
+
|
|
250
293
|
def merge_mode_for_exclude?(cfg)
|
|
251
294
|
Array(cfg.to_h.dig('inherit_mode', 'merge')).include?('Exclude')
|
|
252
295
|
end
|
|
@@ -23,7 +23,9 @@ module RuboCop
|
|
|
23
23
|
|
|
24
24
|
def message(offense)
|
|
25
25
|
message =
|
|
26
|
-
if offense.
|
|
26
|
+
if offense.disabled?
|
|
27
|
+
"[Suppressed] #{offense.message}"
|
|
28
|
+
elsif offense.corrected_with_todo?
|
|
27
29
|
"[Todo] #{offense.message}"
|
|
28
30
|
elsif offense.corrected?
|
|
29
31
|
"[Corrected] #{offense.message}"
|
|
@@ -23,6 +23,7 @@ module RuboCop
|
|
|
23
23
|
'[pa]cman' => 'PacmanFormatter',
|
|
24
24
|
'[p]rogress' => 'ProgressFormatter',
|
|
25
25
|
'[q]uiet' => 'QuietFormatter',
|
|
26
|
+
'[sa]rif' => 'SARIFFormatter',
|
|
26
27
|
'[s]imple' => 'SimpleTextFormatter',
|
|
27
28
|
'[t]ap' => 'TapFormatter',
|
|
28
29
|
'[w]orst' => 'WorstOffendersFormatter'
|
|
@@ -57,7 +58,7 @@ module RuboCop
|
|
|
57
58
|
if output_path
|
|
58
59
|
dir_path = File.dirname(output_path)
|
|
59
60
|
FileUtils.mkdir_p(dir_path)
|
|
60
|
-
output = File.open(output_path, 'w')
|
|
61
|
+
output = File.open(output_path, 'w') # rubocop:disable Style/FileOpen -- the file is closed by `close_output_files`, not by a block
|
|
61
62
|
else
|
|
62
63
|
output = $stdout
|
|
63
64
|
end
|
|
@@ -86,7 +87,7 @@ module RuboCop
|
|
|
86
87
|
|
|
87
88
|
def builtin_formatter_class(specified_key)
|
|
88
89
|
matching_keys = BUILTIN_FORMATTERS_FOR_KEYS.keys.select do |key|
|
|
89
|
-
|
|
90
|
+
key.start_with?("[#{specified_key}]") || specified_key == key.delete('[]')
|
|
90
91
|
end
|
|
91
92
|
|
|
92
93
|
if matching_keys.empty?
|