rubocop 1.71.1 → 1.92.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +885 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +50 -5
- data/lib/rubocop/changed_files.rb +134 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- 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 +8 -2
- data/lib/rubocop/cli.rb +59 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +98 -45
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +75 -49
- data/lib/rubocop/config_loader_resolver.rb +124 -33
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +9 -1
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +75 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +43 -17
- data/lib/rubocop/cop/badge.rb +9 -1
- 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 +2 -11
- 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 +92 -11
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +22 -7
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +29 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +73 -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/attribute_assignment.rb +91 -0
- 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 +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -9
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +16 -20
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_context_config_parameter.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +1 -7
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +86 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +28 -10
- data/lib/rubocop/cop/layout/class_structure.rb +172 -36
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +14 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines.rb +5 -2
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +2 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +14 -3
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +23 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +20 -8
- data/lib/rubocop/cop/layout/extra_spacing.rb +109 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +57 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +25 -18
- 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 +20 -18
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +5 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +48 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +5 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +159 -12
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- 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 +201 -30
- 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 +11 -1
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +63 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +7 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +259 -40
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +4 -0
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +111 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +29 -9
- 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 +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +10 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +20 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +5 -1
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +55 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +32 -8
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +3 -11
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +22 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +152 -11
- 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 +60 -23
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +20 -11
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +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_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +54 -11
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +63 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +68 -22
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/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 +3 -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 +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +7 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +44 -23
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +10 -8
- data/lib/rubocop/cop/mixin/code_length.rb +10 -2
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +13 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_body_help.rb +69 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +59 -17
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +52 -25
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/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 +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +10 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +2 -2
- data/lib/rubocop/cop/mixin/pattern_matching_help.rb +35 -0
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- 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 +16 -5
- 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 +66 -10
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +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 +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/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 +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +65 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +108 -9
- data/lib/rubocop/cop/registry.rb +234 -65
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +45 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +54 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- 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 +6 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +52 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +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 +13 -5
- data/lib/rubocop/cop/style/block_delimiters.rb +71 -40
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +12 -11
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +179 -27
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +19 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +88 -9
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +53 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +58 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +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 +14 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +12 -3
- data/lib/rubocop/cop/style/empty_method.rb +15 -9
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +252 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +52 -8
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +62 -9
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +43 -15
- data/lib/rubocop/cop/style/for.rb +48 -1
- data/lib/rubocop/cop/style/format_string.rb +44 -9
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +5 -3
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +41 -24
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +52 -16
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +128 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +23 -6
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +39 -11
- data/lib/rubocop/cop/style/if_inside_else.rb +46 -21
- data/lib/rubocop/cop/style/if_unless_modifier.rb +90 -66
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +19 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +61 -8
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +34 -8
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +150 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +23 -11
- data/lib/rubocop/cop/style/lambda.rb +30 -1
- data/lib/rubocop/cop/style/lambda_call.rb +31 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +6 -4
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +75 -24
- 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 +58 -6
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +36 -8
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- 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_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +47 -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 +15 -22
- 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 +139 -13
- 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 +68 -10
- data/lib/rubocop/cop/style/nil_comparison.rb +53 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +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/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +35 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +18 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +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_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +58 -6
- data/lib/rubocop/cop/style/redundant_condition.rb +93 -18
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +22 -4
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +11 -11
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +12 -3
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +176 -83
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +15 -0
- 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 +16 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +107 -29
- data/lib/rubocop/cop/style/require_order.rb +9 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +10 -12
- data/lib/rubocop/cop/style/return_nil.rb +19 -4
- 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 +76 -20
- 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 +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +13 -16
- data/lib/rubocop/cop/style/semicolon.rb +56 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +28 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +32 -6
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +38 -16
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +7 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +34 -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 +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +35 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +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 +172 -49
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +8 -4
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +42 -11
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/base_formatter.rb +22 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +7 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +82 -7
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +5 -4
- data/lib/rubocop/formatter/pacman_formatter.rb +5 -2
- 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 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +66 -15
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +38 -19
- data/lib/rubocop/lsp.rb +5 -2
- data/lib/rubocop/magic_comment.rb +55 -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 +166 -23
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +153 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +18 -13
- data/lib/rubocop/result_cache.rb +110 -65
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +368 -106
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/util.rb +69 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +35 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +129 -21
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -3,15 +3,18 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Lint
|
|
6
|
-
# Checks for `raise` or `fail` statements which
|
|
7
|
-
#
|
|
6
|
+
# Checks for `raise` or `fail` statements which raise `Exception` or
|
|
7
|
+
# `Exception.new`. Use `StandardError` or a specific exception class instead.
|
|
8
8
|
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
9
|
+
# If you have defined your own namespaced `Exception` class, it is possible
|
|
10
|
+
# to configure the cop to allow it by setting `AllowedImplicitNamespaces` to
|
|
11
|
+
# an array with the names of the namespaces to allow. By default, this is set to
|
|
12
|
+
# `['Gem']`, which allows `Gem::Exception` to be raised without an explicit namespace.
|
|
13
|
+
# If not allowed, a false positive may be registered if `raise Exception` is called
|
|
14
|
+
# within the namespace.
|
|
15
|
+
#
|
|
16
|
+
# Alternatively, use a fully qualified name with `raise`/`fail`
|
|
17
|
+
# (eg. `raise Namespace::Exception`).
|
|
15
18
|
#
|
|
16
19
|
# @safety
|
|
17
20
|
# This cop is unsafe because it will change the exception class being
|
|
@@ -20,15 +23,31 @@ module RuboCop
|
|
|
20
23
|
# @example
|
|
21
24
|
# # bad
|
|
22
25
|
# raise Exception, 'Error message here'
|
|
26
|
+
# raise Exception.new('Error message here')
|
|
23
27
|
#
|
|
24
28
|
# # good
|
|
25
29
|
# raise StandardError, 'Error message here'
|
|
30
|
+
# raise MyError.new, 'Error message here'
|
|
31
|
+
#
|
|
32
|
+
# @example AllowedImplicitNamespaces: ['Gem'] (default)
|
|
33
|
+
# # bad - `Foo` is not an allowed implicit namespace
|
|
34
|
+
# module Foo
|
|
35
|
+
# def self.foo
|
|
36
|
+
# raise Exception # This is qualified to `Foo::Exception`.
|
|
37
|
+
# end
|
|
38
|
+
# end
|
|
26
39
|
#
|
|
27
|
-
# @example AllowedImplicitNamespaces: ['Gem']
|
|
28
40
|
# # good
|
|
29
41
|
# module Gem
|
|
30
42
|
# def self.foo
|
|
31
|
-
# raise Exception # This
|
|
43
|
+
# raise Exception # This is qualified to `Gem::Exception`.
|
|
44
|
+
# end
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
# # good
|
|
48
|
+
# module Foo
|
|
49
|
+
# def self.foo
|
|
50
|
+
# raise Foo::Exception
|
|
32
51
|
# end
|
|
33
52
|
# end
|
|
34
53
|
class RaiseException < Base
|
|
@@ -76,7 +95,7 @@ module RuboCop
|
|
|
76
95
|
if parent.module_type?
|
|
77
96
|
namespace = parent.identifier.source
|
|
78
97
|
|
|
79
|
-
return allow_implicit_namespaces.include?(namespace)
|
|
98
|
+
return true if allow_implicit_namespaces.include?(namespace)
|
|
80
99
|
end
|
|
81
100
|
|
|
82
101
|
implicit_namespace?(parent)
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
# The Lint/RedundantCopDisableDirective cop needs to be disabled so as
|
|
4
4
|
# to be able to provide a (bad) example of a redundant disable.
|
|
5
|
-
# rubocop:disable Lint/RedundantCopDisableDirective
|
|
5
|
+
# rubocop:disable-next Lint/RedundantCopDisableDirective -- the examples below read as real directives
|
|
6
6
|
module RuboCop
|
|
7
7
|
module Cop
|
|
8
8
|
module Lint
|
|
@@ -104,31 +104,104 @@ module RuboCop
|
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def each_redundant_disable(&block)
|
|
107
|
+
each_detached_next_directive(&block)
|
|
108
|
+
|
|
107
109
|
cop_disabled_line_ranges.each do |cop, line_ranges|
|
|
110
|
+
# A pending cop that is not enabled in this run produces no
|
|
111
|
+
# offenses, so its directives cannot be judged - they typically
|
|
112
|
+
# prepare the code for the moment the cop gets enabled.
|
|
113
|
+
next if pending_cop_not_run?(cop) || disabled_by_preview?(cop)
|
|
114
|
+
|
|
108
115
|
each_already_disabled(cop, line_ranges, &block)
|
|
109
116
|
each_line_range(cop, line_ranges, &block)
|
|
110
117
|
end
|
|
111
118
|
end
|
|
112
119
|
|
|
120
|
+
def pending_cop_not_run?(cop)
|
|
121
|
+
# `Config#for_cop` corrects wrongly-namespaced names, but a name that
|
|
122
|
+
# is not registered as written never suppresses anything, so it is
|
|
123
|
+
# reported as unknown rather than exempted via the corrected cop.
|
|
124
|
+
return false unless all_cop_names.include?(cop)
|
|
125
|
+
|
|
126
|
+
cop_cfg = config.for_cop(cop)
|
|
127
|
+
cop_cfg['Enabled'] == 'pending' &&
|
|
128
|
+
!processed_source.registry.enabled_pending_cop?(cop_cfg, config, cop)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# A cop that only the `Preview` defaults disable runs again as soon as
|
|
132
|
+
# preview is turned off, so its directives are still needed.
|
|
133
|
+
def disabled_by_preview?(cop)
|
|
134
|
+
return false unless preview? && all_cop_names.include?(cop)
|
|
135
|
+
|
|
136
|
+
preview_defaults = ConfigLoader.default_configuration[cop]&.fetch('Preview', nil)
|
|
137
|
+
return false unless preview_defaults.is_a?(Hash) && preview_defaults['Enabled'] == false
|
|
138
|
+
|
|
139
|
+
!config.cop_enabled?(cop)
|
|
140
|
+
end
|
|
141
|
+
|
|
113
142
|
def each_line_range(cop, line_ranges)
|
|
114
143
|
line_ranges.each_with_index do |line_range, line_range_index|
|
|
115
|
-
next if
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
redundant = if all_disabled?(comment)
|
|
120
|
-
find_redundant_all(line_range, line_ranges[line_range_index + 1])
|
|
121
|
-
elsif department_disabled?(cop, comment)
|
|
122
|
-
find_redundant_department(cop, line_range)
|
|
123
|
-
else
|
|
124
|
-
find_redundant_cop(cop, line_range)
|
|
125
|
-
end
|
|
144
|
+
next if should_skip_line_range?(cop, line_range)
|
|
145
|
+
|
|
146
|
+
comment = directive_comment(line_range)
|
|
147
|
+
next if skip_directive?(comment)
|
|
126
148
|
|
|
149
|
+
next_range = line_ranges[line_range_index + 1]
|
|
150
|
+
redundant = find_redundant_directive(cop, comment, line_range, next_range)
|
|
127
151
|
yield comment, redundant if redundant
|
|
128
152
|
end
|
|
129
153
|
end
|
|
130
154
|
|
|
131
|
-
|
|
155
|
+
def should_skip_line_range?(cop, line_range)
|
|
156
|
+
ignore_offense?(line_range) || expected_final_disable?(cop, line_range)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
# A range opened by a `disable-next` directive starts at the statement,
|
|
160
|
+
# not at the directive comment above it, so ask the range itself.
|
|
161
|
+
def directive_comment(line_range)
|
|
162
|
+
if line_range.respond_to?(:directive)
|
|
163
|
+
line_range.directive.comment
|
|
164
|
+
else
|
|
165
|
+
processed_source.comment_at_line(line_range.begin)
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# A next-statement directive with no statement attached (or misplaced
|
|
170
|
+
# at the end of a code line) affects nothing, so it is redundant by
|
|
171
|
+
# definition.
|
|
172
|
+
def each_detached_next_directive
|
|
173
|
+
processed_source.comment_config.detached_next_directives.each do |directive|
|
|
174
|
+
names = if directive.next?
|
|
175
|
+
directive.signed_args.values.flatten
|
|
176
|
+
else
|
|
177
|
+
directive.raw_cop_names
|
|
178
|
+
end
|
|
179
|
+
names.each { |cop| yield directive.comment, cop }
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def skip_directive?(comment)
|
|
184
|
+
# A cop disabled in the configuration is represented by a synthetic directive that
|
|
185
|
+
# has no comment in the source, so there is nothing to report or to remove.
|
|
186
|
+
# Its range starts at `CONFIG_DISABLED_LINE_RANGE_MIN` and runs to the end of the file,
|
|
187
|
+
# but a `pop` splits it, and the pieces in between are bounded on both sides.
|
|
188
|
+
return true if comment.is_a?(CommentConfig::ConfigDisabledCopDirectiveComment)
|
|
189
|
+
|
|
190
|
+
directive = DirectiveComment.new(comment)
|
|
191
|
+
directive.push? || directive.pop? || directive.next?
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def find_redundant_directive(cop, comment, line_range, next_range)
|
|
195
|
+
if all_disabled?(comment)
|
|
196
|
+
find_redundant_all(line_range, next_range)
|
|
197
|
+
elsif department_disabled?(cop, comment)
|
|
198
|
+
find_redundant_department(cop, line_range)
|
|
199
|
+
else
|
|
200
|
+
find_redundant_cop(cop, line_range)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
132
205
|
def each_already_disabled(cop, line_ranges)
|
|
133
206
|
line_ranges.each_cons(2) do |previous_range, range|
|
|
134
207
|
next if ignore_offense?(range)
|
|
@@ -138,13 +211,13 @@ module RuboCop
|
|
|
138
211
|
# whether there are offenses or not.
|
|
139
212
|
next unless followed_ranges?(previous_range, range)
|
|
140
213
|
|
|
141
|
-
comment =
|
|
214
|
+
comment = directive_comment(range)
|
|
142
215
|
|
|
143
|
-
next
|
|
144
|
-
#
|
|
145
|
-
# to disable a few select cops first and then all cops
|
|
146
|
-
# down in the code.
|
|
147
|
-
next if all_disabled?(comment)
|
|
216
|
+
# `push`/`next` signed arguments are not analyzed for redundancy
|
|
217
|
+
# (yet), and comments disabling all cops don't count since it's
|
|
218
|
+
# reasonable to disable a few select cops first and then all cops
|
|
219
|
+
# further down in the code.
|
|
220
|
+
next if comment.nil? || skip_directive?(comment) || all_disabled?(comment)
|
|
148
221
|
|
|
149
222
|
redundant =
|
|
150
223
|
if department_disabled?(cop, comment)
|
|
@@ -156,7 +229,6 @@ module RuboCop
|
|
|
156
229
|
yield comment, redundant if redundant
|
|
157
230
|
end
|
|
158
231
|
end
|
|
159
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
160
232
|
|
|
161
233
|
def find_redundant_cop(cop, range)
|
|
162
234
|
cop_offenses = offenses_to_check.select { |offense| offense.cop_name == cop }
|
|
@@ -184,7 +256,11 @@ module RuboCop
|
|
|
184
256
|
end
|
|
185
257
|
|
|
186
258
|
def range_with_offense?(range, offenses = offenses_to_check)
|
|
187
|
-
|
|
259
|
+
# An offense is covered when the disabled range overlaps any line of
|
|
260
|
+
# its span, mirroring how offenses are suppressed.
|
|
261
|
+
offenses.none? do |offense|
|
|
262
|
+
offense.line <= range.end && offense.location.last_line >= range.begin
|
|
263
|
+
end
|
|
188
264
|
end
|
|
189
265
|
|
|
190
266
|
def all_disabled?(comment)
|
|
@@ -227,17 +303,33 @@ module RuboCop
|
|
|
227
303
|
end
|
|
228
304
|
|
|
229
305
|
def add_offense_for_entire_comment(comment, cops)
|
|
230
|
-
|
|
306
|
+
directive = DirectiveComment.new(comment)
|
|
307
|
+
location = directive.range
|
|
231
308
|
cop_names = cops.sort.map { |c| describe(c) }.join(', ')
|
|
232
309
|
|
|
233
|
-
|
|
234
|
-
|
|
310
|
+
# An unknown cop may just not be loaded in this run (e.g. a custom
|
|
311
|
+
# cop whose configuration failed to load) - removing its directive
|
|
312
|
+
# would destroy something that cannot be restored, so only report.
|
|
313
|
+
# A misplaced EOL `disable-next` should be moved, not deleted.
|
|
314
|
+
message = message(cop_names, enabling: directive.enable_next?)
|
|
315
|
+
if any_unknown_cop?(cops) || misplaced_next_directive?(comment)
|
|
316
|
+
return add_offense(location, message: message)
|
|
317
|
+
end
|
|
235
318
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
319
|
+
add_offense(location, message: message) do |corrector|
|
|
320
|
+
remove_entire_comment(corrector, comment)
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def remove_entire_comment(corrector, comment)
|
|
325
|
+
# Take the `--` reason with the directive; `leave_free_comment?` keeps anything else.
|
|
326
|
+
directive_range = DirectiveComment.new(comment).range_with_reason
|
|
327
|
+
range = comment_range_with_surrounding_space(directive_range, comment.source_range)
|
|
328
|
+
|
|
329
|
+
if leave_free_comment?(comment, range)
|
|
330
|
+
corrector.replace(range, ' # ')
|
|
331
|
+
else
|
|
332
|
+
corrector.remove(range)
|
|
241
333
|
end
|
|
242
334
|
end
|
|
243
335
|
|
|
@@ -247,14 +339,35 @@ module RuboCop
|
|
|
247
339
|
ranges = cop_ranges.map { |_, r| r }
|
|
248
340
|
|
|
249
341
|
cop_ranges.each do |cop, range|
|
|
250
|
-
|
|
251
|
-
add_offense(range, message: message(cop_name)) do |corrector|
|
|
252
|
-
range = directive_range_in_list(range, ranges)
|
|
253
|
-
corrector.remove(range)
|
|
254
|
-
end
|
|
342
|
+
add_offense_for_cop_in_list(cop, range, ranges)
|
|
255
343
|
end
|
|
256
344
|
end
|
|
257
345
|
|
|
346
|
+
def add_offense_for_cop_in_list(cop, range, ranges)
|
|
347
|
+
cop_name = describe(cop)
|
|
348
|
+
return add_offense(range, message: message(cop_name)) if unknown_cop?(cop)
|
|
349
|
+
|
|
350
|
+
add_offense(range, message: message(cop_name)) do |corrector|
|
|
351
|
+
corrector.remove(directive_range_in_list(range, ranges))
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def any_unknown_cop?(cops)
|
|
356
|
+
cops.any? { |cop| unknown_cop?(cop) }
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
def misplaced_next_directive?(comment)
|
|
360
|
+
directive = DirectiveComment.new(comment)
|
|
361
|
+
(directive.disable_next? || directive.next? || directive.enable_next?) &&
|
|
362
|
+
!processed_source.comment_config.comment_only_line?(directive.line_number)
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def unknown_cop?(cop)
|
|
366
|
+
return false if cop == 'all' || department_marker?(cop)
|
|
367
|
+
|
|
368
|
+
!all_cop_names.include?(cop)
|
|
369
|
+
end
|
|
370
|
+
|
|
258
371
|
def leave_free_comment?(comment, range)
|
|
259
372
|
free_comment = comment.text.gsub(range.source.strip, '')
|
|
260
373
|
|
|
@@ -269,7 +382,10 @@ module RuboCop
|
|
|
269
382
|
end
|
|
270
383
|
|
|
271
384
|
def matching_range(haystack, needle)
|
|
272
|
-
|
|
385
|
+
# Match the cop name as a whole token so a shorter name is not found inside a
|
|
386
|
+
# longer one that shares its prefix (e.g. `Lint/AmbiguousOperator` in
|
|
387
|
+
# `Lint/AmbiguousOperatorPrecedence`).
|
|
388
|
+
offset = haystack.source.index(/#{Regexp.escape(needle)}(?!\w)/)
|
|
273
389
|
return unless offset
|
|
274
390
|
|
|
275
391
|
offset += haystack.begin_pos
|
|
@@ -286,7 +402,13 @@ module RuboCop
|
|
|
286
402
|
|
|
287
403
|
SIMILAR_COP_NAMES_CACHE = Hash.new do |hash, cop_name|
|
|
288
404
|
hash[:all_cop_names] = Registry.global.names unless hash.key?(:all_cop_names)
|
|
289
|
-
|
|
405
|
+
# A registered cop with the same base name is a better suggestion
|
|
406
|
+
# than anything spelling similarity can find - the most common
|
|
407
|
+
# mistake is qualifying a cop with the wrong department.
|
|
408
|
+
basename = "/#{cop_name.split('/').last}"
|
|
409
|
+
same_basename = hash[:all_cop_names].find { |name| name.end_with?(basename) }
|
|
410
|
+
hash[cop_name] =
|
|
411
|
+
same_basename || NameSimilarity.find_similar_name(cop_name, hash[:all_cop_names])
|
|
290
412
|
end
|
|
291
413
|
private_constant :SIMILAR_COP_NAMES_CACHE
|
|
292
414
|
|
|
@@ -299,8 +421,8 @@ module RuboCop
|
|
|
299
421
|
similar ? "`#{cop}` (did you mean `#{similar}`?)" : "`#{cop}` (unknown cop)"
|
|
300
422
|
end
|
|
301
423
|
|
|
302
|
-
def message(cop_names)
|
|
303
|
-
"Unnecessary disabling of #{cop_names}."
|
|
424
|
+
def message(cop_names, enabling: false)
|
|
425
|
+
"Unnecessary #{enabling ? 'enabling' : 'disabling'} of #{cop_names}."
|
|
304
426
|
end
|
|
305
427
|
|
|
306
428
|
def all_cop_names
|
|
@@ -327,4 +449,3 @@ module RuboCop
|
|
|
327
449
|
end
|
|
328
450
|
end
|
|
329
451
|
end
|
|
330
|
-
# rubocop:enable Lint/RedundantCopDisableDirective
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# The Lint/RedundantCopEnableDirective and Lint/RedundantCopDisableDirective
|
|
4
|
-
# cops need to be disabled so as to be able to provide a (bad) example of an
|
|
5
|
-
# unneeded enable.
|
|
6
|
-
|
|
7
|
-
# rubocop:disable Lint/RedundantCopEnableDirective
|
|
8
|
-
# rubocop:disable Lint/RedundantCopDisableDirective
|
|
9
3
|
module RuboCop
|
|
10
4
|
module Cop
|
|
11
5
|
module Lint
|
|
12
6
|
# Detects instances of rubocop:enable comments that can be
|
|
13
7
|
# removed.
|
|
14
8
|
#
|
|
15
|
-
# When comment enables all cops at once `rubocop:enable all`
|
|
16
|
-
#
|
|
9
|
+
# When a comment enables all cops at once `rubocop:enable all`
|
|
10
|
+
# the cop checks whether any cop was actually enabled.
|
|
17
11
|
#
|
|
18
12
|
# @example
|
|
19
13
|
#
|
|
@@ -36,21 +30,55 @@ module RuboCop
|
|
|
36
30
|
# foo = "1"
|
|
37
31
|
# # rubocop:enable all
|
|
38
32
|
# baz
|
|
33
|
+
#
|
|
34
|
+
# # bad
|
|
35
|
+
# foo = 1
|
|
36
|
+
# # rubocop:pop
|
|
37
|
+
#
|
|
38
|
+
# # good
|
|
39
|
+
# # rubocop:push -Style/StringLiterals
|
|
40
|
+
# foo = "1"
|
|
41
|
+
# # rubocop:pop
|
|
39
42
|
class RedundantCopEnableDirective < Base
|
|
40
43
|
include RangeHelp
|
|
41
44
|
include SurroundingSpace
|
|
42
45
|
extend AutoCorrector
|
|
43
46
|
|
|
44
47
|
MSG = 'Unnecessary enabling of %<cop>s.'
|
|
48
|
+
MSG_ORPHAN_POP = 'Unnecessary `rubocop:pop` without a matching `rubocop:push`.'
|
|
45
49
|
|
|
46
50
|
def on_new_investigation
|
|
47
|
-
return if processed_source.blank?
|
|
51
|
+
return if processed_source.blank?
|
|
52
|
+
|
|
53
|
+
source = processed_source.raw_source
|
|
54
|
+
check_extra_enables if source.include?('enable')
|
|
55
|
+
check_orphan_pops if source.include?('pop')
|
|
56
|
+
end
|
|
48
57
|
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def check_extra_enables
|
|
49
61
|
offenses = processed_source.comment_config.extra_enabled_comments
|
|
50
62
|
offenses.each { |comment, cop_names| register_offense(comment, cop_names) }
|
|
51
63
|
end
|
|
52
64
|
|
|
53
|
-
|
|
65
|
+
def check_orphan_pops
|
|
66
|
+
push_depth = 0
|
|
67
|
+
processed_source.comments.each do |comment|
|
|
68
|
+
directive = DirectiveComment.new(comment)
|
|
69
|
+
if directive.push?
|
|
70
|
+
push_depth += 1
|
|
71
|
+
elsif directive.pop?
|
|
72
|
+
push_depth.zero? ? register_orphan_pop(directive) : push_depth -= 1
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def register_orphan_pop(directive)
|
|
78
|
+
add_offense(directive.range, message: MSG_ORPHAN_POP) do |corrector|
|
|
79
|
+
corrector.remove(range_with_surrounding_space(directive.range, side: :right))
|
|
80
|
+
end
|
|
81
|
+
end
|
|
54
82
|
|
|
55
83
|
def register_offense(comment, cop_names)
|
|
56
84
|
directive = DirectiveComment.new(comment)
|
|
@@ -61,15 +89,21 @@ module RuboCop
|
|
|
61
89
|
range_of_offense(comment, name),
|
|
62
90
|
message: format(MSG, cop: all_or_name(name))
|
|
63
91
|
) do |corrector|
|
|
64
|
-
|
|
65
|
-
corrector.remove(range_with_surrounding_space(directive.range, side: :right))
|
|
66
|
-
else
|
|
67
|
-
corrector.remove(range_with_comma(comment, name))
|
|
68
|
-
end
|
|
92
|
+
corrector.remove(removal_range(directive, comment, cop_names, name))
|
|
69
93
|
end
|
|
70
94
|
end
|
|
71
95
|
end
|
|
72
96
|
|
|
97
|
+
# When every cop on the directive is redundant the whole comment goes, `--` reason
|
|
98
|
+
# included; otherwise just the one cop is spliced out of the list.
|
|
99
|
+
def removal_range(directive, comment, cop_names, name)
|
|
100
|
+
if directive.match?(cop_names)
|
|
101
|
+
range_with_surrounding_space(directive.range_with_reason, side: :right)
|
|
102
|
+
else
|
|
103
|
+
range_with_comma(comment, name)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
73
107
|
def range_of_offense(comment, name)
|
|
74
108
|
start_pos = comment_start(comment) + cop_name_indention(comment, name)
|
|
75
109
|
range_between(start_pos, start_pos + name.size)
|
|
@@ -80,7 +114,10 @@ module RuboCop
|
|
|
80
114
|
end
|
|
81
115
|
|
|
82
116
|
def cop_name_indention(comment, name)
|
|
83
|
-
|
|
117
|
+
# Match the cop name as a whole token so a shorter name is not found inside a
|
|
118
|
+
# longer one that shares its prefix (e.g. `Layout/EmptyLines` in
|
|
119
|
+
# `Layout/EmptyLinesAfterModuleInclusion`).
|
|
120
|
+
comment.text.index(/#{Regexp.escape(name)}(?!\w)/)
|
|
84
121
|
end
|
|
85
122
|
|
|
86
123
|
def range_with_comma(comment, name)
|
|
@@ -130,6 +167,3 @@ module RuboCop
|
|
|
130
167
|
end
|
|
131
168
|
end
|
|
132
169
|
end
|
|
133
|
-
|
|
134
|
-
# rubocop:enable Lint/RedundantCopDisableDirective
|
|
135
|
-
# rubocop:enable Lint/RedundantCopEnableDirective
|
|
@@ -28,6 +28,7 @@ module RuboCop
|
|
|
28
28
|
# end
|
|
29
29
|
#
|
|
30
30
|
class RedundantDirGlobSort < Base
|
|
31
|
+
include RangeHelp
|
|
31
32
|
extend AutoCorrector
|
|
32
33
|
extend TargetRubyVersion
|
|
33
34
|
|
|
@@ -38,24 +39,45 @@ module RuboCop
|
|
|
38
39
|
GLOB_METHODS = %i[glob []].freeze
|
|
39
40
|
|
|
40
41
|
def on_send(node)
|
|
41
|
-
return unless (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
return if multiple_argument?(receiver)
|
|
42
|
+
return unless dir_glob?(node.receiver)
|
|
43
|
+
# `sort` with a comparator block or block-pass changes the order, so it is
|
|
44
|
+
# not redundant with the default sorting performed by `Dir.glob`/`Dir[]`.
|
|
45
|
+
return if sort_with_comparator?(node) || multiple_argument?(node.receiver)
|
|
45
46
|
|
|
46
47
|
selector = node.loc.selector
|
|
47
48
|
|
|
48
49
|
add_offense(selector) do |corrector|
|
|
49
|
-
corrector.
|
|
50
|
-
corrector.remove(node.loc.dot)
|
|
50
|
+
autocorrect(corrector, node.loc.dot, selector)
|
|
51
51
|
end
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
private
|
|
55
55
|
|
|
56
|
+
def dir_glob?(receiver)
|
|
57
|
+
return false unless receiver&.receiver&.const_type?
|
|
58
|
+
return false unless receiver.receiver.short_name == :Dir
|
|
59
|
+
|
|
60
|
+
GLOB_METHODS.include?(receiver.method_name)
|
|
61
|
+
end
|
|
62
|
+
|
|
56
63
|
def multiple_argument?(glob_method)
|
|
57
64
|
glob_method.arguments.count >= 2 || glob_method.first_argument&.splat_type?
|
|
58
65
|
end
|
|
66
|
+
|
|
67
|
+
def sort_with_comparator?(node)
|
|
68
|
+
node.parent&.any_block_type? || node.last_argument&.block_pass_type?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def autocorrect(corrector, dot, selector)
|
|
72
|
+
range = dot.join(selector)
|
|
73
|
+
|
|
74
|
+
if processed_source.contains_comment?(range)
|
|
75
|
+
corrector.remove(dot)
|
|
76
|
+
corrector.remove(selector)
|
|
77
|
+
else
|
|
78
|
+
corrector.remove(range_with_surrounding_space(range, side: :left))
|
|
79
|
+
end
|
|
80
|
+
end
|
|
59
81
|
end
|
|
60
82
|
end
|
|
61
83
|
end
|
|
@@ -73,7 +73,7 @@ module RuboCop
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def redundant_group?(expr)
|
|
76
|
-
expr.is?(:passive, :group) && expr.
|
|
76
|
+
expr.is?(:passive, :group) && expr.one? { |child| child.type != :free_space }
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def redundantly_quantifiable?(node)
|
|
@@ -17,17 +17,13 @@ module RuboCop
|
|
|
17
17
|
# * 2.0+ ... `enumerator`
|
|
18
18
|
# * 2.1+ ... `thread`
|
|
19
19
|
# * 2.2+ ... Add `rational` and `complex` above
|
|
20
|
-
# * 2.5+ ... Add `pp` above
|
|
21
20
|
# * 2.7+ ... Add `ruby2_keywords` above
|
|
22
21
|
# * 3.1+ ... Add `fiber` above
|
|
23
|
-
# * 3.2+ ... `set`
|
|
22
|
+
# * 3.2+ ... Add `set` above
|
|
23
|
+
# * 4.0+ ... Add `pathname` above
|
|
24
24
|
#
|
|
25
25
|
# This cop target those features.
|
|
26
26
|
#
|
|
27
|
-
# @safety
|
|
28
|
-
# This cop's autocorrection is unsafe because if `require 'pp'` is removed from one file,
|
|
29
|
-
# `NameError` can be encountered when another file uses `PP.pp`.
|
|
30
|
-
#
|
|
31
27
|
# @example
|
|
32
28
|
# # bad
|
|
33
29
|
# require 'unloaded_feature'
|
|
@@ -42,10 +38,6 @@ module RuboCop
|
|
|
42
38
|
MSG = 'Remove unnecessary `require` statement.'
|
|
43
39
|
RESTRICT_ON_SEND = %i[require].freeze
|
|
44
40
|
RUBY_22_LOADED_FEATURES = %w[rational complex].freeze
|
|
45
|
-
PRETTY_PRINT_METHODS = %i[
|
|
46
|
-
pretty_inspect pretty_print pretty_print_cycle
|
|
47
|
-
pretty_print_inspect pretty_print_instance_variables
|
|
48
|
-
].freeze
|
|
49
41
|
|
|
50
42
|
# @!method redundant_require_statement?(node)
|
|
51
43
|
def_node_matcher :redundant_require_statement?, <<~PATTERN
|
|
@@ -53,11 +45,6 @@ module RuboCop
|
|
|
53
45
|
(str #redundant_feature?))
|
|
54
46
|
PATTERN
|
|
55
47
|
|
|
56
|
-
# @!method pp_const?(node)
|
|
57
|
-
def_node_matcher :pp_const?, <<~PATTERN
|
|
58
|
-
(const {nil? cbase} :PP)
|
|
59
|
-
PATTERN
|
|
60
|
-
|
|
61
48
|
def on_send(node)
|
|
62
49
|
return unless redundant_require_statement?(node)
|
|
63
50
|
|
|
@@ -76,22 +63,15 @@ module RuboCop
|
|
|
76
63
|
|
|
77
64
|
private
|
|
78
65
|
|
|
79
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
66
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
80
67
|
def redundant_feature?(feature_name)
|
|
81
68
|
feature_name == 'enumerator' ||
|
|
82
69
|
(target_ruby_version >= 2.1 && feature_name == 'thread') ||
|
|
83
70
|
(target_ruby_version >= 2.2 && RUBY_22_LOADED_FEATURES.include?(feature_name)) ||
|
|
84
|
-
(target_ruby_version >= 2.5 && feature_name == 'pp' && !need_to_require_pp?) ||
|
|
85
71
|
(target_ruby_version >= 2.7 && feature_name == 'ruby2_keywords') ||
|
|
86
72
|
(target_ruby_version >= 3.1 && feature_name == 'fiber') ||
|
|
87
|
-
(target_ruby_version >= 3.2 && feature_name == 'set')
|
|
88
|
-
|
|
89
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
90
|
-
|
|
91
|
-
def need_to_require_pp?
|
|
92
|
-
processed_source.ast.each_descendant(:send).any? do |node|
|
|
93
|
-
pp_const?(node.receiver) || PRETTY_PRINT_METHODS.include?(node.method_name)
|
|
94
|
-
end
|
|
73
|
+
(target_ruby_version >= 3.2 && feature_name == 'set') ||
|
|
74
|
+
(target_ruby_version >= 4.0 && feature_name == 'pathname')
|
|
95
75
|
end
|
|
96
76
|
end
|
|
97
77
|
end
|