rubocop 1.81.7 → 1.92.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +626 -111
- data/config/obsoletion.yml +39 -1
- data/exe/rubocop +1 -1
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +34 -2
- data/lib/rubocop/cli/command/cop_names.rb +57 -0
- data/lib/rubocop/cli/command/execute_runner.rb +54 -3
- data/lib/rubocop/cli/command/explain.rb +34 -0
- 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 +8 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +8 -10
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +41 -14
- 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 +97 -44
- data/lib/rubocop/config.rb +100 -15
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +49 -27
- data/lib/rubocop/config_loader_resolver.rb +95 -20
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion.rb +1 -1
- data/lib/rubocop/config_store.rb +2 -2
- data/lib/rubocop/config_validator.rb +69 -7
- data/lib/rubocop/cop/autocorrect_logic.rb +24 -6
- data/lib/rubocop/cop/badge.rb +10 -2
- data/lib/rubocop/cop/base.rb +128 -35
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -4
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -10
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/cop_documentation.rb +81 -0
- data/lib/rubocop/cop/cop_explanation.rb +140 -0
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +87 -9
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +37 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +31 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +35 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +70 -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 +3 -4
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/dependency_version.rb +0 -6
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +14 -4
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -8
- data/lib/rubocop/cop/gemspec/require_mfa.rb +9 -6
- 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_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 +28 -2
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +12 -16
- 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_type_group.rb +0 -7
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +9 -3
- 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 +84 -4
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +156 -41
- 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 +4 -0
- data/lib/rubocop/cop/layout/dot_position.rb +26 -16
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -14
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +25 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +21 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +15 -2
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +21 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +23 -15
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +81 -2
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +41 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +36 -23
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +6 -0
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +4 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +16 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +8 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_consistency.rb +22 -5
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +158 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +27 -0
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +10 -4
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +25 -9
- data/lib/rubocop/cop/layout/line_length.rb +265 -29
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +69 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +10 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +65 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +268 -38
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +102 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +19 -5
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +10 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_not.rb +5 -0
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +14 -2
- data/lib/rubocop/cop/layout/space_around_operators.rb +18 -3
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +4 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +44 -34
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +31 -8
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +2 -12
- 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.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +1 -2
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +6 -1
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +1 -1
- 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 +165 -15
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -2
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- 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 +405 -28
- 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 +9 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -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 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +4 -0
- 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 +36 -9
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +75 -37
- data/lib/rubocop/cop/lint/loop.rb +24 -2
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +245 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +46 -18
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +22 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +10 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +160 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +28 -6
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -4
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +37 -14
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +11 -5
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -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 +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +24 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +56 -6
- 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 +33 -2
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -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_in_number_conversion.rb +13 -2
- data/lib/rubocop/cop/lint/symbol_conversion.rb +22 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +72 -4
- 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 +54 -11
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +15 -9
- 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/useless_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/useless_assignment.rb +61 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +40 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +10 -10
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +10 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +11 -5
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +94 -14
- data/lib/rubocop/cop/lint/void.rb +59 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/class_length.rb +4 -2
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +0 -4
- data/lib/rubocop/cop/metrics/method_length.rb +2 -2
- data/lib/rubocop/cop/metrics/module_length.rb +4 -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 +1 -1
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- 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 +5 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +47 -25
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +12 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +1 -2
- 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/empty_lines_around_body.rb +12 -1
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +105 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +5 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +58 -12
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +37 -10
- data/lib/rubocop/cop/mixin/hash_subset.rb +9 -2
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +14 -60
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +28 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/min_branches_count.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +11 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +79 -8
- data/lib/rubocop/cop/mixin/project_index_help.rb +203 -0
- data/lib/rubocop/cop/mixin/range_help.rb +1 -2
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +181 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +69 -12
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +2 -1
- data/lib/rubocop/cop/mixin.rb +93 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +8 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +4 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +4 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +9 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -3
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -5
- data/lib/rubocop/cop/naming/method_name.rb +6 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +13 -2
- data/lib/rubocop/cop/naming/predicate_prefix.rb +30 -17
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -7
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +232 -66
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +16 -4
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- 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 +55 -8
- data/lib/rubocop/cop/style/accessor_grouping.rb +16 -5
- data/lib/rubocop/cop/style/alias.rb +33 -8
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +4 -3
- data/lib/rubocop/cop/style/and_or.rb +8 -3
- data/lib/rubocop/cop/style/arguments_forwarding.rb +61 -17
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +28 -5
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +3 -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 +8 -6
- 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 -6
- data/lib/rubocop/cop/style/block_delimiters.rb +74 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +11 -10
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +151 -35
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +26 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_querying.rb +79 -46
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +91 -9
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +65 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +34 -18
- data/lib/rubocop/cop/style/constant_visibility.rb +13 -7
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +18 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -2
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- 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 +184 -20
- 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 +11 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- 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 +8 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +74 -22
- 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 +100 -21
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/explicit_block_argument.rb +50 -10
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- 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 +28 -14
- data/lib/rubocop/cop/style/for.rb +60 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +50 -7
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +2 -1
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +57 -40
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +31 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +39 -11
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -2
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +19 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +38 -10
- data/lib/rubocop/cop/style/if_inside_else.rb +36 -8
- data/lib/rubocop/cop/style/if_unless_modifier.rb +80 -76
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +17 -14
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +24 -2
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +25 -5
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/it_block_parameter.rb +94 -4
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +10 -4
- data/lib/rubocop/cop/style/lambda.rb +45 -2
- data/lib/rubocop/cop/style/lambda_call.rb +24 -8
- 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 +2 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +102 -20
- 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 +42 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +4 -1
- data/lib/rubocop/cop/style/missing_else.rb +7 -1
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_grouping.rb +12 -3
- 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_if_modifier.rb +45 -5
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +7 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -13
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +7 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +158 -14
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +3 -3
- data/lib/rubocop/cop/style/negative_array_index.rb +228 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +36 -12
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +26 -8
- data/lib/rubocop/cop/style/next.rb +24 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +50 -12
- 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 +12 -3
- 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 +22 -6
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +18 -6
- 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 +26 -7
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +7 -2
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- 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 +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +20 -10
- data/lib/rubocop/cop/style/reduce_to_hash.rb +216 -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_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +25 -7
- data/lib/rubocop/cop/style/redundant_condition.rb +41 -23
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +13 -1
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +21 -3
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +10 -2
- 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 +43 -7
- data/lib/rubocop/cop/style/redundant_freeze.rb +11 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +49 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +82 -115
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +13 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +27 -7
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -4
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +11 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +27 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +45 -11
- 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 +106 -28
- data/lib/rubocop/cop/style/require_order.rb +25 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +15 -14
- data/lib/rubocop/cop/style/return_nil.rb +17 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +11 -1
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +18 -9
- data/lib/rubocop/cop/style/sample.rb +19 -13
- 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 +52 -23
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +39 -13
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +4 -0
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +19 -7
- data/lib/rubocop/cop/style/single_line_methods.rb +24 -5
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +25 -7
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +31 -5
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +25 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +36 -1
- data/lib/rubocop/cop/style/super_arguments.rb +6 -4
- data/lib/rubocop/cop/style/symbol_proc.rb +32 -14
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +34 -1
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- 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 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +26 -12
- data/lib/rubocop/cop/style/yoda_expression.rb +11 -2
- 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 +171 -48
- data/lib/rubocop/cop/util.rb +5 -8
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -1
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +33 -9
- data/lib/rubocop/cops_documentation_generator.rb +27 -9
- data/lib/rubocop/directive_comment.rb +116 -7
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +39 -10
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +2 -4
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/offense_count_formatter.rb +4 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +3 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +186 -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 +5 -4
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -42
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +130 -83
- data/lib/rubocop/lsp/runtime.rb +64 -15
- data/lib/rubocop/lsp/server.rb +6 -2
- data/lib/rubocop/lsp/stdin_runner.rb +35 -2
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +47 -0
- data/lib/rubocop/mcp/autocorrection_request.rb +52 -0
- data/lib/rubocop/mcp/explain_tool.rb +68 -0
- data/lib/rubocop/mcp/scope.rb +65 -0
- data/lib/rubocop/mcp/server.rb +307 -0
- data/lib/rubocop/mcp/source_files.rb +35 -0
- data/lib/rubocop/offense_limit.rb +30 -0
- data/lib/rubocop/options.rb +141 -13
- data/lib/rubocop/path_util.rb +16 -5
- data/lib/rubocop/pending_cops_reporter.rb +1 -6
- data/lib/rubocop/plugin/configuration_integrator.rb +13 -3
- data/lib/rubocop/plugin/loader.rb +2 -2
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +2 -3
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +102 -59
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/expect_offense.rb +2 -4
- data/lib/rubocop/rspec/shared_contexts.rb +53 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +362 -106
- data/lib/rubocop/server/cache.rb +21 -40
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +18 -8
- data/lib/rubocop/target_ruby.rb +42 -22
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +23 -7
- data/lib/rubocop.rb +34 -701
- data/lib/ruby_lsp/rubocop/addon.rb +1 -2
- metadata +80 -14
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
data/lib/rubocop/runner.rb
CHANGED
|
@@ -62,14 +62,34 @@ module RuboCop
|
|
|
62
62
|
@errors = []
|
|
63
63
|
@warnings = []
|
|
64
64
|
@aborting = false
|
|
65
|
+
@inspected_files = []
|
|
66
|
+
@diff_sources = {}
|
|
67
|
+
@report_queue = {}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# The `--diff` patches, one per file, from the source on disk (or stdin) to
|
|
71
|
+
# the source once every correction, redundant directive removal included,
|
|
72
|
+
# has been applied.
|
|
73
|
+
def diffs
|
|
74
|
+
@diffs ||= @diff_sources.filter_map do |file, (original_source, corrected_source)|
|
|
75
|
+
diff = UnifiedDiff.new(PathUtil.smart_path(file), original_source, corrected_source).to_s
|
|
76
|
+
diff unless diff.empty?
|
|
77
|
+
end
|
|
65
78
|
end
|
|
66
79
|
|
|
67
80
|
def run(paths)
|
|
68
|
-
|
|
81
|
+
@inspection_team_by_config = {}.compare_by_identity
|
|
82
|
+
|
|
83
|
+
# Compute the cache source checksum once to avoid potential
|
|
84
|
+
# inconsistencies between workers.
|
|
85
|
+
ResultCache.source_checksum
|
|
86
|
+
|
|
87
|
+
target_files = only_changed(find_target_files(paths))
|
|
88
|
+
build_project_index(target_files)
|
|
89
|
+
|
|
69
90
|
if @options[:list_target_files]
|
|
70
91
|
list_files(target_files)
|
|
71
92
|
else
|
|
72
|
-
warm_cache(target_files) if @options[:parallel]
|
|
73
93
|
inspect_files(target_files)
|
|
74
94
|
end
|
|
75
95
|
rescue Interrupt
|
|
@@ -86,19 +106,12 @@ module RuboCop
|
|
|
86
106
|
|
|
87
107
|
private
|
|
88
108
|
|
|
89
|
-
#
|
|
90
|
-
#
|
|
91
|
-
def
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return
|
|
96
|
-
end
|
|
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
|
|
109
|
+
# The project index is deliberately built from the unfiltered file list:
|
|
110
|
+
# cross-file offenses must not depend on which files happen to have changed.
|
|
111
|
+
def only_changed(target_files)
|
|
112
|
+
return target_files unless @options[:changed]
|
|
113
|
+
|
|
114
|
+
ChangedFiles.new(@options[:changed]).filter(target_files).freeze
|
|
102
115
|
end
|
|
103
116
|
|
|
104
117
|
def find_target_files(paths)
|
|
@@ -112,12 +125,54 @@ module RuboCop
|
|
|
112
125
|
target_files.each(&:freeze).freeze
|
|
113
126
|
end
|
|
114
127
|
|
|
115
|
-
def
|
|
116
|
-
|
|
128
|
+
def build_project_index(target_files)
|
|
129
|
+
return unless project_index_enabled?
|
|
130
|
+
|
|
131
|
+
@project_index = ProjectIndexLoader.build_index(project_index_files(target_files))
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# The index always covers the whole project, not just the files being
|
|
135
|
+
# inspected: cross-file offenses must not depend on which files a
|
|
136
|
+
# particular run happens to include, or single-file runs (editors, CI
|
|
137
|
+
# sharding) would see different offenses than full runs. The project is
|
|
138
|
+
# rooted at the directory of the configuration that enabled the index.
|
|
139
|
+
def project_index_files(target_files)
|
|
140
|
+
root = @config_store.for_pwd.base_dir_for_path_parameters
|
|
141
|
+
project_files = begin
|
|
142
|
+
find_target_files([root]) | target_files
|
|
143
|
+
rescue Errno::ENOENT
|
|
144
|
+
target_files
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
(project_files | bundled_gem_files).sort
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def bundled_gem_files
|
|
151
|
+
return [] unless @config_store.for_pwd.for_all_cops['ProjectIndexIncludesGems']
|
|
117
152
|
|
|
153
|
+
ProjectIndexLoader.bundled_gem_source_files
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def project_index_enabled?
|
|
157
|
+
return false unless @config_store.for_pwd.for_all_cops['UseProjectIndex']
|
|
158
|
+
|
|
159
|
+
unless ProjectIndexLoader.available?
|
|
160
|
+
ProjectIndexLoader.warn_unavailable
|
|
161
|
+
return false
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
true
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def inspect_files(files) # rubocop:disable Metrics/AbcSize
|
|
118
168
|
formatter_set.started(files)
|
|
169
|
+
formatters_started = true
|
|
170
|
+
file_iterator(files) do |file|
|
|
171
|
+
offenses, problems = collect_problems { process_file(file) }
|
|
172
|
+
succeeded = offenses.none? { |o| considered_failure?(o) && offense_displayed?(o) }
|
|
119
173
|
|
|
120
|
-
|
|
174
|
+
[offenses, succeeded, problems]
|
|
175
|
+
end
|
|
121
176
|
ensure
|
|
122
177
|
# OPTIMIZE: Calling `ResultCache.cleanup` takes time. This optimization
|
|
123
178
|
# mainly targets editors that integrates RuboCop. When RuboCop is run
|
|
@@ -125,23 +180,101 @@ module RuboCop
|
|
|
125
180
|
if files.size > 1 && cached_run?
|
|
126
181
|
ResultCache.cleanup(@config_store, @options[:debug], @options[:cache_root])
|
|
127
182
|
end
|
|
128
|
-
|
|
129
|
-
formatter_set.finished(inspected_files.freeze)
|
|
183
|
+
formatter_set.finished(@inspected_files.freeze) if formatters_started
|
|
130
184
|
formatter_set.close_output_files
|
|
185
|
+
warn_about_elided_offenses
|
|
131
186
|
end
|
|
132
187
|
|
|
133
|
-
def
|
|
134
|
-
|
|
135
|
-
offenses = process_file(file)
|
|
136
|
-
yield file
|
|
188
|
+
def file_iterator(files, &block)
|
|
189
|
+
all_passed = true
|
|
137
190
|
|
|
138
|
-
|
|
139
|
-
|
|
191
|
+
on_start = ->(file, _index) { file_started(file) }
|
|
192
|
+
on_finish = lambda do |file, index, (offenses, passed, problems)|
|
|
193
|
+
all_passed &&= passed
|
|
194
|
+
finished_report(file, index, offenses, problems)
|
|
195
|
+
end
|
|
140
196
|
|
|
141
|
-
|
|
142
|
-
|
|
197
|
+
if run_in_parallel?(files)
|
|
198
|
+
parallel_file_iterator(files, on_start, on_finish, &block)
|
|
199
|
+
else
|
|
200
|
+
serial_file_iterator(files, on_start, on_finish, &block)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
process_remaining_report_queue
|
|
204
|
+
|
|
205
|
+
all_passed
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def finished_report(file, index, offenses, problems)
|
|
209
|
+
@report_queue[index] = [file, offenses, problems]
|
|
210
|
+
@next_index_to_report ||= 0
|
|
211
|
+
while @report_queue.key?(@next_index_to_report)
|
|
212
|
+
process_report_queue_entry(@next_index_to_report)
|
|
213
|
+
@next_index_to_report += 1
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def process_report_queue_entry(index)
|
|
218
|
+
file, offenses, (errors, warnings) = @report_queue.delete(index)
|
|
219
|
+
@errors.concat(errors)
|
|
220
|
+
@warnings.concat(warnings)
|
|
221
|
+
file_problems(file, errors, warnings) unless errors.empty? && warnings.empty?
|
|
222
|
+
file_finished(file, offenses)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def process_remaining_report_queue
|
|
226
|
+
@report_queue.keys.sort.each do |index|
|
|
227
|
+
process_report_queue_entry(index)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def run_in_parallel?(files)
|
|
232
|
+
return false unless parallel_supported_by_options?
|
|
143
233
|
|
|
144
|
-
|
|
234
|
+
if files.size <= 1
|
|
235
|
+
puts 'Skipping parallel inspection: only a single file needs inspection' if @options[:debug]
|
|
236
|
+
return false
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
return false if project_index_disables_parallel?
|
|
240
|
+
|
|
241
|
+
puts 'Running parallel inspection' if @options[:debug]
|
|
242
|
+
|
|
243
|
+
true
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# `--auto-gen-config` needs the offenses of every file in one place, and
|
|
247
|
+
# `--diff` collects the diffs in this process, where a worker's copy of
|
|
248
|
+
# them would be lost.
|
|
249
|
+
def parallel_supported_by_options?
|
|
250
|
+
@options[:parallel] && !@options[:auto_gen_config] && !@options[:diff]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def project_index_disables_parallel?
|
|
254
|
+
return false if @project_index.nil? || !Gem.win_platform?
|
|
255
|
+
|
|
256
|
+
if @options[:debug]
|
|
257
|
+
puts 'Skipping parallel inspection: the project index is enabled and parallel ' \
|
|
258
|
+
'inspection is not yet supported on Windows.'
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
true
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def parallel_file_iterator(files, on_start, on_finish, &block)
|
|
265
|
+
Parallel.each(files, start: on_start, finish: on_finish, &block)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def serial_file_iterator(files, on_start, on_finish, &block)
|
|
269
|
+
files.each_with_index do |file, index|
|
|
270
|
+
on_start.call(file, index)
|
|
271
|
+
result = yield file
|
|
272
|
+
on_finish.call(file, index, result)
|
|
273
|
+
|
|
274
|
+
# Report and count the offending file before stopping so `--fail-fast`
|
|
275
|
+
# still shows its offenses and exits with a failing status.
|
|
276
|
+
_offenses, succeeded = result
|
|
277
|
+
break if @options[:fail_fast] && !succeeded
|
|
145
278
|
end
|
|
146
279
|
end
|
|
147
280
|
|
|
@@ -149,24 +282,37 @@ module RuboCop
|
|
|
149
282
|
paths.each { |path| puts PathUtil.relative_path(path) }
|
|
150
283
|
end
|
|
151
284
|
|
|
285
|
+
# Keeps the errors and warnings a file causes apart from the rest of the
|
|
286
|
+
# run's. A parallel worker inspects files in a copy of the runner that is
|
|
287
|
+
# thrown away, so they have to travel back with the file's offenses.
|
|
288
|
+
def collect_problems
|
|
289
|
+
errors = @errors
|
|
290
|
+
warnings = @warnings
|
|
291
|
+
@errors = []
|
|
292
|
+
@warnings = []
|
|
293
|
+
|
|
294
|
+
[yield, [@errors, @warnings]]
|
|
295
|
+
ensure
|
|
296
|
+
@errors = errors
|
|
297
|
+
@warnings = warnings
|
|
298
|
+
end
|
|
299
|
+
|
|
152
300
|
def process_file(file)
|
|
153
|
-
|
|
154
|
-
offenses = file_offenses(file)
|
|
301
|
+
file_offenses(file)
|
|
155
302
|
rescue InfiniteCorrectionLoop => e
|
|
156
303
|
raise e if @options[:raise_cop_error]
|
|
157
304
|
|
|
158
305
|
errors << e
|
|
159
306
|
warn Rainbow(e.message).red
|
|
160
|
-
|
|
161
|
-
ensure
|
|
162
|
-
file_finished(file, offenses || [])
|
|
307
|
+
e.offenses.compact.sort.freeze
|
|
163
308
|
end
|
|
164
309
|
|
|
165
310
|
def file_offenses(file)
|
|
166
311
|
file_offense_cache(file) do
|
|
167
312
|
source, offenses = do_inspection_loop(file)
|
|
168
313
|
offenses = add_redundant_disables(file, offenses.compact.sort, source)
|
|
169
|
-
offenses.
|
|
314
|
+
offenses = offenses.reject(&:disabled?) unless @options[:display_suppressed]
|
|
315
|
+
offenses.sort.freeze
|
|
170
316
|
end
|
|
171
317
|
end
|
|
172
318
|
|
|
@@ -190,7 +336,7 @@ module RuboCop
|
|
|
190
336
|
|
|
191
337
|
if real_run_needed
|
|
192
338
|
offenses = yield
|
|
193
|
-
save_in_cache(cache, offenses)
|
|
339
|
+
save_in_cache(cache, offenses) unless Cop::Registry.global.warnings?(file)
|
|
194
340
|
end
|
|
195
341
|
|
|
196
342
|
offenses
|
|
@@ -203,9 +349,11 @@ module RuboCop
|
|
|
203
349
|
if redundant_updated
|
|
204
350
|
# Do one extra inspection loop if any redundant disables were
|
|
205
351
|
# removed. This is done in order to find rubocop:enable directives that
|
|
206
|
-
# have now become useless.
|
|
207
|
-
|
|
208
|
-
|
|
352
|
+
# have now become useless. It finds the offenses that are left again,
|
|
353
|
+
# located in the corrected source, so only the corrected ones are kept
|
|
354
|
+
# from before, as `inspect_and_correct` does.
|
|
355
|
+
_source, new_offenses = do_inspection_loop(file, team.updated_source)
|
|
356
|
+
offenses = offenses.select(&:corrected?) | new_offenses
|
|
209
357
|
end
|
|
210
358
|
end
|
|
211
359
|
offenses
|
|
@@ -218,12 +366,20 @@ module RuboCop
|
|
|
218
366
|
team = Cop::Team.mobilize([Cop::Lint::RedundantCopDisableDirective], config, @options)
|
|
219
367
|
return if team.cops.empty?
|
|
220
368
|
|
|
369
|
+
team.defer_corrections = @options[:diff]
|
|
370
|
+
|
|
221
371
|
team.cops.first.offenses_to_check = offenses
|
|
222
372
|
yield team
|
|
223
373
|
end
|
|
224
374
|
|
|
225
375
|
def check_for_redundant_disables?(source)
|
|
226
|
-
return false if
|
|
376
|
+
return false if except_redundant_cop_disable_directive?
|
|
377
|
+
# Detached `disable-next` directives produce no disabled ranges but must
|
|
378
|
+
# still be reported as redundant.
|
|
379
|
+
if source.disabled_line_ranges.empty? &&
|
|
380
|
+
source.comment_config.detached_next_directives.empty?
|
|
381
|
+
return false
|
|
382
|
+
end
|
|
227
383
|
|
|
228
384
|
!@options[:only]
|
|
229
385
|
end
|
|
@@ -245,7 +401,17 @@ module RuboCop
|
|
|
245
401
|
formatter_set.file_started(file, cli_options: @options, config_store: @config_store)
|
|
246
402
|
end
|
|
247
403
|
|
|
404
|
+
# Formatters get the messages without the colors added for the terminal.
|
|
405
|
+
def file_problems(file, errors, warnings)
|
|
406
|
+
formatter_set.file_problems(file, plain_messages(errors), plain_messages(warnings))
|
|
407
|
+
end
|
|
408
|
+
|
|
409
|
+
def plain_messages(problems)
|
|
410
|
+
problems.map { |problem| Rainbow::StringUtils.uncolor(problem.to_s) }
|
|
411
|
+
end
|
|
412
|
+
|
|
248
413
|
def file_finished(file, offenses)
|
|
414
|
+
@inspected_files << file
|
|
249
415
|
offenses = offenses_to_report(offenses)
|
|
250
416
|
formatter_set.file_finished(file, offenses)
|
|
251
417
|
end
|
|
@@ -254,10 +420,6 @@ module RuboCop
|
|
|
254
420
|
@cached_run ||=
|
|
255
421
|
(@options[:cache] == 'true' ||
|
|
256
422
|
(@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
423
|
# We can't cache results from code which is piped in to stdin
|
|
262
424
|
!@options[:stdin]
|
|
263
425
|
end
|
|
@@ -266,30 +428,29 @@ module RuboCop
|
|
|
266
428
|
return unless cache
|
|
267
429
|
# Caching results when a cop has crashed would prevent the crash in the
|
|
268
430
|
# next run, since the cop would not be called then. We want crashes to
|
|
269
|
-
# show up the same in each run.
|
|
431
|
+
# show up the same in each run. Only this file's errors and warnings are
|
|
432
|
+
# visible here, see `collect_problems`.
|
|
270
433
|
return if errors.any? || warnings.any?
|
|
271
434
|
|
|
272
435
|
cache.save(offenses)
|
|
273
436
|
end
|
|
274
437
|
|
|
275
|
-
def do_inspection_loop(file)
|
|
276
|
-
|
|
277
|
-
|
|
438
|
+
def do_inspection_loop(file, source = nil)
|
|
439
|
+
processed_source = initial_processed_source(file, source)
|
|
440
|
+
original_source = processed_source.raw_source
|
|
278
441
|
# This variable is 2d array used to track corrected offenses after each
|
|
279
442
|
# inspection iteration. This is used to output meaningful infinite loop
|
|
280
443
|
# error message.
|
|
281
444
|
offenses_by_iteration = []
|
|
445
|
+
corrected_source = nil
|
|
282
446
|
|
|
283
|
-
# When running with --autocorrect, we need to inspect the file
|
|
284
|
-
#
|
|
285
|
-
#
|
|
286
|
-
#
|
|
447
|
+
# When running with --autocorrect, we need to inspect the file until no
|
|
448
|
+
# more corrections are made. This is because automatic corrections can
|
|
449
|
+
# introduce new offenses. In the normal case the loop is only executed
|
|
450
|
+
# once. The corrections are kept in memory while iterating and written
|
|
451
|
+
# back to the file when the loop is done.
|
|
287
452
|
iterate_until_no_changes(processed_source, offenses_by_iteration) do
|
|
288
|
-
|
|
289
|
-
# only keep the corrected ones in order to avoid duplicate reporting.
|
|
290
|
-
!offenses_by_iteration.empty? && offenses_by_iteration.last.select!(&:corrected?)
|
|
291
|
-
new_offenses, updated_source_file = inspect_file(processed_source)
|
|
292
|
-
offenses_by_iteration.push(new_offenses)
|
|
453
|
+
team, updated_source_file = inspect_and_correct(processed_source, offenses_by_iteration)
|
|
293
454
|
|
|
294
455
|
# We have to reprocess the source to pickup the changes. Since the
|
|
295
456
|
# change could (theoretically) introduce parsing errors, we break the
|
|
@@ -297,12 +458,77 @@ module RuboCop
|
|
|
297
458
|
break unless updated_source_file
|
|
298
459
|
|
|
299
460
|
# Autocorrect has happened, don't use the prism result since it is stale.
|
|
300
|
-
|
|
461
|
+
# With --stdin the corrected source is kept in @options[:stdin] instead.
|
|
462
|
+
corrected_source = team.updated_source
|
|
463
|
+
processed_source = get_processed_source(file, nil, source: corrected_source)
|
|
301
464
|
end
|
|
302
465
|
|
|
303
466
|
# Return summary of corrected offenses after all iterations
|
|
304
|
-
|
|
305
|
-
|
|
467
|
+
[processed_source, offenses_by_iteration.flatten.uniq]
|
|
468
|
+
ensure
|
|
469
|
+
finalize_corrections(file, original_source, corrected_source)
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
# `source` is the corrected source to continue from when the corrections
|
|
473
|
+
# are kept in memory rather than written to the file (`--diff`).
|
|
474
|
+
def initial_processed_source(file, source)
|
|
475
|
+
return get_processed_source(file, nil, source: source) if source
|
|
476
|
+
|
|
477
|
+
# We can reuse the prism result since the source did not change yet.
|
|
478
|
+
get_processed_source(file, @prism_result)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
def inspect_and_correct(processed_source, offenses_by_iteration)
|
|
482
|
+
# The offenses that couldn't be corrected will be found again so we
|
|
483
|
+
# only keep the corrected ones in order to avoid duplicate reporting.
|
|
484
|
+
!offenses_by_iteration.empty? && offenses_by_iteration.last.select!(&:corrected?)
|
|
485
|
+
team, new_offenses, updated_source_file = inspect_iteration(processed_source)
|
|
486
|
+
offenses_by_iteration.push(new_offenses)
|
|
487
|
+
|
|
488
|
+
[team, updated_source_file]
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
# Write the file once, even when the loop was left through an exception
|
|
492
|
+
# (e.g. an infinite correction loop), like the per-iteration writes used
|
|
493
|
+
# to be. Under `--diff` nothing is written at all.
|
|
494
|
+
def finalize_corrections(file, original_source, corrected_source)
|
|
495
|
+
if @options[:diff]
|
|
496
|
+
record_diff(file, original_source, corrected_source)
|
|
497
|
+
elsif corrected_source
|
|
498
|
+
Util.replace_file_contents(file, corrected_source)
|
|
499
|
+
end
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
# `--diff` reports what autocorrection would do instead of doing it. With
|
|
503
|
+
# `--stdin` the corrected source is handed back through the options rather
|
|
504
|
+
# than deferred, so that is where the new source comes from. A file can go
|
|
505
|
+
# through more than one inspection loop, so the diff runs from the source
|
|
506
|
+
# the first loop started with to the one the last loop ended with.
|
|
507
|
+
def record_diff(file, original_source, corrected_source)
|
|
508
|
+
return unless original_source
|
|
509
|
+
|
|
510
|
+
new_source = @options[:stdin] || corrected_source
|
|
511
|
+
# The original source is the file as it is on disk, so the corrected one
|
|
512
|
+
# has to go through the same line ending conversion `File.write` would
|
|
513
|
+
# apply, or on Windows every single line reads as changed.
|
|
514
|
+
new_source = new_source ? Util.emulate_write_read_cycle(new_source) : original_source
|
|
515
|
+
|
|
516
|
+
sources = (@diff_sources[file] ||= [original_source])
|
|
517
|
+
sources[1] = new_source
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
def inspect_iteration(processed_source)
|
|
521
|
+
team = mobilize_team(processed_source)
|
|
522
|
+
team.defer_corrections = @options[:diff] || in_memory_corrections_possible?
|
|
523
|
+
offenses, updated_source_file = inspect_file(processed_source, team)
|
|
524
|
+
[team, offenses, updated_source_file]
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
# Custom ruby extractors may derive their fragments from the file on
|
|
528
|
+
# disk rather than from the passed processed source, so corrections can
|
|
529
|
+
# only be kept in memory when the default extractor is used.
|
|
530
|
+
def in_memory_corrections_possible?
|
|
531
|
+
self.class.ruby_extractors.one?
|
|
306
532
|
end
|
|
307
533
|
|
|
308
534
|
def iterate_until_no_changes(source, offenses_by_iteration)
|
|
@@ -346,16 +572,9 @@ module RuboCop
|
|
|
346
572
|
|
|
347
573
|
def inspect_file(processed_source, team = mobilize_team(processed_source))
|
|
348
574
|
extracted_ruby_sources = extract_ruby_sources(processed_source)
|
|
349
|
-
offenses = extracted_ruby_sources
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
offset: extracted_ruby_source[:offset],
|
|
353
|
-
original: processed_source
|
|
354
|
-
)
|
|
355
|
-
@errors.concat(team.errors)
|
|
356
|
-
@warnings.concat(team.warnings)
|
|
357
|
-
report.offenses
|
|
358
|
-
end
|
|
575
|
+
offenses = team.investigate_fragments(extracted_ruby_sources, original: processed_source)
|
|
576
|
+
@errors.concat(team.errors)
|
|
577
|
+
@warnings.concat(team.warnings)
|
|
359
578
|
[offenses, team.updated_source_file?]
|
|
360
579
|
end
|
|
361
580
|
|
|
@@ -375,30 +594,41 @@ module RuboCop
|
|
|
375
594
|
|
|
376
595
|
def mobilize_team(processed_source)
|
|
377
596
|
config = @config_store.for_file(processed_source.path)
|
|
378
|
-
|
|
597
|
+
@inspection_team_by_config ||= {}.compare_by_identity
|
|
598
|
+
@inspection_team_by_config[config] ||= assemble_team(config)
|
|
379
599
|
end
|
|
380
600
|
|
|
381
|
-
def mobilized_cop_classes(config)
|
|
601
|
+
def mobilized_cop_classes(config)
|
|
382
602
|
@mobilized_cop_classes ||= {}.compare_by_identity
|
|
383
603
|
@mobilized_cop_classes[config] ||= begin
|
|
384
|
-
cop_classes = Cop::Registry.all
|
|
385
|
-
|
|
386
604
|
# `@options[:only]` and `@options[:except]` are not qualified until
|
|
387
|
-
# needed so that the
|
|
388
|
-
#
|
|
605
|
+
# needed so that the registry contains any cops added by `require`s,
|
|
606
|
+
# which register eagerly when their files are loaded.
|
|
389
607
|
qualify_option_cop_names
|
|
390
608
|
|
|
391
609
|
OptionsValidator.new(@options).validate_cop_options
|
|
392
610
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
611
|
+
# Filtering by badge keeps lazy-loaded cops unloaded; only the cops
|
|
612
|
+
# that survive the filter and are enabled will be loaded.
|
|
613
|
+
Cop::Registry.global.filter_by_badge(@options) { |badge| mobilize_cop_badge?(badge, config) }
|
|
614
|
+
end
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
# Lets a runner that is reused from run to run pick up a different `--only`
|
|
618
|
+
# or `--except`.
|
|
619
|
+
def forget_mobilized_cops
|
|
620
|
+
@mobilized_cop_classes = nil
|
|
621
|
+
end
|
|
398
622
|
|
|
399
|
-
|
|
623
|
+
def mobilize_cop_badge?(badge, config)
|
|
624
|
+
return false if badge.department == :Test
|
|
625
|
+
return false if badge.match_name?(@options[:except])
|
|
400
626
|
|
|
401
|
-
|
|
627
|
+
if @options[:only]
|
|
628
|
+
badge.match_name?(@options[:only])
|
|
629
|
+
else
|
|
630
|
+
# use only cops that link to a style guide if requested.
|
|
631
|
+
!style_guide_cops_only?(config) || config.for_cop(badge.to_s)['StyleGuide']
|
|
402
632
|
end
|
|
403
633
|
end
|
|
404
634
|
|
|
@@ -406,19 +636,12 @@ module RuboCop
|
|
|
406
636
|
%i[only except].each do |option|
|
|
407
637
|
next unless @options[option]
|
|
408
638
|
|
|
409
|
-
@options[option].map
|
|
639
|
+
@options[option] = @options[option].map do |cop_name|
|
|
410
640
|
Cop::Registry.qualified_cop_name(cop_name, "--#{option} option")
|
|
411
641
|
end
|
|
412
642
|
end
|
|
413
643
|
end
|
|
414
644
|
|
|
415
|
-
def filter_cop_classes(cop_classes, config)
|
|
416
|
-
# use only cops that link to a style guide if requested
|
|
417
|
-
return unless style_guide_cops_only?(config)
|
|
418
|
-
|
|
419
|
-
cop_classes.select! { |cop| config.for_cop(cop)['StyleGuide'] }
|
|
420
|
-
end
|
|
421
|
-
|
|
422
645
|
def style_guide_cops_only?(config)
|
|
423
646
|
@options[:only_guide_cops] || config.for_all_cops['StyleGuideCopsOnly']
|
|
424
647
|
end
|
|
@@ -454,7 +677,28 @@ module RuboCop
|
|
|
454
677
|
end
|
|
455
678
|
|
|
456
679
|
def offenses_to_report(offenses)
|
|
457
|
-
offenses.select { |o| offense_displayed?(o) }
|
|
680
|
+
offenses = offenses.select { |o| offense_displayed?(o) }
|
|
681
|
+
offenses = offense_limit.filter(offenses) if offense_limit
|
|
682
|
+
offenses
|
|
683
|
+
end
|
|
684
|
+
|
|
685
|
+
# Files are reported in order, so which offenses survive the limit does not
|
|
686
|
+
# depend on how the run was parallelized.
|
|
687
|
+
def offense_limit
|
|
688
|
+
return @offense_limit if defined?(@offense_limit)
|
|
689
|
+
|
|
690
|
+
max = @options[:max_offenses_per_cop]
|
|
691
|
+
@offense_limit = (OffenseLimit.new(max.to_i) if max)
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
def warn_about_elided_offenses
|
|
695
|
+
elided = offense_limit&.elided_per_cop
|
|
696
|
+
return unless elided&.any?
|
|
697
|
+
|
|
698
|
+
warn Rainbow(
|
|
699
|
+
"#{elided.values.sum} more offenses were not reported because of " \
|
|
700
|
+
"--max-offenses-per-cop=#{offense_limit.max} (#{elided.keys.join(', ')})."
|
|
701
|
+
).yellow
|
|
458
702
|
end
|
|
459
703
|
|
|
460
704
|
def supports_safe_autocorrect?(offense)
|
|
@@ -474,22 +718,24 @@ module RuboCop
|
|
|
474
718
|
end
|
|
475
719
|
|
|
476
720
|
def minimum_severity_to_fail
|
|
477
|
-
@minimum_severity_to_fail ||=
|
|
478
|
-
|
|
479
|
-
name = @options[:fail_level] || :refactor
|
|
480
|
-
|
|
481
|
-
# autocorrect is a fake level - use the default
|
|
482
|
-
RuboCop::Cop::Severity.new(name == :autocorrect ? :refactor : name)
|
|
483
|
-
end
|
|
721
|
+
@minimum_severity_to_fail ||=
|
|
722
|
+
RuboCop::Cop::Severity.minimum_to_fail(@options, @config_store.for_pwd)
|
|
484
723
|
end
|
|
485
724
|
|
|
486
|
-
# rubocop:disable Metrics/MethodLength
|
|
487
|
-
def get_processed_source(file, prism_result)
|
|
725
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
726
|
+
def get_processed_source(file, prism_result, source: nil)
|
|
488
727
|
config = @config_store.for_file(file)
|
|
489
728
|
ruby_version = config.target_ruby_version
|
|
490
729
|
parser_engine = config.parser_engine
|
|
491
730
|
|
|
492
|
-
processed_source = if
|
|
731
|
+
processed_source = if source
|
|
732
|
+
ProcessedSource.new(
|
|
733
|
+
Util.emulate_write_read_cycle(source),
|
|
734
|
+
ruby_version,
|
|
735
|
+
file,
|
|
736
|
+
parser_engine: parser_engine
|
|
737
|
+
)
|
|
738
|
+
elsif @options[:stdin]
|
|
493
739
|
ProcessedSource.new(
|
|
494
740
|
@options[:stdin],
|
|
495
741
|
ruby_version,
|
|
@@ -510,16 +756,26 @@ module RuboCop
|
|
|
510
756
|
processed_source.registry = mobilized_cop_classes(config)
|
|
511
757
|
processed_source
|
|
512
758
|
end
|
|
513
|
-
# rubocop:enable Metrics/MethodLength
|
|
514
759
|
|
|
515
760
|
# A Cop::Team instance is stateful and may change when inspecting.
|
|
516
761
|
# The "standby" team for a given config is an initialized but
|
|
517
762
|
# otherwise dormant team that can be used for config- and option-
|
|
518
763
|
# level caching in ResultCache.
|
|
519
764
|
def standby_team(config)
|
|
520
|
-
@
|
|
521
|
-
@
|
|
522
|
-
|
|
765
|
+
@standby_team_by_config ||= {}.compare_by_identity
|
|
766
|
+
@standby_team_by_config[config] ||= assemble_team(config)
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
def assemble_team(config)
|
|
770
|
+
team = Cop::Team.mobilize(mobilized_cop_classes(config), config, @options)
|
|
771
|
+
|
|
772
|
+
if @project_index
|
|
773
|
+
team.cops.each do |cop|
|
|
774
|
+
cop.project_index = @project_index
|
|
775
|
+
end
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
team
|
|
523
779
|
end
|
|
524
780
|
end
|
|
525
781
|
end
|