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
|
@@ -7,16 +7,21 @@ module RuboCop
|
|
|
7
7
|
# or documentation base url by default.
|
|
8
8
|
# @api private
|
|
9
9
|
class ShowDocsUrl < Base
|
|
10
|
+
include CopNames
|
|
11
|
+
|
|
10
12
|
self.command_name = :show_docs_url
|
|
11
13
|
|
|
12
14
|
def initialize(env)
|
|
13
15
|
super
|
|
14
16
|
|
|
15
|
-
@config = @config_store.for(
|
|
17
|
+
@config = @config_store.for(PathUtil.pwd)
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
def run
|
|
19
21
|
print_documentation_url
|
|
22
|
+
# Checked after printing, so a typo alongside good names still gives
|
|
23
|
+
# you the urls you asked for.
|
|
24
|
+
validate_cop_names!(cops_array)
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
private
|
|
@@ -24,11 +29,8 @@ module RuboCop
|
|
|
24
29
|
def print_documentation_url
|
|
25
30
|
puts Cop::Documentation.default_base_url if cops_array.empty?
|
|
26
31
|
|
|
27
|
-
cops_array.each do |
|
|
28
|
-
|
|
29
|
-
next if cop.empty?
|
|
30
|
-
|
|
31
|
-
url = Cop::Documentation.url_for(cop.first, @config)
|
|
32
|
+
known_cop_classes(cops_array).each do |cop|
|
|
33
|
+
url = Cop::Documentation.url_for(cop, @config)
|
|
32
34
|
puts url if url
|
|
33
35
|
end
|
|
34
36
|
|
|
@@ -38,10 +40,6 @@ module RuboCop
|
|
|
38
40
|
def cops_array
|
|
39
41
|
@cops_array ||= @options[:show_docs_url]
|
|
40
42
|
end
|
|
41
|
-
|
|
42
|
-
def registry_hash
|
|
43
|
-
@registry_hash ||= Cop::Registry.global.to_h
|
|
44
|
-
end
|
|
45
43
|
end
|
|
46
44
|
end
|
|
47
45
|
end
|
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
|
60
60
|
def print_opt_out_instruction
|
|
61
61
|
puts
|
|
62
62
|
puts 'You can opt out of this message by adding the following to your config ' \
|
|
63
|
-
'(see https://docs.rubocop.org/rubocop/
|
|
63
|
+
'(see https://docs.rubocop.org/rubocop/plugins.html#plugin-suggestions ' \
|
|
64
64
|
'for more options):'
|
|
65
65
|
puts ' AllCops:'
|
|
66
66
|
puts ' SuggestExtensions: false'
|
data/lib/rubocop/cli.rb
CHANGED
|
@@ -13,7 +13,8 @@ module RuboCop
|
|
|
13
13
|
DEFAULT_PARALLEL_OPTIONS = %i[
|
|
14
14
|
color config debug display_style_guide display_time display_only_fail_level_offenses
|
|
15
15
|
display_only_failed editor_mode except extra_details fail_level fix_layout format formatters
|
|
16
|
-
ignore_disable_comments lint only only_guide_cops require
|
|
16
|
+
ignore_disable_comments lint max_offenses_per_cop only only_guide_cops out preview require
|
|
17
|
+
safe
|
|
17
18
|
autocorrect safe_autocorrect autocorrect_all
|
|
18
19
|
].freeze
|
|
19
20
|
|
|
@@ -35,7 +36,7 @@ module RuboCop
|
|
|
35
36
|
# @param args [Array<String>] command line arguments
|
|
36
37
|
# @return [Integer] UNIX exit code
|
|
37
38
|
#
|
|
38
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
39
|
+
# rubocop:disable-next Metrics/MethodLength, Metrics/AbcSize
|
|
39
40
|
def run(args = ARGV)
|
|
40
41
|
time_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
41
42
|
|
|
@@ -66,7 +67,7 @@ module RuboCop
|
|
|
66
67
|
STATUS_INTERRUPTED
|
|
67
68
|
rescue Finished
|
|
68
69
|
STATUS_SUCCESS
|
|
69
|
-
rescue OptionParser::
|
|
70
|
+
rescue OptionParser::ParseError => e
|
|
70
71
|
warn e.message
|
|
71
72
|
warn 'For usage information, use --help'
|
|
72
73
|
STATUS_ERROR
|
|
@@ -76,13 +77,14 @@ module RuboCop
|
|
|
76
77
|
STATUS_ERROR
|
|
77
78
|
ensure
|
|
78
79
|
elapsed_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) - time_start
|
|
79
|
-
|
|
80
|
+
if @options[:debug] || @options[:display_time]
|
|
81
|
+
puts "Finished in #{elapsed_time.round(5)} seconds"
|
|
82
|
+
end
|
|
80
83
|
end
|
|
81
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
82
84
|
|
|
83
85
|
private
|
|
84
86
|
|
|
85
|
-
# rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
|
87
|
+
# rubocop:disable-next Metrics/MethodLength, Metrics/AbcSize
|
|
86
88
|
def profile_if_needed
|
|
87
89
|
return yield unless @options[:profile]
|
|
88
90
|
|
|
@@ -114,7 +116,6 @@ module RuboCop
|
|
|
114
116
|
end
|
|
115
117
|
status
|
|
116
118
|
end
|
|
117
|
-
# rubocop:enable Metrics/MethodLength, Metrics/AbcSize
|
|
118
119
|
|
|
119
120
|
def require_gem(name)
|
|
120
121
|
require name
|
|
@@ -165,6 +166,10 @@ module RuboCop
|
|
|
165
166
|
handle_editor_mode
|
|
166
167
|
|
|
167
168
|
@config_store.apply_options!(@options)
|
|
169
|
+
# Set cache root after apply_options! to ensure force_default_config is applied first.
|
|
170
|
+
early_cache_root = ConfigLoader.cache_root(@options[:cache_root])
|
|
171
|
+
ConfigLoader.cache_root = ResultCache.cache_root(@config_store, @options[:cache_root])
|
|
172
|
+
warn_if_cache_root_changed(early_cache_root, ConfigLoader.cache_root)
|
|
168
173
|
|
|
169
174
|
handle_exiting_options
|
|
170
175
|
|
|
@@ -179,10 +184,18 @@ module RuboCop
|
|
|
179
184
|
|
|
180
185
|
def set_options_to_config_loader
|
|
181
186
|
ConfigLoader.debug = @options[:debug]
|
|
182
|
-
ConfigLoader.disable_pending_cops = @options[:disable_pending_cops]
|
|
183
|
-
ConfigLoader.enable_pending_cops = @options[:enable_pending_cops]
|
|
184
187
|
ConfigLoader.ignore_parent_exclusion = @options[:ignore_parent_exclusion]
|
|
185
188
|
ConfigLoader.ignore_unrecognized_cops = @options[:ignore_unrecognized_cops]
|
|
189
|
+
set_cop_selection_options_to_config_loader
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Options that decide which cops run, as opposed to how configuration is loaded.
|
|
193
|
+
def set_cop_selection_options_to_config_loader
|
|
194
|
+
ConfigLoader.disable_pending_cops = @options[:disable_pending_cops]
|
|
195
|
+
ConfigLoader.enable_pending_cops = @options[:enable_pending_cops]
|
|
196
|
+
ConfigLoader.enabled_by_default = @options[:enable_all_cops]
|
|
197
|
+
ConfigLoader.disabled_by_default = @options[:disable_all_cops]
|
|
198
|
+
ConfigLoader.preview = @options[:preview]
|
|
186
199
|
end
|
|
187
200
|
|
|
188
201
|
def set_options_to_pending_cops_reporter
|
|
@@ -194,17 +207,15 @@ module RuboCop
|
|
|
194
207
|
RuboCop::LSP.enable if @options[:editor_mode]
|
|
195
208
|
end
|
|
196
209
|
|
|
197
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
198
210
|
def handle_exiting_options
|
|
199
211
|
return unless Options::EXITING_OPTIONS.any? { |o| @options.key? o }
|
|
200
212
|
|
|
201
213
|
run_command(:version) if @options[:version] || @options[:verbose_version]
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
214
|
+
%i[show_cops list_enabled_cops_for show_docs_url explain lsp mcp].each do |name|
|
|
215
|
+
run_command(name) if @options[name]
|
|
216
|
+
end
|
|
205
217
|
raise Finished
|
|
206
218
|
end
|
|
207
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
208
219
|
|
|
209
220
|
def apply_default_formatter
|
|
210
221
|
# This must be done after the options have already been processed,
|
|
@@ -223,5 +234,21 @@ module RuboCop
|
|
|
223
234
|
def report_pending_cops
|
|
224
235
|
PendingCopsReporter.warn_if_needed(@config_store.for_pwd)
|
|
225
236
|
end
|
|
237
|
+
|
|
238
|
+
def warn_if_cache_root_changed(early, desired)
|
|
239
|
+
return if early == desired
|
|
240
|
+
# Normalize paths to avoid false positives from symlink resolution differences
|
|
241
|
+
if File.exist?(early) && File.exist?(desired) &&
|
|
242
|
+
File.realpath(early) == File.realpath(desired)
|
|
243
|
+
return
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
warn Rainbow(
|
|
247
|
+
"Warning: Remote configuration cache files were stored in `#{early}` " \
|
|
248
|
+
"because a desired cache root (`#{desired}`) was not set at the top level. " \
|
|
249
|
+
'Consider setting `AllCops: CacheRootDirectory` in your toplevel configuration file, ' \
|
|
250
|
+
'using the `RUBOCOP_CACHE_ROOT` environment variable, or using CLI options.'
|
|
251
|
+
).yellow
|
|
252
|
+
end
|
|
226
253
|
end
|
|
227
254
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CommentConfig
|
|
5
|
+
# A disabled line range that remembers the directive comment that opened
|
|
6
|
+
# it. Value-equal to a plain `Range`, so consumers comparing or hashing
|
|
7
|
+
# ranges are unaffected.
|
|
8
|
+
# @api private
|
|
9
|
+
class DirectiveRange < Range
|
|
10
|
+
attr_reader :directive
|
|
11
|
+
|
|
12
|
+
def initialize(first_line, last_line, directive)
|
|
13
|
+
super(first_line, last_line)
|
|
14
|
+
@directive = directive
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# The per-cop state accumulated while analyzing directives: the disabled
|
|
19
|
+
# ranges so far, plus the line and directive of the currently open
|
|
20
|
+
# disable, if any.
|
|
21
|
+
# @api private
|
|
22
|
+
CopAnalysis = Struct.new(:line_ranges, :start_line_number, :start_directive) do
|
|
23
|
+
# The open range (if any) closed at the given line, appended to the
|
|
24
|
+
# accumulated ranges, each remembering the directive that opened it.
|
|
25
|
+
# Closing above the opening line (e.g. a `pop` directly below a
|
|
26
|
+
# statement whose disable a `next +Cop` suspended) yields no range.
|
|
27
|
+
def close(line)
|
|
28
|
+
return line_ranges if !start_line_number || line < start_line_number
|
|
29
|
+
|
|
30
|
+
line_ranges + [DirectiveRange.new(start_line_number, line, start_directive)]
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CommentConfig
|
|
5
|
+
# Handling of next-statement directives (`disable-next`, `todo-next` and
|
|
6
|
+
# `next`): computing the statement scope they apply to and tracking
|
|
7
|
+
# directives that attached to nothing.
|
|
8
|
+
# The scope is the whole statement starting on the next line bearing
|
|
9
|
+
# code. Comment-only lines between the directive and the code chain (so
|
|
10
|
+
# several directives can stack), while a blank line breaks the attachment.
|
|
11
|
+
# @api private
|
|
12
|
+
module DisableNext
|
|
13
|
+
# Next-statement directives that affect nothing: nothing follows
|
|
14
|
+
# them, or they sit at the end of a code line.
|
|
15
|
+
def detached_next_directives
|
|
16
|
+
cop_disabled_line_ranges # ensure the analysis that collects them ran
|
|
17
|
+
@detached_next_directives
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# The line range of the statement a `disable-next` directive on the
|
|
21
|
+
# given line scopes to (or would scope to), or `nil` when no statement
|
|
22
|
+
# is attached. A directive is only honored on a comment-only line.
|
|
23
|
+
# Stacked directives share the target, so the computation is memoized.
|
|
24
|
+
# @api private
|
|
25
|
+
def statement_scope_after(line)
|
|
26
|
+
return nil unless comment_only_line?(line)
|
|
27
|
+
|
|
28
|
+
code_line = attached_code_line(line)
|
|
29
|
+
return nil unless code_line
|
|
30
|
+
|
|
31
|
+
(@statement_bounds ||= {})[code_line] ||= statement_bounds_at(code_line)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def apply_disable_next(analyses, directive)
|
|
37
|
+
bounds = statement_scope_after(directive.line_number)
|
|
38
|
+
return @detached_next_directives << directive unless bounds
|
|
39
|
+
|
|
40
|
+
range = DirectiveRange.new(bounds.begin, bounds.end, directive)
|
|
41
|
+
directive.cop_names.each do |cop_name|
|
|
42
|
+
add_next_range(analyses, qualified_cop_name(cop_name), range)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def add_next_range(analyses, cop_name, range)
|
|
47
|
+
analysis = analyses[cop_name]
|
|
48
|
+
analyses[cop_name] = CopAnalysis.new(analysis.line_ranges + [range],
|
|
49
|
+
analysis.start_line_number, analysis.start_directive)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Applies a `next` directive: `-` cops are disabled for the attached
|
|
53
|
+
# statement (exactly like `disable-next`), `+` cops have any open
|
|
54
|
+
# disable suspended for it. The `resolved_cops` come pre-expanded and
|
|
55
|
+
# qualified, mirroring `push`.
|
|
56
|
+
def apply_next_directive(analyses, resolved_cops, directive)
|
|
57
|
+
bounds = statement_scope_after(directive.line_number)
|
|
58
|
+
return @detached_next_directives << directive unless bounds
|
|
59
|
+
|
|
60
|
+
range = DirectiveRange.new(bounds.begin, bounds.end, directive)
|
|
61
|
+
resolved_cops.each do |op, cops|
|
|
62
|
+
cops.each do |cop|
|
|
63
|
+
if op == '-'
|
|
64
|
+
add_next_range(analyses, cop, range)
|
|
65
|
+
else
|
|
66
|
+
suspend_disable(analyses, cop, bounds)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Applies an `enable-next` directive: every listed cop (departments
|
|
73
|
+
# and `all` included) has any open disable suspended for the attached
|
|
74
|
+
# statement.
|
|
75
|
+
def apply_enable_next(analyses, directive)
|
|
76
|
+
bounds = statement_scope_after(directive.line_number)
|
|
77
|
+
return @detached_next_directives << directive unless bounds
|
|
78
|
+
|
|
79
|
+
directive.cop_names.each do |cop_name|
|
|
80
|
+
suspend_disable(analyses, qualified_cop_name(cop_name), bounds)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Punches a statement-sized hole into the currently open disable of the
|
|
85
|
+
# cop (whether opened by a directive or injected for a config-disabled
|
|
86
|
+
# cop): the open range closes just above the statement and reopens
|
|
87
|
+
# right below it, still attributed to its opening directive. Aligned
|
|
88
|
+
# with `push`, a `+` for a cop that is not disabled is a no-op.
|
|
89
|
+
def suspend_disable(analyses, cop, bounds)
|
|
90
|
+
analysis = analyses[cop]
|
|
91
|
+
return unless analysis.start_line_number
|
|
92
|
+
|
|
93
|
+
analyses[cop] = CopAnalysis.new(analysis.close(bounds.begin - 1),
|
|
94
|
+
bounds.end + 1, analysis.start_directive)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def attached_code_line(directive_line)
|
|
98
|
+
((directive_line + 1)..processed_source.lines.size).each do |line|
|
|
99
|
+
return line unless comment_only_line?(line)
|
|
100
|
+
return nil if processed_source[line - 1].blank?
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
nil
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def statement_bounds_at(line)
|
|
107
|
+
statement = statement_starting_at(line)
|
|
108
|
+
# A code line where no statement starts (e.g. a lone `end`) scopes
|
|
109
|
+
# the directive to that line alone.
|
|
110
|
+
return (line..line) unless statement
|
|
111
|
+
|
|
112
|
+
(line..statement_end_line(statement))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def statement_start_line?(node, line)
|
|
116
|
+
# Synthetic nodes (e.g. parentheses-less argument lists) have no
|
|
117
|
+
# source range. `begin` nodes are sequences of statements, not
|
|
118
|
+
# statements themselves - taking one would scope the directive to
|
|
119
|
+
# everything up to the last statement of the sequence.
|
|
120
|
+
node.source_range && node.first_line == line && !node.begin_type?
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def statement_starting_at(line)
|
|
124
|
+
ast = processed_source.ast
|
|
125
|
+
return nil unless ast
|
|
126
|
+
|
|
127
|
+
ast.each_node.select { |node| statement_start_line?(node, line) }.max_by(&:last_line)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def statement_end_line(statement)
|
|
131
|
+
statement.each_node.filter_map do |node|
|
|
132
|
+
next unless node.source_range
|
|
133
|
+
|
|
134
|
+
heredoc?(node) ? node.loc.heredoc_end.line : node.last_line
|
|
135
|
+
end.max
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def heredoc?(node)
|
|
139
|
+
node.respond_to?(:heredoc?) && node.heredoc?
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
class CommentConfig
|
|
5
|
+
# Handling of `push`/`pop` directives and their signed cop arguments:
|
|
6
|
+
# saving and restoring the per-cop analysis state, and resolving the
|
|
7
|
+
# `+`/`-` argument lists (shared with the `next` directive).
|
|
8
|
+
# @api private
|
|
9
|
+
module PushPop
|
|
10
|
+
private
|
|
11
|
+
|
|
12
|
+
def resolve_push_cops(directive)
|
|
13
|
+
directive.push_args.transform_values do |names|
|
|
14
|
+
names.flat_map { |name| expand_cop_name(name) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def expand_cop_name(name)
|
|
19
|
+
registry = Cop::Registry.global
|
|
20
|
+
cops = registry.department?(name) ? registry.names_for_department(name) : [name]
|
|
21
|
+
cops.map { |c| qualified_cop_name(c) }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def apply_push(analyses, resolved_cops, directive)
|
|
25
|
+
resolved_cops.each do |op, cops|
|
|
26
|
+
cops.each { |cop| apply_cop_op(analyses, op, cop, directive) }
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def apply_cop_op(analyses, operation, cop, directive)
|
|
31
|
+
analysis = analyses[cop]
|
|
32
|
+
line = directive.line_number
|
|
33
|
+
if operation == '-' && !analysis.start_line_number
|
|
34
|
+
analyses[cop] = CopAnalysis.new(analysis.line_ranges, line, directive)
|
|
35
|
+
elsif operation == '+' && analysis.start_line_number
|
|
36
|
+
analyses[cop] = CopAnalysis.new(analysis.close(line), nil)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def pop_state(analyses, line)
|
|
41
|
+
restore_point = @stack.pop
|
|
42
|
+
(restore_point.keys | analyses.keys).each do |cop|
|
|
43
|
+
analyses[cop] = popped_analysis(analyses[cop], restore_point[cop], line)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def popped_analysis(current, restored, line)
|
|
48
|
+
ranges = current.close(line - 1)
|
|
49
|
+
return CopAnalysis.new(ranges, nil) unless restored&.start_line_number
|
|
50
|
+
|
|
51
|
+
CopAnalysis.new(ranges, line, restored.start_directive)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
|
5
5
|
# and provides a way to check if each cop is enabled at arbitrary line.
|
|
6
6
|
class CommentConfig
|
|
7
7
|
extend SimpleForwardable
|
|
8
|
+
include DisableNext
|
|
9
|
+
include PushPop
|
|
8
10
|
|
|
9
11
|
CONFIG_DISABLED_LINE_RANGE_MIN = -Float::INFINITY
|
|
10
12
|
|
|
@@ -25,8 +27,6 @@ module RuboCop
|
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
|
|
28
|
-
CopAnalysis = Struct.new(:line_ranges, :start_line_number)
|
|
29
|
-
|
|
30
30
|
attr_reader :processed_source
|
|
31
31
|
|
|
32
32
|
def_delegators :@processed_source, :config, :registry
|
|
@@ -34,14 +34,26 @@ module RuboCop
|
|
|
34
34
|
def initialize(processed_source)
|
|
35
35
|
@processed_source = processed_source
|
|
36
36
|
@no_directives = !processed_source.raw_source.include?('rubocop')
|
|
37
|
+
@stack = []
|
|
38
|
+
@detached_next_directives = []
|
|
37
39
|
end
|
|
38
40
|
|
|
39
41
|
def cop_enabled_at_line?(cop, line_number)
|
|
42
|
+
cop_enabled_at_lines?(cop, line_number, line_number)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Whether the cop is enabled for all of the given line span. The cop
|
|
46
|
+
# counts as disabled for the span when any of its disabled ranges
|
|
47
|
+
# overlaps it, so that a directive on any line of a multi-line offense
|
|
48
|
+
# suppresses the offense.
|
|
49
|
+
def cop_enabled_at_lines?(cop, first_line, last_line)
|
|
40
50
|
cop = cop.cop_name if cop.respond_to?(:cop_name)
|
|
41
51
|
disabled_line_ranges = cop_disabled_line_ranges[cop]
|
|
42
52
|
return true unless disabled_line_ranges
|
|
43
53
|
|
|
44
|
-
disabled_line_ranges.none?
|
|
54
|
+
disabled_line_ranges.none? do |range|
|
|
55
|
+
range.end >= first_line && range.begin <= last_line
|
|
56
|
+
end
|
|
45
57
|
end
|
|
46
58
|
|
|
47
59
|
def cop_opted_in?(cop)
|
|
@@ -54,8 +66,8 @@ module RuboCop
|
|
|
54
66
|
|
|
55
67
|
def extra_enabled_comments
|
|
56
68
|
disable_count = Hash.new(0)
|
|
57
|
-
registry.
|
|
58
|
-
disable_count[
|
|
69
|
+
registry.disabled_names(config).each do |cop_name|
|
|
70
|
+
disable_count[cop_name] += 1
|
|
59
71
|
end
|
|
60
72
|
extra_enabled_comments_with_names(extras: Hash.new { |h, k| h[k] = [] }, names: disable_count)
|
|
61
73
|
end
|
|
@@ -64,11 +76,29 @@ module RuboCop
|
|
|
64
76
|
non_comment_token_line_numbers.none?(line_number)
|
|
65
77
|
end
|
|
66
78
|
|
|
79
|
+
# The names of the cops that are opted in by an `enable` comment directive
|
|
80
|
+
# or a `+` argument of a `push`/`next` directive, used to mobilize cops
|
|
81
|
+
# disabled in the config on demand. Departments are expanded for the
|
|
82
|
+
# opt-in forms only: a plain `enable` naming a department usually just
|
|
83
|
+
# closes a `disable` of it, and expanding it would switch on every
|
|
84
|
+
# config-disabled cop of the department for the rest of the file.
|
|
85
|
+
#
|
|
86
|
+
# @api private
|
|
87
|
+
# @return [Set<String>]
|
|
88
|
+
def opt_in_cops
|
|
89
|
+
@opt_in_cops ||= begin
|
|
90
|
+
cops = Set.new
|
|
91
|
+
each_directive { |directive| cops.merge(opted_in_by(directive)) }
|
|
92
|
+
cops
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
67
96
|
private
|
|
68
97
|
|
|
69
98
|
def extra_enabled_comments_with_names(extras:, names:)
|
|
70
99
|
each_directive do |directive|
|
|
71
100
|
next unless comment_only_line?(directive.line_number)
|
|
101
|
+
next if self_closing_directive?(directive)
|
|
72
102
|
|
|
73
103
|
if directive.enabled_all?
|
|
74
104
|
handle_enable_all(directive, names, extras)
|
|
@@ -80,43 +110,59 @@ module RuboCop
|
|
|
80
110
|
extras
|
|
81
111
|
end
|
|
82
112
|
|
|
83
|
-
def
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
cops
|
|
113
|
+
def opted_in_by(directive)
|
|
114
|
+
if directive.push? || directive.next?
|
|
115
|
+
directive.signed_args.fetch('+', []).flat_map { |name| expand_cop_name(name) }
|
|
116
|
+
elsif !directive.enabled? || directive.all_cops?
|
|
117
|
+
[]
|
|
118
|
+
elsif directive.enable_next?
|
|
119
|
+
directive.cop_names
|
|
120
|
+
else
|
|
121
|
+
directive.raw_cop_names
|
|
93
122
|
end
|
|
94
123
|
end
|
|
95
124
|
|
|
96
|
-
|
|
125
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
126
|
+
def analyze
|
|
97
127
|
return {} if @no_directives
|
|
98
128
|
|
|
99
129
|
analyses = Hash.new { |hash, key| hash[key] = CopAnalysis.new([], nil) }
|
|
100
130
|
inject_disabled_cops_directives(analyses)
|
|
101
131
|
|
|
102
132
|
each_directive do |directive|
|
|
103
|
-
directive.
|
|
104
|
-
|
|
105
|
-
|
|
133
|
+
if directive.push?
|
|
134
|
+
restore_point = analyses.transform_values(&:dup)
|
|
135
|
+
@stack.push(restore_point)
|
|
136
|
+
apply_push(analyses, resolve_push_cops(directive), directive)
|
|
137
|
+
elsif directive.pop?
|
|
138
|
+
pop_state(analyses, directive.line_number) if @stack.any?
|
|
139
|
+
elsif directive.disable_next?
|
|
140
|
+
apply_disable_next(analyses, directive)
|
|
141
|
+
elsif directive.next?
|
|
142
|
+
apply_next_directive(analyses, resolve_push_cops(directive), directive)
|
|
143
|
+
elsif directive.enable_next?
|
|
144
|
+
apply_enable_next(analyses, directive)
|
|
145
|
+
else
|
|
146
|
+
directive.cop_names.each do |cop_name|
|
|
147
|
+
cop_name = qualified_cop_name(cop_name)
|
|
148
|
+
analyses[cop_name] = analyze_cop(analyses[cop_name], directive)
|
|
149
|
+
end
|
|
106
150
|
end
|
|
107
151
|
end
|
|
108
152
|
|
|
109
153
|
analyses.each_with_object({}) do |element, hash|
|
|
110
154
|
cop_name, analysis = *element
|
|
155
|
+
next if prevent_directive_disabling?(cop_name)
|
|
156
|
+
|
|
111
157
|
hash[cop_name] = cop_line_ranges(analysis)
|
|
112
158
|
end
|
|
113
159
|
end
|
|
114
160
|
|
|
115
161
|
def inject_disabled_cops_directives(analyses)
|
|
116
|
-
registry.
|
|
117
|
-
analyses[
|
|
118
|
-
analyses[
|
|
119
|
-
DirectiveComment.new(ConfigDisabledCopDirectiveComment.new(
|
|
162
|
+
registry.disabled_names(config).each do |cop_name|
|
|
163
|
+
analyses[cop_name] = analyze_cop(
|
|
164
|
+
analyses[cop_name],
|
|
165
|
+
DirectiveComment.new(ConfigDisabledCopDirectiveComment.new(cop_name))
|
|
120
166
|
)
|
|
121
167
|
end
|
|
122
168
|
end
|
|
@@ -136,35 +182,21 @@ module RuboCop
|
|
|
136
182
|
return analysis unless directive.disabled?
|
|
137
183
|
|
|
138
184
|
line = directive.line_number
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
185
|
+
range = DirectiveRange.new(line, line, directive)
|
|
186
|
+
CopAnalysis.new(analysis.line_ranges + [range], analysis.start_line_number,
|
|
187
|
+
analysis.start_directive)
|
|
142
188
|
end
|
|
143
189
|
|
|
144
190
|
def analyze_disabled(analysis, directive)
|
|
145
|
-
|
|
146
|
-
start_line = analysis.start_line_number
|
|
147
|
-
|
|
148
|
-
# Cop already disabled on this line, so we end the current disabled
|
|
149
|
-
# range before we start a new range.
|
|
150
|
-
return CopAnalysis.new(analysis.line_ranges + [start_line..line], line) if start_line
|
|
151
|
-
|
|
152
|
-
CopAnalysis.new(analysis.line_ranges, line)
|
|
191
|
+
CopAnalysis.new(analysis.close(directive.line_number), directive.line_number, directive)
|
|
153
192
|
end
|
|
154
193
|
|
|
155
194
|
def analyze_rest(analysis, directive)
|
|
156
|
-
|
|
157
|
-
start_line = analysis.start_line_number
|
|
158
|
-
|
|
159
|
-
return CopAnalysis.new(analysis.line_ranges + [start_line..line], nil) if start_line
|
|
160
|
-
|
|
161
|
-
CopAnalysis.new(analysis.line_ranges, nil)
|
|
195
|
+
CopAnalysis.new(analysis.close(directive.line_number), nil)
|
|
162
196
|
end
|
|
163
197
|
|
|
164
198
|
def cop_line_ranges(analysis)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
analysis.line_ranges + [(analysis.start_line_number..Float::INFINITY)]
|
|
199
|
+
analysis.close(Float::INFINITY)
|
|
168
200
|
end
|
|
169
201
|
|
|
170
202
|
def each_directive
|
|
@@ -176,8 +208,29 @@ module RuboCop
|
|
|
176
208
|
end
|
|
177
209
|
end
|
|
178
210
|
|
|
211
|
+
# Push/pop and next-statement directives close themselves, so they
|
|
212
|
+
# play no part in the disable/enable pairing.
|
|
213
|
+
def self_closing_directive?(directive)
|
|
214
|
+
directive.push? || directive.pop? || directive.disable_next? ||
|
|
215
|
+
directive.next? || directive.enable_next?
|
|
216
|
+
end
|
|
217
|
+
|
|
179
218
|
def qualified_cop_name(cop_name)
|
|
180
|
-
|
|
219
|
+
# A directive naming a cop under the wrong department is not honored -
|
|
220
|
+
# the mistake is surfaced by `Lint/RedundantCopDisableDirective` (with a
|
|
221
|
+
# did-you-mean hint) instead of a stderr warning that is easy to miss
|
|
222
|
+
# and disappears entirely on cached runs.
|
|
223
|
+
Cop::Registry.qualified_cop_name(cop_name.strip, processed_source.file_path,
|
|
224
|
+
correct_namespace: false)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# `Style/DisableCopsWithinSourceCodeDirective` cannot be disabled via
|
|
228
|
+
# directive comments when it is explicitly enabled with `Enabled: true`.
|
|
229
|
+
# This prevents users from bypassing the cop by writing a disable
|
|
230
|
+
# directive that targets this cop itself.
|
|
231
|
+
def prevent_directive_disabling?(cop_name)
|
|
232
|
+
cop_name == DirectiveComment::STYLE_DISABLE_COPS_DIRECTIVE_COP &&
|
|
233
|
+
config.dig(cop_name, 'Enabled') == true
|
|
181
234
|
end
|
|
182
235
|
|
|
183
236
|
def non_comment_token_line_numbers
|