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
data/lib/rubocop/config_store.rb
CHANGED
|
@@ -25,13 +25,18 @@ module RuboCop
|
|
|
25
25
|
@validated = true
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
def apply_options!(options)
|
|
29
|
+
self.options_config = options[:config] if options[:config]
|
|
30
|
+
force_default_config! if options[:force_default_config]
|
|
31
|
+
end
|
|
32
|
+
|
|
28
33
|
def options_config=(options_config)
|
|
29
34
|
loaded_config = ConfigLoader.load_file(options_config)
|
|
30
35
|
@options_config = ConfigLoader.merge_with_default(loaded_config, options_config)
|
|
31
36
|
end
|
|
32
37
|
|
|
33
38
|
def force_default_config!
|
|
34
|
-
@options_config = ConfigLoader.default_configuration
|
|
39
|
+
@options_config = ConfigLoader.apply_default_overrides(ConfigLoader.default_configuration)
|
|
35
40
|
end
|
|
36
41
|
|
|
37
42
|
def unvalidated
|
|
@@ -44,7 +49,7 @@ module RuboCop
|
|
|
44
49
|
end
|
|
45
50
|
|
|
46
51
|
def for_pwd
|
|
47
|
-
for_dir(
|
|
52
|
+
for_dir(PathUtil.pwd)
|
|
48
53
|
end
|
|
49
54
|
|
|
50
55
|
# If type (file/dir) is known beforehand,
|
|
@@ -3,23 +3,25 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
# Handles validation of configuration, for example cop names, parameter
|
|
5
5
|
# names, and Ruby versions.
|
|
6
|
-
# rubocop:disable Metrics/ClassLength
|
|
6
|
+
# rubocop:disable-next Metrics/ClassLength
|
|
7
7
|
class ConfigValidator
|
|
8
8
|
extend SimpleForwardable
|
|
9
9
|
|
|
10
10
|
# @api private
|
|
11
11
|
COMMON_PARAMS = %w[Exclude Include Severity inherit_mode AutoCorrect StyleGuide Details
|
|
12
|
-
Enabled].freeze
|
|
12
|
+
Enabled Reference References Safe SafeAutoCorrect].freeze
|
|
13
13
|
# @api private
|
|
14
|
-
INTERNAL_PARAMS = %w[Description StyleGuide
|
|
14
|
+
INTERNAL_PARAMS = %w[Description StyleGuide Preview
|
|
15
15
|
VersionAdded VersionChanged VersionRemoved
|
|
16
|
-
Reference Safe SafeAutoCorrect].freeze
|
|
16
|
+
Reference References Safe SafeAutoCorrect].freeze
|
|
17
17
|
# @api private
|
|
18
18
|
NEW_COPS_VALUES = %w[pending disable enable].freeze
|
|
19
|
+
# @api private
|
|
20
|
+
NEW_COPS_VERSION_PATTERN = /\A\d+(\.\d+)*\z/.freeze
|
|
19
21
|
|
|
20
22
|
# @api private
|
|
21
|
-
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect].to_set.freeze
|
|
22
|
-
CONFIG_CHECK_DEPARTMENTS = %w[pending override_department].freeze
|
|
23
|
+
CONFIG_CHECK_KEYS = %w[Enabled Safe SafeAutoCorrect AutoCorrect References].to_set.freeze
|
|
24
|
+
CONFIG_CHECK_DEPARTMENTS = %w[pending preview override_department].freeze
|
|
23
25
|
CONFIG_CHECK_AUTOCORRECTS = %w[always contextual disabled].freeze
|
|
24
26
|
private_constant :CONFIG_CHECK_KEYS, :CONFIG_CHECK_DEPARTMENTS
|
|
25
27
|
|
|
@@ -46,7 +48,7 @@ module RuboCop
|
|
|
46
48
|
|
|
47
49
|
check_obsoletions
|
|
48
50
|
alert_about_unrecognized_cops(invalid_cop_names)
|
|
49
|
-
|
|
51
|
+
validate_all_cops_parameters
|
|
50
52
|
validate_parameter_names(valid_cop_names)
|
|
51
53
|
validate_enforced_styles(valid_cop_names)
|
|
52
54
|
validate_syntax_cop
|
|
@@ -118,6 +120,7 @@ module RuboCop
|
|
|
118
120
|
invalid_cop_names.each do |name|
|
|
119
121
|
# There could be a custom cop with this name. If so, don't warn
|
|
120
122
|
next if Cop::Registry.global.contains_cop_matching?([name])
|
|
123
|
+
next if ConfigObsoletion.deprecated_cop_name?(name)
|
|
121
124
|
|
|
122
125
|
# Special case for inherit_mode, which is a directive that we keep in
|
|
123
126
|
# the configuration (even though it's not a cop), because it's easier
|
|
@@ -163,16 +166,74 @@ module RuboCop
|
|
|
163
166
|
end
|
|
164
167
|
|
|
165
168
|
def validate_new_cops_parameter
|
|
169
|
+
validate_all_cops_new_cops_parameter
|
|
170
|
+
validate_department_new_cops_parameters
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def validate_all_cops_parameters
|
|
174
|
+
validate_new_cops_parameter
|
|
175
|
+
validate_fail_level_parameter
|
|
176
|
+
validate_preview_parameter
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def validate_fail_level_parameter
|
|
180
|
+
fail_level = @config.for_all_cops['FailLevel']
|
|
181
|
+
return if fail_level.nil? || Cop::Severity::NAMES.include?(fail_level.to_sym)
|
|
182
|
+
|
|
183
|
+
message = "invalid #{fail_level} for `FailLevel` found in #{smart_loaded_path}\n" \
|
|
184
|
+
"Valid choices are: #{Cop::Severity::NAMES.join(', ')}"
|
|
185
|
+
|
|
186
|
+
raise ValidationError, message
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def validate_preview_parameter
|
|
190
|
+
preview = @config.for_all_cops['Preview']
|
|
191
|
+
return if [nil, true, false].include?(preview)
|
|
192
|
+
|
|
193
|
+
message = "invalid #{preview} for `Preview` found in #{smart_loaded_path}\n" \
|
|
194
|
+
'Valid choices are: true, false'
|
|
195
|
+
|
|
196
|
+
raise ValidationError, message
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def validate_all_cops_new_cops_parameter
|
|
166
200
|
new_cop_parameter = @config.for_all_cops['NewCops']
|
|
167
201
|
return if new_cop_parameter.nil? || NEW_COPS_VALUES.include?(new_cop_parameter)
|
|
168
202
|
|
|
169
|
-
message = "invalid #{new_cop_parameter} for `NewCops` found in" \
|
|
203
|
+
message = "invalid #{new_cop_parameter} for `NewCops` found in " \
|
|
170
204
|
"#{smart_loaded_path}\n" \
|
|
171
205
|
"Valid choices are: #{NEW_COPS_VALUES.join(', ')}"
|
|
172
206
|
|
|
173
207
|
raise ValidationError, message
|
|
174
208
|
end
|
|
175
209
|
|
|
210
|
+
def validate_department_new_cops_parameters
|
|
211
|
+
@config.each do |name, section|
|
|
212
|
+
value = new_cops_value_for_department(name, section)
|
|
213
|
+
next if value.nil? || NEW_COPS_VALUES.include?(value) || new_cops_version_value?(value)
|
|
214
|
+
|
|
215
|
+
raise ValidationError,
|
|
216
|
+
"invalid #{value} for `NewCops` found in #{smart_loaded_path}\n" \
|
|
217
|
+
"Valid choices for a department are: #{NEW_COPS_VALUES.join(', ')}, " \
|
|
218
|
+
"or a version string like '1.50'"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def new_cops_value_for_department(name, section)
|
|
223
|
+
return nil if name == 'AllCops' || !section.is_a?(Hash)
|
|
224
|
+
return nil unless Cop::Registry.global.department?(name)
|
|
225
|
+
|
|
226
|
+
section['NewCops']
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
def new_cops_version_value?(value)
|
|
230
|
+
case value
|
|
231
|
+
when Float, Integer then true
|
|
232
|
+
when String then NEW_COPS_VERSION_PATTERN.match?(value)
|
|
233
|
+
else false
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
176
237
|
def validate_parameter_shape(valid_cop_names)
|
|
177
238
|
valid_cop_names.each do |name|
|
|
178
239
|
if @config[name].nil?
|
|
@@ -206,6 +267,9 @@ module RuboCop
|
|
|
206
267
|
|
|
207
268
|
@config[cop_name].each_key do |param|
|
|
208
269
|
next if COMMON_PARAMS.include?(param) || default_config.key?(param)
|
|
270
|
+
# Departments shipped as top-level sections in an extension's default configuration accept
|
|
271
|
+
# `NewCops`, like any other department.
|
|
272
|
+
next if param == 'NewCops' && Cop::Registry.global.department?(cop_name)
|
|
209
273
|
|
|
210
274
|
supported_params = default_config.keys - INTERNAL_PARAMS
|
|
211
275
|
|
|
@@ -259,8 +323,7 @@ module RuboCop
|
|
|
259
323
|
end
|
|
260
324
|
end
|
|
261
325
|
|
|
262
|
-
# rubocop:disable Metrics/
|
|
263
|
-
def check_cop_config_value(hash, parent = nil)
|
|
326
|
+
def check_cop_config_value(hash, parent = nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
264
327
|
hash.each do |key, value|
|
|
265
328
|
check_cop_config_value(value, key) if value.is_a?(Hash)
|
|
266
329
|
|
|
@@ -270,6 +333,8 @@ module RuboCop
|
|
|
270
333
|
supposed_values = 'a boolean'
|
|
271
334
|
elsif key == 'AutoCorrect' && !CONFIG_CHECK_AUTOCORRECTS.include?(value)
|
|
272
335
|
supposed_values = '`always`, `contextual`, `disabled`, or a boolean'
|
|
336
|
+
elsif key == 'References'
|
|
337
|
+
supposed_values = 'an array of strings'
|
|
273
338
|
else
|
|
274
339
|
next
|
|
275
340
|
end
|
|
@@ -277,7 +342,6 @@ module RuboCop
|
|
|
277
342
|
raise ValidationError, param_error_message(parent, key, value, supposed_values)
|
|
278
343
|
end
|
|
279
344
|
end
|
|
280
|
-
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity
|
|
281
345
|
|
|
282
346
|
# FIXME: Handling colors in exception messages like this is ugly.
|
|
283
347
|
def param_error_message(parent, key, value, supposed_values)
|
|
@@ -286,5 +350,4 @@ module RuboCop
|
|
|
286
350
|
"is supposed to be #{supposed_values} and #{Rainbow(value).yellow} is not."
|
|
287
351
|
end
|
|
288
352
|
end
|
|
289
|
-
# rubocop:enable Metrics/ClassLength
|
|
290
353
|
end
|
|
@@ -12,6 +12,14 @@ module RuboCop
|
|
|
12
12
|
autocorrect_requested? && disable_uncorrectable? && autocorrect_enabled?
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Whether a correction exists but is skipped because it is unsafe in a
|
|
16
|
+
# safe autocorrect run, while `--disable-uncorrectable` asks for a todo
|
|
17
|
+
# comment on everything this run cannot correct.
|
|
18
|
+
def skipped_unsafe_correction_with_disable_uncorrectable?
|
|
19
|
+
autocorrect_requested? && disable_uncorrectable? &&
|
|
20
|
+
@options.fetch(:safe_autocorrect, false) && !safe_autocorrect?
|
|
21
|
+
end
|
|
22
|
+
|
|
15
23
|
def autocorrect_requested?
|
|
16
24
|
@options.fetch(:autocorrect, false)
|
|
17
25
|
end
|
|
@@ -32,12 +40,9 @@ module RuboCop
|
|
|
32
40
|
# allow turning off autocorrect on a cop by cop basis
|
|
33
41
|
return true unless cop_config
|
|
34
42
|
|
|
35
|
-
|
|
36
|
-
return false if ['disabled', false].include?(cop_config['AutoCorrect'])
|
|
43
|
+
return false if disabled_autocorrect?
|
|
37
44
|
|
|
38
|
-
|
|
39
|
-
# and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
40
|
-
return false if contextual_autocorrect? && LSP.enabled?
|
|
45
|
+
return false if contextual_autocorrect_held_back?
|
|
41
46
|
|
|
42
47
|
# :safe_autocorrect is a derived option based on several command-line
|
|
43
48
|
# arguments - see RuboCop::Options#add_autocorrection_options
|
|
@@ -48,9 +53,18 @@ module RuboCop
|
|
|
48
53
|
|
|
49
54
|
private
|
|
50
55
|
|
|
56
|
+
# When LSP is enabled or the `--editor-mode` option is on, it is considered as editing
|
|
57
|
+
# source code, and autocorrection with `AutoCorrect: contextual` will not be performed.
|
|
58
|
+
# The `editing` option says the same without the rest of LSP mode, which
|
|
59
|
+
# is about showing offenses in an editor.
|
|
60
|
+
def contextual_autocorrect_held_back?
|
|
61
|
+
contextual_autocorrect? && (LSP.enabled? || @options.fetch(:editing, false))
|
|
62
|
+
end
|
|
63
|
+
|
|
51
64
|
def disable_offense(offense_range)
|
|
52
65
|
unbreakable_range = multiline_ranges(offense_range)&.find do |range|
|
|
53
|
-
|
|
66
|
+
offense_range.overlaps?(range) &&
|
|
67
|
+
eol_comment_would_be_inside_literal?(offense_range, range)
|
|
54
68
|
end
|
|
55
69
|
|
|
56
70
|
if unbreakable_range
|
|
@@ -75,22 +89,28 @@ module RuboCop
|
|
|
75
89
|
end
|
|
76
90
|
|
|
77
91
|
def disable_offense_with_eol_or_surround_comment(range)
|
|
78
|
-
|
|
79
|
-
needed_line_length = (range.source_line + eol_comment).length
|
|
80
|
-
|
|
81
|
-
if needed_line_length <= max_line_length
|
|
82
|
-
disable_offense_at_end_of_line(range_of_first_line(range), eol_comment)
|
|
83
|
-
else
|
|
92
|
+
if line_with_eol_comment_too_long?(range)
|
|
84
93
|
disable_offense_before_and_after(range_by_lines(range))
|
|
94
|
+
else
|
|
95
|
+
disable_offense_at_end_of_line(range_of_first_line(range))
|
|
85
96
|
end
|
|
86
97
|
end
|
|
87
98
|
|
|
88
|
-
def
|
|
89
|
-
|
|
99
|
+
def eol_comment_would_be_inside_literal?(offense_range, literal_range)
|
|
100
|
+
return true if line_with_eol_comment_too_long?(offense_range)
|
|
101
|
+
|
|
102
|
+
offense_line = offense_range.line
|
|
103
|
+
offense_line >= literal_range.first_line && offense_line < literal_range.last_line
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def line_with_eol_comment_too_long?(range)
|
|
107
|
+
return false unless max_line_length
|
|
108
|
+
|
|
109
|
+
(range.source_line + eol_comment).length > max_line_length
|
|
90
110
|
end
|
|
91
111
|
|
|
92
112
|
def surrounding_heredoc?(node)
|
|
93
|
-
node.
|
|
113
|
+
node.any_str_type? && node.heredoc?
|
|
94
114
|
end
|
|
95
115
|
|
|
96
116
|
def heredoc_range(node)
|
|
@@ -102,7 +122,7 @@ module RuboCop
|
|
|
102
122
|
end
|
|
103
123
|
|
|
104
124
|
def string_continuation?(node)
|
|
105
|
-
node.
|
|
125
|
+
node.any_str_type? && node.source.match?(/\\\s*$/)
|
|
106
126
|
end
|
|
107
127
|
|
|
108
128
|
def multiline_string?(node)
|
|
@@ -129,13 +149,19 @@ module RuboCop
|
|
|
129
149
|
end
|
|
130
150
|
|
|
131
151
|
def max_line_length
|
|
152
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
|
153
|
+
|
|
132
154
|
config.for_cop('Layout/LineLength')['Max'] || 120
|
|
133
155
|
end
|
|
134
156
|
|
|
135
|
-
def disable_offense_at_end_of_line(range
|
|
157
|
+
def disable_offense_at_end_of_line(range)
|
|
136
158
|
Corrector.new(range).insert_after(range, eol_comment)
|
|
137
159
|
end
|
|
138
160
|
|
|
161
|
+
def eol_comment
|
|
162
|
+
" # rubocop:todo #{cop_name}"
|
|
163
|
+
end
|
|
164
|
+
|
|
139
165
|
def disable_offense_before_and_after(range_by_lines)
|
|
140
166
|
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
|
141
167
|
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
data/lib/rubocop/cop/badge.rb
CHANGED
|
@@ -45,13 +45,21 @@ module RuboCop
|
|
|
45
45
|
|
|
46
46
|
def hash
|
|
47
47
|
# Do hashing manually to reduce Array allocations.
|
|
48
|
-
department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash
|
|
48
|
+
department.hash ^ cop_name.hash # rubocop:disable Security/CompoundHash -- hashing manually avoids the Array allocation
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def match?(other)
|
|
52
52
|
cop_name == other.cop_name && (!qualified? || department == other.department)
|
|
53
53
|
end
|
|
54
54
|
|
|
55
|
+
# Returns true if the badge's qualified name or the badge's department
|
|
56
|
+
# matches any of the given names.
|
|
57
|
+
def match_name?(given_names)
|
|
58
|
+
return false unless given_names
|
|
59
|
+
|
|
60
|
+
given_names.include?(to_s) || given_names.include?(department_name)
|
|
61
|
+
end
|
|
62
|
+
|
|
55
63
|
def to_s
|
|
56
64
|
@to_s ||= qualified? ? "#{department}/#{cop_name}" : cop_name
|
|
57
65
|
end
|
data/lib/rubocop/cop/base.rb
CHANGED
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
include AutocorrectLogic
|
|
42
42
|
|
|
43
43
|
attr_reader :config, :processed_source
|
|
44
|
+
attr_accessor :project_index
|
|
44
45
|
|
|
45
46
|
# Reports of an investigation.
|
|
46
47
|
# Immutable
|
|
@@ -48,7 +49,12 @@ module RuboCop
|
|
|
48
49
|
InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
|
|
49
50
|
|
|
50
51
|
# List of methods names to restrict calls for `on_send` / `on_csend`
|
|
51
|
-
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend
|
|
52
|
+
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend -- the base class default, which cops override
|
|
53
|
+
|
|
54
|
+
# Departments whose cops report above `convention` unless a cop says
|
|
55
|
+
# otherwise. The exceptions live in `config/default.yml` as an explicit
|
|
56
|
+
# `Severity`, such as the lint-like cops in `Bundler` and `Gemspec`.
|
|
57
|
+
DEPARTMENT_SEVERITIES = { Lint: :warning, Security: :warning, Metrics: :refactor }.freeze
|
|
52
58
|
|
|
53
59
|
# List of cops that should not try to autocorrect at the same
|
|
54
60
|
# time as this cop
|
|
@@ -126,6 +132,8 @@ module RuboCop
|
|
|
126
132
|
# in the `on_new_investigation` callback.
|
|
127
133
|
# If your cop does autocorrections, be aware that your instance may be called
|
|
128
134
|
# multiple times with the same `processed_source.path` but different content.
|
|
135
|
+
# Note that under `--parallel` each worker process has its own cop
|
|
136
|
+
# instances, so state persists only within a worker's share of the files.
|
|
129
137
|
def self.support_multiple_source?
|
|
130
138
|
false
|
|
131
139
|
end
|
|
@@ -207,13 +215,9 @@ module RuboCop
|
|
|
207
215
|
severity = find_severity(range_to_pass, severity)
|
|
208
216
|
message = find_message(range_to_pass, message)
|
|
209
217
|
|
|
210
|
-
status, corrector =
|
|
211
|
-
|
|
212
|
-
# Since this range may be generated from Ruby code embedded in some
|
|
213
|
-
# template file, we convert it to location info in the original file.
|
|
214
|
-
range = range_for_original(range)
|
|
218
|
+
status, corrector = enabled_lines?(range) ? correct(range, &block) : :disabled
|
|
215
219
|
|
|
216
|
-
current_offenses <<
|
|
220
|
+
current_offenses << new_offense(range, severity, message, status, corrector)
|
|
217
221
|
end
|
|
218
222
|
|
|
219
223
|
# This method should be overridden when a cop's behavior depends
|
|
@@ -261,10 +265,21 @@ module RuboCop
|
|
|
261
265
|
@config.target_ruby_version
|
|
262
266
|
end
|
|
263
267
|
|
|
264
|
-
# Returns a
|
|
265
|
-
#
|
|
268
|
+
# Returns the version of a gem in the target, by default its locked version
|
|
269
|
+
# (i.e. from Gemfile.lock or gems.locked).
|
|
270
|
+
#
|
|
271
|
+
# The requirements declared with `requires_gem` are checked against the version
|
|
272
|
+
# this method returns, so an extension that lets users state the version of its
|
|
273
|
+
# gem in `AllCops` (e.g. `TargetFrameworkVersion`) can override it for that gem,
|
|
274
|
+
# returning a `Gem::Version`, and fall back to `super` for any other gem.
|
|
275
|
+
#
|
|
276
|
+
# @param [String] gem_name
|
|
277
|
+
# @return [Gem::Version, nil] The gem version, or nil if the gem is not present.
|
|
278
|
+
#
|
|
279
|
+
# @api public
|
|
266
280
|
def target_gem_version(gem_name)
|
|
267
|
-
|
|
281
|
+
gem_versions = @config.gem_versions_in_target
|
|
282
|
+
gem_versions && gem_versions[gem_name]
|
|
268
283
|
end
|
|
269
284
|
|
|
270
285
|
def parser_engine
|
|
@@ -283,6 +298,13 @@ module RuboCop
|
|
|
283
298
|
@config.string_literals_frozen_by_default?
|
|
284
299
|
end
|
|
285
300
|
|
|
301
|
+
# Whether the user opted in to unstable behavior, with `--preview` or
|
|
302
|
+
# `AllCops: Preview`. Cops branch on this to ship a change that is not
|
|
303
|
+
# ready to be the default yet.
|
|
304
|
+
def preview?
|
|
305
|
+
@config.preview?(@options)
|
|
306
|
+
end
|
|
307
|
+
|
|
286
308
|
def relevant_file?(file)
|
|
287
309
|
return false unless target_satisfies_all_gem_version_requirements?
|
|
288
310
|
return true unless @config.clusivity_config_for_badge?(self.class.badge)
|
|
@@ -306,7 +328,9 @@ module RuboCop
|
|
|
306
328
|
def ready
|
|
307
329
|
return self if self.class.support_multiple_source?
|
|
308
330
|
|
|
309
|
-
self.class.new(@config, @options)
|
|
331
|
+
self.class.new(@config, @options).tap do |fresh|
|
|
332
|
+
fresh.project_index = @project_index
|
|
333
|
+
end
|
|
310
334
|
end
|
|
311
335
|
|
|
312
336
|
### Reserved for Cop::Cop
|
|
@@ -319,7 +343,7 @@ module RuboCop
|
|
|
319
343
|
|
|
320
344
|
### Reserved for Commissioner
|
|
321
345
|
|
|
322
|
-
# rubocop:disable Layout/ClassStructure
|
|
346
|
+
# rubocop:disable Layout/ClassStructure -- grouped under the Commissioner heading above
|
|
323
347
|
# @api private
|
|
324
348
|
def callbacks_needed
|
|
325
349
|
self.class.callbacks_needed
|
|
@@ -328,12 +352,11 @@ module RuboCop
|
|
|
328
352
|
# @api private
|
|
329
353
|
def self.callbacks_needed
|
|
330
354
|
@callbacks_needed ||= public_instance_methods.select do |m|
|
|
331
|
-
# OPTIMIZE:
|
|
332
|
-
#
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
m.start_with?('on_', 'after_')
|
|
355
|
+
# OPTIMIZE: `start_with?` with two string arguments instead of a regex
|
|
356
|
+
# is faster in this specific case.
|
|
357
|
+
m.start_with?('on_', 'after_') &&
|
|
358
|
+
# exclude standard "callbacks" like 'on_new_investigation' unless refined
|
|
359
|
+
instance_method(m).owner != Base
|
|
337
360
|
end
|
|
338
361
|
end
|
|
339
362
|
# rubocop:enable Layout/ClassStructure
|
|
@@ -364,12 +387,40 @@ module RuboCop
|
|
|
364
387
|
cop_config.fetch('AutoCorrect', 'always') == 'contextual'
|
|
365
388
|
end
|
|
366
389
|
|
|
390
|
+
# @api private
|
|
391
|
+
def disabled_autocorrect?
|
|
392
|
+
# `false` is the same as `'disabled'` for backward compatibility.
|
|
393
|
+
['disabled', false].include?(cop_config['AutoCorrect'])
|
|
394
|
+
end
|
|
395
|
+
|
|
367
396
|
def inspect # :nodoc:
|
|
368
397
|
"#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
|
|
369
398
|
end
|
|
370
399
|
|
|
371
400
|
private
|
|
372
401
|
|
|
402
|
+
### Reserved for Commissioner
|
|
403
|
+
|
|
404
|
+
private_class_method def self.restrict_on_send
|
|
405
|
+
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
# @return [Offense]
|
|
409
|
+
def new_offense(range, severity, message, status, corrector)
|
|
410
|
+
justification = suppression_reason(range) if status == :disabled
|
|
411
|
+
|
|
412
|
+
# Since this range may be generated from Ruby code embedded in some
|
|
413
|
+
# template file, we convert it to location info in the original file.
|
|
414
|
+
# A cop configured with `AutoCorrect: false` reports no edits, since
|
|
415
|
+
# nothing that honors the configuration applies them. The corrector
|
|
416
|
+
# stays, so an editor can still offer it as a quick fix to choose.
|
|
417
|
+
corrections = [] if corrector && disabled_autocorrect?
|
|
418
|
+
|
|
419
|
+
Offense.new(severity, range_for_original(range), message, name, status, corrector,
|
|
420
|
+
justification: justification, correction_safe: safe_autocorrect?,
|
|
421
|
+
corrections: corrections)
|
|
422
|
+
end
|
|
423
|
+
|
|
373
424
|
### Reserved for Cop::Cop
|
|
374
425
|
|
|
375
426
|
def callback_argument(range)
|
|
@@ -398,10 +449,6 @@ module RuboCop
|
|
|
398
449
|
@current_offenses ||= []
|
|
399
450
|
end
|
|
400
451
|
|
|
401
|
-
private_class_method def self.restrict_on_send
|
|
402
|
-
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
|
403
|
-
end
|
|
404
|
-
|
|
405
452
|
EMPTY_OFFENSES = [].freeze
|
|
406
453
|
private_constant :EMPTY_OFFENSES
|
|
407
454
|
# Called to complete an investigation
|
|
@@ -416,7 +463,10 @@ module RuboCop
|
|
|
416
463
|
### Actually private methods
|
|
417
464
|
|
|
418
465
|
def reset_investigation
|
|
419
|
-
@currently_disabled_lines =
|
|
466
|
+
@currently_disabled_lines = nil
|
|
467
|
+
@current_offenses = nil
|
|
468
|
+
@processed_source = nil
|
|
469
|
+
@current_corrector = nil
|
|
420
470
|
end
|
|
421
471
|
|
|
422
472
|
# @return [Symbol, Corrector] offense status
|
|
@@ -438,7 +488,12 @@ module RuboCop
|
|
|
438
488
|
def use_corrector(range, corrector)
|
|
439
489
|
if autocorrect?
|
|
440
490
|
attempt_correction(range, corrector)
|
|
441
|
-
elsif
|
|
491
|
+
elsif skipped_unsafe_correction_with_disable_uncorrectable?
|
|
492
|
+
# The unsafe correction will not run, so the offense is
|
|
493
|
+
# uncorrectable for this run and gets a todo comment.
|
|
494
|
+
attempt_correction(range, nil)
|
|
495
|
+
elsif corrector && (always_autocorrect? ||
|
|
496
|
+
(contextual_autocorrect? && !contextual_autocorrect_held_back?))
|
|
442
497
|
:uncorrected
|
|
443
498
|
else
|
|
444
499
|
:unsupported
|
|
@@ -492,8 +547,23 @@ module RuboCop
|
|
|
492
547
|
patterns = cop_config[parameter]
|
|
493
548
|
return default_result unless patterns
|
|
494
549
|
|
|
495
|
-
|
|
496
|
-
|
|
550
|
+
file_patterns = FilePatterns.from(patterns)
|
|
551
|
+
relative_file_path = config.path_relative_to_config(file)
|
|
552
|
+
return true if file_patterns.match?(relative_file_path)
|
|
553
|
+
|
|
554
|
+
if parameter == 'Include' && !relative_file_path.start_with?('..')
|
|
555
|
+
matches_absolute_include_pattern?(patterns, file)
|
|
556
|
+
else
|
|
557
|
+
file_patterns.match?(file)
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
def matches_absolute_include_pattern?(patterns, file)
|
|
562
|
+
absolute_file_path = absolute?(file) ? file : File.expand_path(file)
|
|
563
|
+
patterns.any? do |pattern|
|
|
564
|
+
(absolute?(pattern.to_s) || pattern.to_s.start_with?('..')) &&
|
|
565
|
+
match_path?(pattern, absolute_file_path)
|
|
566
|
+
end
|
|
497
567
|
end
|
|
498
568
|
|
|
499
569
|
def enabled_line?(line_number)
|
|
@@ -502,12 +572,36 @@ module RuboCop
|
|
|
502
572
|
@processed_source.comment_config.cop_enabled_at_line?(self, line_number)
|
|
503
573
|
end
|
|
504
574
|
|
|
575
|
+
# A multi-line offense is suppressed by a directive on any line of its
|
|
576
|
+
# range, not only its first line, matching the intuition that the
|
|
577
|
+
# directive is attached to the offending code.
|
|
578
|
+
def enabled_lines?(range)
|
|
579
|
+
return true if @options[:ignore_disable_comments] || !@processed_source
|
|
580
|
+
|
|
581
|
+
comment_config = @processed_source.comment_config
|
|
582
|
+
comment_config.cop_enabled_at_lines?(self, range.first_line, range.last_line)
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
# The `--` reason on the directive that suppresses offenses on this
|
|
586
|
+
# range, or `nil` when the directive carries none.
|
|
587
|
+
def suppression_reason(range)
|
|
588
|
+
covering = covering_disabled_range(range)
|
|
589
|
+
covering.directive.reason if covering.respond_to?(:directive)
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
def covering_disabled_range(range)
|
|
593
|
+
disabled_ranges = @processed_source.comment_config.cop_disabled_line_ranges[cop_name]
|
|
594
|
+
disabled_ranges&.find do |disabled_range|
|
|
595
|
+
disabled_range.end >= range.first_line && disabled_range.begin <= range.last_line
|
|
596
|
+
end
|
|
597
|
+
end
|
|
598
|
+
|
|
505
599
|
def find_severity(_range, severity)
|
|
506
600
|
custom_severity || severity || default_severity
|
|
507
601
|
end
|
|
508
602
|
|
|
509
603
|
def default_severity
|
|
510
|
-
self.class.
|
|
604
|
+
DEPARTMENT_SEVERITIES.fetch(self.class.department, :convention)
|
|
511
605
|
end
|
|
512
606
|
|
|
513
607
|
def custom_severity
|
|
@@ -524,22 +618,21 @@ module RuboCop
|
|
|
524
618
|
end
|
|
525
619
|
|
|
526
620
|
def range_for_original(range)
|
|
621
|
+
buffer = @current_original.buffer
|
|
622
|
+
return range if @current_offset.zero? && range.source_buffer.equal?(buffer)
|
|
623
|
+
|
|
527
624
|
::Parser::Source::Range.new(
|
|
528
|
-
|
|
625
|
+
buffer,
|
|
529
626
|
range.begin_pos + @current_offset,
|
|
530
627
|
range.end_pos + @current_offset
|
|
531
628
|
)
|
|
532
629
|
end
|
|
533
630
|
|
|
534
631
|
def target_satisfies_all_gem_version_requirements?
|
|
535
|
-
self.class.gem_requirements.all? do |gem_name,
|
|
536
|
-
|
|
537
|
-
next false unless all_gem_versions_in_target
|
|
538
|
-
|
|
539
|
-
gem_version_in_target = all_gem_versions_in_target[gem_name]
|
|
540
|
-
next false unless gem_version_in_target
|
|
632
|
+
self.class.gem_requirements.all? do |gem_name, version_requirement|
|
|
633
|
+
gem_version = target_gem_version(gem_name)
|
|
541
634
|
|
|
542
|
-
|
|
635
|
+
gem_version && version_requirement.satisfied_by?(gem_version)
|
|
543
636
|
end
|
|
544
637
|
end
|
|
545
638
|
end
|
|
@@ -81,7 +81,6 @@ module RuboCop
|
|
|
81
81
|
# gem 'bar', '< 2.1'
|
|
82
82
|
#
|
|
83
83
|
class GemComment < Base
|
|
84
|
-
include DefNode
|
|
85
84
|
include GemDeclaration
|
|
86
85
|
|
|
87
86
|
MSG = 'Missing gem description comment.'
|
|
@@ -128,8 +127,8 @@ module RuboCop
|
|
|
128
127
|
end
|
|
129
128
|
|
|
130
129
|
def ignored_gem?(node)
|
|
131
|
-
|
|
132
|
-
|
|
130
|
+
allowed_gems = Array(cop_config['AllowedGems'])
|
|
131
|
+
allowed_gems.include?(node.first_argument.value)
|
|
133
132
|
end
|
|
134
133
|
|
|
135
134
|
def checked_options_present?(node)
|
|
@@ -163,7 +162,9 @@ module RuboCop
|
|
|
163
162
|
def gem_options(node)
|
|
164
163
|
return [] unless node.last_argument&.hash_type?
|
|
165
164
|
|
|
166
|
-
|
|
165
|
+
# Only literal keys carry an option name to check; a non-literal key
|
|
166
|
+
# (e.g. a variable or method call) has no `value` and must be skipped.
|
|
167
|
+
node.last_argument.keys.filter_map { |key| key.value if key.type?(:sym, :str) }
|
|
167
168
|
end
|
|
168
169
|
end
|
|
169
170
|
end
|