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
data/lib/rubocop/runner.rb
CHANGED
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
|
53
53
|
Lint/RedundantCopDisableDirective RedundantCopDisableDirective Lint
|
|
54
54
|
].freeze
|
|
55
55
|
|
|
56
|
-
attr_reader :errors, :warnings
|
|
56
|
+
attr_reader :errors, :warnings, :diffs
|
|
57
57
|
attr_writer :aborting
|
|
58
58
|
|
|
59
59
|
def initialize(options, config_store)
|
|
@@ -62,14 +62,24 @@ module RuboCop
|
|
|
62
62
|
@errors = []
|
|
63
63
|
@warnings = []
|
|
64
64
|
@aborting = false
|
|
65
|
+
@inspected_files = []
|
|
66
|
+
@diffs = []
|
|
67
|
+
@report_queue = {}
|
|
65
68
|
end
|
|
66
69
|
|
|
67
70
|
def run(paths)
|
|
68
|
-
|
|
71
|
+
@inspection_team_by_config = {}.compare_by_identity
|
|
72
|
+
|
|
73
|
+
# Compute the cache source checksum once to avoid potential
|
|
74
|
+
# inconsistencies between workers.
|
|
75
|
+
ResultCache.source_checksum
|
|
76
|
+
|
|
77
|
+
target_files = only_changed(find_target_files(paths))
|
|
78
|
+
build_project_index(target_files)
|
|
79
|
+
|
|
69
80
|
if @options[:list_target_files]
|
|
70
81
|
list_files(target_files)
|
|
71
82
|
else
|
|
72
|
-
warm_cache(target_files) if @options[:parallel]
|
|
73
83
|
inspect_files(target_files)
|
|
74
84
|
end
|
|
75
85
|
rescue Interrupt
|
|
@@ -86,19 +96,14 @@ module RuboCop
|
|
|
86
96
|
|
|
87
97
|
private
|
|
88
98
|
|
|
89
|
-
#
|
|
90
|
-
#
|
|
91
|
-
def
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
puts 'Running parallel inspection' if @options[:debug]
|
|
98
|
-
%i[autocorrect safe_autocorrect].each { |opt| @options[opt] = false }
|
|
99
|
-
Parallel.each(target_files) { |target_file| file_offenses(target_file) }
|
|
100
|
-
ensure
|
|
101
|
-
@options = saved_options
|
|
99
|
+
# The project index is deliberately built from the unfiltered file list:
|
|
100
|
+
# cross-file offenses must not depend on which files happen to have changed.
|
|
101
|
+
def only_changed(target_files)
|
|
102
|
+
return target_files unless @options[:changed]
|
|
103
|
+
|
|
104
|
+
changed = ChangedFiles.new(@options[:changed]).paths
|
|
105
|
+
|
|
106
|
+
target_files.select { |file| changed.include?(file) }.freeze
|
|
102
107
|
end
|
|
103
108
|
|
|
104
109
|
def find_target_files(paths)
|
|
@@ -112,12 +117,53 @@ module RuboCop
|
|
|
112
117
|
target_files.each(&:freeze).freeze
|
|
113
118
|
end
|
|
114
119
|
|
|
115
|
-
def
|
|
116
|
-
|
|
120
|
+
def build_project_index(target_files)
|
|
121
|
+
return unless project_index_enabled?
|
|
122
|
+
|
|
123
|
+
@project_index = ProjectIndexLoader.build_index(project_index_files(target_files))
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# The index always covers the whole project, not just the files being
|
|
127
|
+
# inspected: cross-file offenses must not depend on which files a
|
|
128
|
+
# particular run happens to include, or single-file runs (editors, CI
|
|
129
|
+
# sharding) would see different offenses than full runs. The project is
|
|
130
|
+
# rooted at the directory of the configuration that enabled the index.
|
|
131
|
+
def project_index_files(target_files)
|
|
132
|
+
root = @config_store.for_pwd.base_dir_for_path_parameters
|
|
133
|
+
project_files = begin
|
|
134
|
+
find_target_files([root]) | target_files
|
|
135
|
+
rescue Errno::ENOENT
|
|
136
|
+
target_files
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
(project_files | bundled_gem_files).sort
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def bundled_gem_files
|
|
143
|
+
return [] unless @config_store.for_pwd.for_all_cops['ProjectIndexIncludesGems']
|
|
117
144
|
|
|
145
|
+
ProjectIndexLoader.bundled_gem_source_files
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def project_index_enabled?
|
|
149
|
+
return false unless @config_store.for_pwd.for_all_cops['UseProjectIndex']
|
|
150
|
+
|
|
151
|
+
unless ProjectIndexLoader.available?
|
|
152
|
+
ProjectIndexLoader.warn_unavailable
|
|
153
|
+
return false
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
true
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def inspect_files(files) # rubocop:disable Metrics/AbcSize
|
|
118
160
|
formatter_set.started(files)
|
|
161
|
+
file_iterator(files) do |file|
|
|
162
|
+
offenses = process_file(file)
|
|
163
|
+
succeeded = offenses.none? { |o| considered_failure?(o) && offense_displayed?(o) }
|
|
119
164
|
|
|
120
|
-
|
|
165
|
+
[offenses, succeeded]
|
|
166
|
+
end
|
|
121
167
|
ensure
|
|
122
168
|
# OPTIMIZE: Calling `ResultCache.cleanup` takes time. This optimization
|
|
123
169
|
# mainly targets editors that integrates RuboCop. When RuboCop is run
|
|
@@ -125,23 +171,97 @@ module RuboCop
|
|
|
125
171
|
if files.size > 1 && cached_run?
|
|
126
172
|
ResultCache.cleanup(@config_store, @options[:debug], @options[:cache_root])
|
|
127
173
|
end
|
|
128
|
-
|
|
129
|
-
formatter_set.finished(inspected_files.freeze)
|
|
174
|
+
formatter_set.finished(@inspected_files.freeze)
|
|
130
175
|
formatter_set.close_output_files
|
|
131
176
|
end
|
|
132
177
|
|
|
133
|
-
def
|
|
134
|
-
|
|
135
|
-
offenses = process_file(file)
|
|
136
|
-
yield file
|
|
178
|
+
def file_iterator(files, &block)
|
|
179
|
+
all_passed = true
|
|
137
180
|
|
|
138
|
-
|
|
139
|
-
|
|
181
|
+
on_start = ->(file, _index) { file_started(file) }
|
|
182
|
+
on_finish = lambda do |file, index, (offenses, passed)|
|
|
183
|
+
all_passed &&= passed
|
|
184
|
+
finished_report(file, index, offenses)
|
|
185
|
+
end
|
|
140
186
|
|
|
141
|
-
|
|
142
|
-
|
|
187
|
+
if run_in_parallel?(files)
|
|
188
|
+
parallel_file_iterator(files, on_start, on_finish, &block)
|
|
189
|
+
else
|
|
190
|
+
serial_file_iterator(files, on_start, on_finish, &block)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
process_remaining_report_queue
|
|
194
|
+
|
|
195
|
+
all_passed
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def finished_report(file, index, offenses)
|
|
199
|
+
@report_queue[index] = [file, offenses]
|
|
200
|
+
@next_index_to_report ||= 0
|
|
201
|
+
while @report_queue.key?(@next_index_to_report)
|
|
202
|
+
process_report_queue_entry(@next_index_to_report)
|
|
203
|
+
@next_index_to_report += 1
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def process_report_queue_entry(index)
|
|
208
|
+
file, offenses = @report_queue.delete(index)
|
|
209
|
+
file_finished(file, offenses)
|
|
210
|
+
end
|
|
143
211
|
|
|
144
|
-
|
|
212
|
+
def process_remaining_report_queue
|
|
213
|
+
@report_queue.keys.sort.each do |index|
|
|
214
|
+
process_report_queue_entry(index)
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def run_in_parallel?(files)
|
|
219
|
+
return false unless parallel_supported_by_options?
|
|
220
|
+
|
|
221
|
+
if files.size <= 1
|
|
222
|
+
puts 'Skipping parallel inspection: only a single file needs inspection' if @options[:debug]
|
|
223
|
+
return false
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
return false if project_index_disables_parallel?
|
|
227
|
+
|
|
228
|
+
puts 'Running parallel inspection' if @options[:debug]
|
|
229
|
+
|
|
230
|
+
true
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# `--auto-gen-config` needs the offenses of every file in one place, and
|
|
234
|
+
# `--diff` collects the diffs in this process, where a worker's copy of
|
|
235
|
+
# them would be lost.
|
|
236
|
+
def parallel_supported_by_options?
|
|
237
|
+
@options[:parallel] && !@options[:auto_gen_config] && !@options[:diff]
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def project_index_disables_parallel?
|
|
241
|
+
return false if @project_index.nil? || !Gem.win_platform?
|
|
242
|
+
|
|
243
|
+
if @options[:debug]
|
|
244
|
+
puts 'Skipping parallel inspection: the project index is enabled and parallel ' \
|
|
245
|
+
'inspection is not yet supported on Windows.'
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
true
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def parallel_file_iterator(files, on_start, on_finish, &block)
|
|
252
|
+
Parallel.each(files, start: on_start, finish: on_finish, &block)
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def serial_file_iterator(files, on_start, on_finish, &block)
|
|
256
|
+
files.each_with_index do |file, index|
|
|
257
|
+
on_start.call(file, index)
|
|
258
|
+
result = yield file
|
|
259
|
+
on_finish.call(file, index, result)
|
|
260
|
+
|
|
261
|
+
# Report and count the offending file before stopping so `--fail-fast`
|
|
262
|
+
# still shows its offenses and exits with a failing status.
|
|
263
|
+
_offenses, succeeded = result
|
|
264
|
+
break if @options[:fail_fast] && !succeeded
|
|
145
265
|
end
|
|
146
266
|
end
|
|
147
267
|
|
|
@@ -150,23 +270,21 @@ module RuboCop
|
|
|
150
270
|
end
|
|
151
271
|
|
|
152
272
|
def process_file(file)
|
|
153
|
-
|
|
154
|
-
offenses = file_offenses(file)
|
|
273
|
+
file_offenses(file)
|
|
155
274
|
rescue InfiniteCorrectionLoop => e
|
|
156
275
|
raise e if @options[:raise_cop_error]
|
|
157
276
|
|
|
158
277
|
errors << e
|
|
159
278
|
warn Rainbow(e.message).red
|
|
160
|
-
|
|
161
|
-
ensure
|
|
162
|
-
file_finished(file, offenses || [])
|
|
279
|
+
e.offenses.compact.sort.freeze
|
|
163
280
|
end
|
|
164
281
|
|
|
165
282
|
def file_offenses(file)
|
|
166
283
|
file_offense_cache(file) do
|
|
167
284
|
source, offenses = do_inspection_loop(file)
|
|
168
285
|
offenses = add_redundant_disables(file, offenses.compact.sort, source)
|
|
169
|
-
offenses.
|
|
286
|
+
offenses = offenses.reject(&:disabled?) unless @options[:display_suppressed]
|
|
287
|
+
offenses.sort.freeze
|
|
170
288
|
end
|
|
171
289
|
end
|
|
172
290
|
|
|
@@ -190,7 +308,7 @@ module RuboCop
|
|
|
190
308
|
|
|
191
309
|
if real_run_needed
|
|
192
310
|
offenses = yield
|
|
193
|
-
save_in_cache(cache, offenses)
|
|
311
|
+
save_in_cache(cache, offenses) unless Cop::Registry.global.warnings?(file)
|
|
194
312
|
end
|
|
195
313
|
|
|
196
314
|
offenses
|
|
@@ -223,7 +341,13 @@ module RuboCop
|
|
|
223
341
|
end
|
|
224
342
|
|
|
225
343
|
def check_for_redundant_disables?(source)
|
|
226
|
-
return false if
|
|
344
|
+
return false if except_redundant_cop_disable_directive?
|
|
345
|
+
# Detached `disable-next` directives produce no disabled ranges but must
|
|
346
|
+
# still be reported as redundant.
|
|
347
|
+
if source.disabled_line_ranges.empty? &&
|
|
348
|
+
source.comment_config.detached_next_directives.empty?
|
|
349
|
+
return false
|
|
350
|
+
end
|
|
227
351
|
|
|
228
352
|
!@options[:only]
|
|
229
353
|
end
|
|
@@ -246,6 +370,7 @@ module RuboCop
|
|
|
246
370
|
end
|
|
247
371
|
|
|
248
372
|
def file_finished(file, offenses)
|
|
373
|
+
@inspected_files << file
|
|
249
374
|
offenses = offenses_to_report(offenses)
|
|
250
375
|
formatter_set.file_finished(file, offenses)
|
|
251
376
|
end
|
|
@@ -254,10 +379,6 @@ module RuboCop
|
|
|
254
379
|
@cached_run ||=
|
|
255
380
|
(@options[:cache] == 'true' ||
|
|
256
381
|
(@options[:cache] != 'false' && @config_store.for_pwd.for_all_cops['UseCache'])) &&
|
|
257
|
-
# When running --auto-gen-config, there's some processing done in the
|
|
258
|
-
# cops related to calculating the Max parameters for Metrics cops. We
|
|
259
|
-
# need to do that processing and cannot use caching.
|
|
260
|
-
!@options[:auto_gen_config] &&
|
|
261
382
|
# We can't cache results from code which is piped in to stdin
|
|
262
383
|
!@options[:stdin]
|
|
263
384
|
end
|
|
@@ -273,34 +394,100 @@ module RuboCop
|
|
|
273
394
|
end
|
|
274
395
|
|
|
275
396
|
def do_inspection_loop(file)
|
|
276
|
-
|
|
397
|
+
# We can reuse the prism result since the source did not change yet.
|
|
398
|
+
processed_source = get_processed_source(file, @prism_result)
|
|
399
|
+
original_source = processed_source.raw_source
|
|
277
400
|
# This variable is 2d array used to track corrected offenses after each
|
|
278
401
|
# inspection iteration. This is used to output meaningful infinite loop
|
|
279
402
|
# error message.
|
|
280
403
|
offenses_by_iteration = []
|
|
404
|
+
corrected_source = nil
|
|
281
405
|
|
|
282
|
-
# When running with --autocorrect, we need to inspect the file
|
|
283
|
-
#
|
|
284
|
-
#
|
|
285
|
-
#
|
|
406
|
+
# When running with --autocorrect, we need to inspect the file until no
|
|
407
|
+
# more corrections are made. This is because automatic corrections can
|
|
408
|
+
# introduce new offenses. In the normal case the loop is only executed
|
|
409
|
+
# once. The corrections are kept in memory while iterating and written
|
|
410
|
+
# back to the file when the loop is done.
|
|
286
411
|
iterate_until_no_changes(processed_source, offenses_by_iteration) do
|
|
287
|
-
|
|
288
|
-
# only keep the corrected ones in order to avoid duplicate reporting.
|
|
289
|
-
!offenses_by_iteration.empty? && offenses_by_iteration.last.select!(&:corrected?)
|
|
290
|
-
new_offenses, updated_source_file = inspect_file(processed_source)
|
|
291
|
-
offenses_by_iteration.push(new_offenses)
|
|
412
|
+
team, updated_source_file = inspect_and_correct(processed_source, offenses_by_iteration)
|
|
292
413
|
|
|
293
414
|
# We have to reprocess the source to pickup the changes. Since the
|
|
294
415
|
# change could (theoretically) introduce parsing errors, we break the
|
|
295
416
|
# loop if we find any.
|
|
296
417
|
break unless updated_source_file
|
|
297
418
|
|
|
298
|
-
|
|
419
|
+
# Autocorrect has happened, don't use the prism result since it is stale.
|
|
420
|
+
# With --stdin the corrected source is kept in @options[:stdin] instead.
|
|
421
|
+
corrected_source = team.updated_source
|
|
422
|
+
processed_source = get_processed_source(file, nil, source: corrected_source)
|
|
299
423
|
end
|
|
300
424
|
|
|
301
425
|
# Return summary of corrected offenses after all iterations
|
|
302
|
-
|
|
303
|
-
|
|
426
|
+
[processed_source, offenses_by_iteration.flatten.uniq]
|
|
427
|
+
ensure
|
|
428
|
+
finalize_corrections(file, original_source, corrected_source)
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
def inspect_and_correct(processed_source, offenses_by_iteration)
|
|
432
|
+
# The offenses that couldn't be corrected will be found again so we
|
|
433
|
+
# only keep the corrected ones in order to avoid duplicate reporting.
|
|
434
|
+
!offenses_by_iteration.empty? && offenses_by_iteration.last.select!(&:corrected?)
|
|
435
|
+
team, new_offenses, updated_source_file = inspect_iteration(processed_source)
|
|
436
|
+
offenses_by_iteration.push(new_offenses)
|
|
437
|
+
|
|
438
|
+
[team, updated_source_file]
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
# Write the file once, even when the loop was left through an exception
|
|
442
|
+
# (e.g. an infinite correction loop), like the per-iteration writes used
|
|
443
|
+
# to be. Under `--diff` nothing is written at all.
|
|
444
|
+
def finalize_corrections(file, original_source, corrected_source)
|
|
445
|
+
if @options[:diff]
|
|
446
|
+
record_diff(file, original_source, corrected_source)
|
|
447
|
+
elsif corrected_source
|
|
448
|
+
File.write(file, corrected_source)
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
# `--diff` reports what autocorrection would do instead of doing it. With
|
|
453
|
+
# `--stdin` the corrected source is handed back through the options rather
|
|
454
|
+
# than deferred, so that is where the new source comes from.
|
|
455
|
+
def record_diff(file, original_source, corrected_source)
|
|
456
|
+
new_source = @options[:stdin] || corrected_source
|
|
457
|
+
return unless original_source && new_source
|
|
458
|
+
|
|
459
|
+
# The original source is the file as it is on disk, so the corrected one
|
|
460
|
+
# has to go through the same line ending conversion `File.write` would
|
|
461
|
+
# apply, or on Windows every single line reads as changed.
|
|
462
|
+
new_source = emulate_write_read_cycle(new_source)
|
|
463
|
+
|
|
464
|
+
diff = UnifiedDiff.new(PathUtil.smart_path(file), original_source, new_source).to_s
|
|
465
|
+
@diffs << diff unless diff.empty?
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
def inspect_iteration(processed_source)
|
|
469
|
+
team = mobilize_team(processed_source)
|
|
470
|
+
team.defer_corrections = @options[:diff] || in_memory_corrections_possible?
|
|
471
|
+
offenses, updated_source_file = inspect_file(processed_source, team)
|
|
472
|
+
[team, offenses, updated_source_file]
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
# When corrections were written to disk and read back between iterations,
|
|
476
|
+
# the text-mode write converted LF to CRLF on Windows, and cops like
|
|
477
|
+
# `Layout/EndOfLine` rely on seeing the source as it would be on disk.
|
|
478
|
+
# Apply the same conversion to the in-memory source. The final `File.write`
|
|
479
|
+
# still performs it for the file itself.
|
|
480
|
+
def emulate_write_read_cycle(source)
|
|
481
|
+
return source unless Platform.windows?
|
|
482
|
+
|
|
483
|
+
source.encode(source.encoding, crlf_newline: true)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# Custom ruby extractors may derive their fragments from the file on
|
|
487
|
+
# disk rather than from the passed processed source, so corrections can
|
|
488
|
+
# only be kept in memory when the default extractor is used.
|
|
489
|
+
def in_memory_corrections_possible?
|
|
490
|
+
self.class.ruby_extractors.one?
|
|
304
491
|
end
|
|
305
492
|
|
|
306
493
|
def iterate_until_no_changes(source, offenses_by_iteration)
|
|
@@ -344,16 +531,9 @@ module RuboCop
|
|
|
344
531
|
|
|
345
532
|
def inspect_file(processed_source, team = mobilize_team(processed_source))
|
|
346
533
|
extracted_ruby_sources = extract_ruby_sources(processed_source)
|
|
347
|
-
offenses = extracted_ruby_sources
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
offset: extracted_ruby_source[:offset],
|
|
351
|
-
original: processed_source
|
|
352
|
-
)
|
|
353
|
-
@errors.concat(team.errors)
|
|
354
|
-
@warnings.concat(team.warnings)
|
|
355
|
-
report.offenses
|
|
356
|
-
end
|
|
534
|
+
offenses = team.investigate_fragments(extracted_ruby_sources, original: processed_source)
|
|
535
|
+
@errors.concat(team.errors)
|
|
536
|
+
@warnings.concat(team.warnings)
|
|
357
537
|
[offenses, team.updated_source_file?]
|
|
358
538
|
end
|
|
359
539
|
|
|
@@ -373,30 +553,35 @@ module RuboCop
|
|
|
373
553
|
|
|
374
554
|
def mobilize_team(processed_source)
|
|
375
555
|
config = @config_store.for_file(processed_source.path)
|
|
376
|
-
|
|
556
|
+
@inspection_team_by_config ||= {}.compare_by_identity
|
|
557
|
+
@inspection_team_by_config[config] ||= assemble_team(config)
|
|
377
558
|
end
|
|
378
559
|
|
|
379
|
-
def mobilized_cop_classes(config)
|
|
560
|
+
def mobilized_cop_classes(config)
|
|
380
561
|
@mobilized_cop_classes ||= {}.compare_by_identity
|
|
381
562
|
@mobilized_cop_classes[config] ||= begin
|
|
382
|
-
cop_classes = Cop::Registry.all
|
|
383
|
-
|
|
384
563
|
# `@options[:only]` and `@options[:except]` are not qualified until
|
|
385
|
-
# needed so that the
|
|
386
|
-
#
|
|
564
|
+
# needed so that the registry contains any cops added by `require`s,
|
|
565
|
+
# which register eagerly when their files are loaded.
|
|
387
566
|
qualify_option_cop_names
|
|
388
567
|
|
|
389
568
|
OptionsValidator.new(@options).validate_cop_options
|
|
390
569
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
570
|
+
# Filtering by badge keeps lazy-loaded cops unloaded; only the cops
|
|
571
|
+
# that survive the filter and are enabled will be loaded.
|
|
572
|
+
Cop::Registry.global.filter_by_badge(@options) { |badge| mobilize_cop_badge?(badge, config) }
|
|
573
|
+
end
|
|
574
|
+
end
|
|
396
575
|
|
|
397
|
-
|
|
576
|
+
def mobilize_cop_badge?(badge, config)
|
|
577
|
+
return false if badge.department == :Test
|
|
578
|
+
return false if badge.match_name?(@options[:except])
|
|
398
579
|
|
|
399
|
-
|
|
580
|
+
if @options[:only]
|
|
581
|
+
badge.match_name?(@options[:only])
|
|
582
|
+
else
|
|
583
|
+
# use only cops that link to a style guide if requested.
|
|
584
|
+
!style_guide_cops_only?(config) || config.for_cop(badge.to_s)['StyleGuide']
|
|
400
585
|
end
|
|
401
586
|
end
|
|
402
587
|
|
|
@@ -410,13 +595,6 @@ module RuboCop
|
|
|
410
595
|
end
|
|
411
596
|
end
|
|
412
597
|
|
|
413
|
-
def filter_cop_classes(cop_classes, config)
|
|
414
|
-
# use only cops that link to a style guide if requested
|
|
415
|
-
return unless style_guide_cops_only?(config)
|
|
416
|
-
|
|
417
|
-
cop_classes.select! { |cop| config.for_cop(cop)['StyleGuide'] }
|
|
418
|
-
end
|
|
419
|
-
|
|
420
598
|
def style_guide_cops_only?(config)
|
|
421
599
|
@options[:only_guide_cops] || config.for_all_cops['StyleGuideCopsOnly']
|
|
422
600
|
end
|
|
@@ -472,24 +650,30 @@ module RuboCop
|
|
|
472
650
|
end
|
|
473
651
|
|
|
474
652
|
def minimum_severity_to_fail
|
|
475
|
-
@minimum_severity_to_fail ||=
|
|
476
|
-
|
|
477
|
-
name = @options[:fail_level] || :refactor
|
|
478
|
-
|
|
479
|
-
# autocorrect is a fake level - use the default
|
|
480
|
-
RuboCop::Cop::Severity.new(name == :autocorrect ? :refactor : name)
|
|
481
|
-
end
|
|
653
|
+
@minimum_severity_to_fail ||=
|
|
654
|
+
RuboCop::Cop::Severity.minimum_to_fail(@options, @config_store.for_pwd)
|
|
482
655
|
end
|
|
483
656
|
|
|
484
|
-
# rubocop:disable Metrics/MethodLength
|
|
485
|
-
def get_processed_source(file)
|
|
657
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
658
|
+
def get_processed_source(file, prism_result, source: nil)
|
|
486
659
|
config = @config_store.for_file(file)
|
|
487
660
|
ruby_version = config.target_ruby_version
|
|
488
661
|
parser_engine = config.parser_engine
|
|
489
662
|
|
|
490
|
-
processed_source = if
|
|
663
|
+
processed_source = if source
|
|
664
|
+
ProcessedSource.new(
|
|
665
|
+
emulate_write_read_cycle(source),
|
|
666
|
+
ruby_version,
|
|
667
|
+
file,
|
|
668
|
+
parser_engine: parser_engine
|
|
669
|
+
)
|
|
670
|
+
elsif @options[:stdin]
|
|
491
671
|
ProcessedSource.new(
|
|
492
|
-
@options[:stdin],
|
|
672
|
+
@options[:stdin],
|
|
673
|
+
ruby_version,
|
|
674
|
+
file,
|
|
675
|
+
parser_engine: parser_engine,
|
|
676
|
+
prism_result: prism_result
|
|
493
677
|
)
|
|
494
678
|
else
|
|
495
679
|
begin
|
|
@@ -504,16 +688,26 @@ module RuboCop
|
|
|
504
688
|
processed_source.registry = mobilized_cop_classes(config)
|
|
505
689
|
processed_source
|
|
506
690
|
end
|
|
507
|
-
# rubocop:enable Metrics/MethodLength
|
|
508
691
|
|
|
509
692
|
# A Cop::Team instance is stateful and may change when inspecting.
|
|
510
693
|
# The "standby" team for a given config is an initialized but
|
|
511
694
|
# otherwise dormant team that can be used for config- and option-
|
|
512
695
|
# level caching in ResultCache.
|
|
513
696
|
def standby_team(config)
|
|
514
|
-
@
|
|
515
|
-
@
|
|
516
|
-
|
|
697
|
+
@standby_team_by_config ||= {}.compare_by_identity
|
|
698
|
+
@standby_team_by_config[config] ||= assemble_team(config)
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
def assemble_team(config)
|
|
702
|
+
team = Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
703
|
+
|
|
704
|
+
if @project_index
|
|
705
|
+
team.cops.each do |cop|
|
|
706
|
+
cop.project_index = @project_index
|
|
707
|
+
end
|
|
708
|
+
end
|
|
709
|
+
|
|
710
|
+
team
|
|
517
711
|
end
|
|
518
712
|
end
|
|
519
713
|
end
|