rubocop 1.71.1 → 1.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +883 -168
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +47 -4
- data/exe/rubocop +2 -9
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cached_data.rb +7 -2
- data/lib/rubocop/changed_files.rb +112 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/execute_runner.rb +52 -1
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +8 -2
- data/lib/rubocop/cli.rb +58 -17
- data/lib/rubocop/comment_config/directive_range.rb +34 -0
- data/lib/rubocop/comment_config/disable_next.rb +143 -0
- data/lib/rubocop/comment_config/push_pop.rb +55 -0
- data/lib/rubocop/comment_config.rb +92 -48
- data/lib/rubocop/config.rb +137 -19
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +72 -49
- data/lib/rubocop/config_loader_resolver.rb +94 -28
- data/lib/rubocop/config_obsoletion/cop_rule.rb +2 -1
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/removed_cop.rb +8 -0
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +47 -3
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +64 -12
- data/lib/rubocop/cop/autocorrect_logic.rb +35 -14
- data/lib/rubocop/cop/badge.rb +9 -1
- data/lib/rubocop/cop/base.rb +93 -21
- data/lib/rubocop/cop/bundler/gem_comment.rb +5 -3
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -3
- data/lib/rubocop/cop/bundler.rb +19 -0
- data/lib/rubocop/cop/commissioner.rb +13 -11
- data/lib/rubocop/cop/corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +79 -10
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/lambda_literal_to_method_corrector.rb +7 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +8 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +36 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +49 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -3
- data/lib/rubocop/cop/gemspec/require_mfa.rb +22 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/gemspec.rb +22 -0
- data/lib/rubocop/cop/generator/registration_injector.rb +188 -0
- data/lib/rubocop/cop/generator.rb +5 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +142 -0
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +14 -15
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +1 -2
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +6 -2
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +3 -16
- data/lib/rubocop/cop/layout/argument_alignment.rb +4 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +59 -4
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +163 -35
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -7
- data/lib/rubocop/cop/layout/condition_position.rb +13 -3
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/else_alignment.rb +3 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +27 -9
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +63 -5
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +46 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +34 -4
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +13 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +17 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +105 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +56 -3
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +18 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +20 -15
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +11 -0
- data/lib/rubocop/cop/layout/hash_alignment.rb +11 -13
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +3 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +157 -10
- data/lib/rubocop/cop/layout/leading_comment_space.rb +40 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +2 -3
- data/lib/rubocop/cop/layout/line_length.rb +160 -23
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +8 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +245 -40
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +9 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +89 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +14 -3
- data/lib/rubocop/cop/layout/space_around_keyword.rb +10 -3
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +30 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +6 -39
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +42 -36
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +3 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/layout.rb +114 -0
- data/lib/rubocop/cop/lazy_loader.rb +41 -0
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +9 -17
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +72 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +6 -2
- data/lib/rubocop/cop/lint/argument_mismatch.rb +99 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +47 -8
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +94 -15
- data/lib/rubocop/cop/lint/constant_resolution.rb +31 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +240 -0
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +13 -4
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +5 -2
- data/lib/rubocop/cop/lint/deprecated_reference.rb +194 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +506 -41
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +20 -65
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -8
- data/lib/rubocop/cop/lint/float_comparison.rb +33 -10
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -2
- data/lib/rubocop/cop/lint/inherit_exception.rb +53 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -6
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +137 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +13 -19
- data/lib/rubocop/cop/lint/misplaced_magic_comment.rb +185 -0
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +44 -22
- data/lib/rubocop/cop/lint/missing_super.rb +31 -1
- data/lib/rubocop/cop/lint/mixed_case_range.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/name_typo.rb +270 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +4 -4
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +11 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -1
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +15 -4
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +20 -14
- data/lib/rubocop/cop/lint/raise_exception.rb +30 -11
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +149 -39
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +53 -19
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +5 -25
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +13 -4
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +267 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +5 -3
- data/lib/rubocop/cop/lint/redundant_with_object.rb +8 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +3 -2
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -2
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +28 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +9 -5
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +63 -6
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +27 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +14 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/super_argument_mismatch.rb +179 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +122 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +73 -5
- data/lib/rubocop/cop/lint/to_json.rb +20 -17
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +36 -10
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +2 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +2 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +16 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +5 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/unused_private_method.rb +234 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +31 -6
- data/lib/rubocop/cop/lint/useless_assignment.rb +56 -27
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +107 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +11 -10
- data/lib/rubocop/cop/lint/useless_or.rb +111 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -3
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +13 -7
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +201 -0
- data/lib/rubocop/cop/lint/void.rb +60 -21
- data/lib/rubocop/cop/lint.rb +179 -0
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +2 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +3 -2
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +37 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +2 -2
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/metrics.rb +31 -0
- data/lib/rubocop/cop/migration/department_name.rb +11 -5
- data/lib/rubocop/cop/migration.rb +13 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_methods.rb +5 -5
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +9 -5
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +27 -9
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +5 -7
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +2 -3
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +1 -2
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +13 -5
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +20 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -2
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +44 -16
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +29 -26
- data/lib/rubocop/cop/mixin/hash_subset.rb +28 -6
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +32 -78
- data/lib/rubocop/cop/mixin/indexed_method_arity.rb +94 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +52 -11
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +62 -6
- data/lib/rubocop/cop/mixin/project_index_help.rb +188 -0
- data/lib/rubocop/cop/mixin/range_help.rb +16 -5
- data/lib/rubocop/cop/mixin/reparsed_equivalence.rb +171 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +47 -11
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +23 -6
- data/lib/rubocop/cop/mixin.rb +91 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +24 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +17 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +7 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/file_name.rb +6 -5
- data/lib/rubocop/cop/naming/inclusive_language.rb +8 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -6
- data/lib/rubocop/cop/naming/method_name.rb +190 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +80 -8
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +11 -6
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/naming/variable_number.rb +3 -1
- data/lib/rubocop/cop/naming.rb +31 -0
- data/lib/rubocop/cop/offense.rb +52 -9
- data/lib/rubocop/cop/registry.rb +233 -64
- data/lib/rubocop/cop/security/eval.rb +17 -3
- data/lib/rubocop/cop/security/io_methods.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security.rb +19 -0
- data/lib/rubocop/cop/severity.rb +12 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +47 -13
- data/lib/rubocop/cop/style/accessor_grouping.rb +47 -10
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +49 -37
- data/lib/rubocop/cop/style/array_first_last.rb +13 -3
- data/lib/rubocop/cop/style/array_intersect.rb +136 -38
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +7 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +43 -38
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +6 -8
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +135 -21
- data/lib/rubocop/cop/style/class_equality_comparison.rb +22 -14
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +37 -17
- data/lib/rubocop/cop/style/collection_methods.rb +1 -0
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +7 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +12 -5
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +8 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +54 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +23 -12
- data/lib/rubocop/cop/style/copyright.rb +27 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +25 -0
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +22 -5
- data/lib/rubocop/cop/style/dig_chain.rb +6 -1
- data/lib/rubocop/cop/style/dir_empty.rb +4 -0
- data/lib/rubocop/cop/style/directive_scope.rb +304 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +122 -14
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +53 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -12
- data/lib/rubocop/cop/style/double_negation.rb +3 -3
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +4 -3
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +13 -4
- data/lib/rubocop/cop/style/empty_class_definition.rb +126 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +4 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +11 -2
- data/lib/rubocop/cop/style/empty_method.rb +12 -8
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +110 -0
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +191 -19
- data/lib/rubocop/cop/style/env_home.rb +4 -0
- data/lib/rubocop/cop/style/eval_with_location.rb +3 -3
- data/lib/rubocop/cop/style/even_odd.rb +11 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +8 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +16 -3
- data/lib/rubocop/cop/style/exponential_notation.rb +5 -4
- data/lib/rubocop/cop/style/fetch_env_var.rb +33 -7
- data/lib/rubocop/cop/style/file_null.rb +6 -4
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +25 -17
- data/lib/rubocop/cop/style/for.rb +9 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +86 -16
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +32 -23
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +28 -12
- data/lib/rubocop/cop/style/hash_each_methods.rb +4 -4
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +7 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +19 -9
- data/lib/rubocop/cop/style/hash_transform_values.rb +19 -9
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +18 -9
- data/lib/rubocop/cop/style/if_inside_else.rb +25 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +71 -46
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +15 -19
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +5 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +16 -6
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +5 -2
- data/lib/rubocop/cop/style/inverse_methods.rb +10 -6
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +27 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +3 -4
- data/lib/rubocop/cop/style/it_assignment.rb +69 -12
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +4 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +20 -10
- data/lib/rubocop/cop/style/lambda.rb +12 -1
- data/lib/rubocop/cop/style/lambda_call.rb +26 -10
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +4 -4
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +11 -0
- data/lib/rubocop/cop/style/map_into_array.rb +5 -2
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -5
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +31 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +34 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +12 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +7 -5
- data/lib/rubocop/cop/style/min_max_comparison.rb +17 -6
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +40 -7
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +4 -2
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +2 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +10 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +14 -18
- data/lib/rubocop/cop/style/multiple_comparison.rb +33 -22
- data/lib/rubocop/cop/style/mutable_constant.rb +111 -12
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -2
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nested_modifier.rb +9 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +41 -13
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -11
- data/lib/rubocop/cop/style/not.rb +5 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +11 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +1 -0
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +22 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +10 -2
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +58 -27
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -1
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +4 -0
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +5 -3
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +4 -2
- data/lib/rubocop/cop/style/raise_args.rb +9 -9
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +12 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +63 -5
- data/lib/rubocop/cop/style/redundant_constant_base.rb +42 -6
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +11 -3
- data/lib/rubocop/cop/style/redundant_each.rb +4 -5
- data/lib/rubocop/cop/style/redundant_exception.rb +7 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -10
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +9 -0
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +319 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +6 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +83 -119
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +164 -82
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -5
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +8 -8
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +4 -3
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +1 -2
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +76 -20
- data/lib/rubocop/cop/style/sample.rb +11 -6
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +54 -22
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -14
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +22 -8
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +96 -104
- data/lib/rubocop/cop/style/special_global_vars.rb +7 -2
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -1
- data/lib/rubocop/cop/style/static_class.rb +21 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +31 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +38 -2
- data/lib/rubocop/cop/style/super_arguments.rb +4 -6
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +11 -9
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +11 -0
- data/lib/rubocop/cop/style/time_now.rb +41 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +52 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +18 -19
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -1
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +2 -3
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/style.rb +311 -0
- data/lib/rubocop/cop/team.rb +163 -45
- data/lib/rubocop/cop/util.rb +7 -10
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +7 -3
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +28 -10
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +49 -15
- data/lib/rubocop/directive_comment.rb +147 -5
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/feature_loader.rb +0 -6
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +57 -14
- data/lib/rubocop/formatter/emacs_style_formatter.rb +3 -1
- data/lib/rubocop/formatter/formatter_set.rb +3 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/github_actions_formatter.rb +6 -5
- data/lib/rubocop/formatter/html_formatter.rb +3 -5
- data/lib/rubocop/formatter/json_formatter.rb +11 -6
- data/lib/rubocop/formatter/junit_formatter.rb +27 -10
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/sarif_formatter.rb +181 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +4 -5
- data/lib/rubocop/formatter/tap_formatter.rb +8 -3
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -3
- data/lib/rubocop/formatter.rb +23 -21
- data/lib/rubocop/lockfile.rb +18 -0
- data/lib/rubocop/lsp/diagnostic.rb +22 -41
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +136 -33
- data/lib/rubocop/lsp/runtime.rb +23 -8
- data/lib/rubocop/lsp/server.rb +4 -2
- data/lib/rubocop/lsp/stdin_runner.rb +31 -18
- data/lib/rubocop/magic_comment.rb +55 -0
- data/lib/rubocop/mcp/server.rb +199 -0
- data/lib/rubocop/options.rb +129 -21
- data/lib/rubocop/path_util.rb +20 -5
- data/lib/rubocop/pending_cops_reporter.rb +51 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +146 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/project_index_loader.rb +82 -0
- data/lib/rubocop/rake_task.rb +6 -4
- data/lib/rubocop/remote_config.rb +14 -12
- data/lib/rubocop/result_cache.rb +90 -52
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +11 -7
- data/lib/rubocop/rspec/shared_contexts.rb +85 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +294 -100
- data/lib/rubocop/server/cache.rb +67 -48
- data/lib/rubocop/server/cli.rb +2 -4
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/server.rb +14 -0
- data/lib/rubocop/target_finder.rb +25 -11
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/todo_audit.rb +111 -0
- data/lib/rubocop/unified_diff.rb +257 -0
- data/lib/rubocop/version.rb +48 -10
- data/lib/rubocop.rb +30 -682
- data/lib/ruby_lsp/rubocop/addon.rb +28 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +116 -19
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +0 -46
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +0 -50
|
@@ -1,17 +1,44 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# rubocop:disable Lint/RedundantCopDisableDirective
|
|
3
|
+
# rubocop:disable Lint/RedundantCopDisableDirective -- the examples below read as real directives
|
|
4
4
|
|
|
5
5
|
module RuboCop
|
|
6
6
|
module Cop
|
|
7
7
|
module Style
|
|
8
8
|
# Detects comments to enable/disable RuboCop.
|
|
9
|
-
# This is useful if want to make sure that every RuboCop error gets fixed
|
|
9
|
+
# This is useful if you want to make sure that every RuboCop error gets fixed
|
|
10
10
|
# and not quickly disabled with a comment.
|
|
11
11
|
#
|
|
12
12
|
# Specific cops can be allowed with the `AllowedCops` configuration. Note that
|
|
13
13
|
# if this configuration is set, `rubocop:disable all` is still disallowed.
|
|
14
14
|
#
|
|
15
|
+
# `AllowedCops` and `DisallowedCops` accept cop names and department names
|
|
16
|
+
# alike. Listing a cop does not cover its whole department: a directive
|
|
17
|
+
# disabling `Metrics` is broader than one disabling `Metrics/AbcSize`.
|
|
18
|
+
#
|
|
19
|
+
# Alternatively, specific cops can be disallowed with the `DisallowedCops`
|
|
20
|
+
# configuration. When `DisallowedCops` is set, only directives for the listed
|
|
21
|
+
# cops (and `all`) will be flagged. This is useful when you want
|
|
22
|
+
# to protect a small set of critical cops from being disabled rather than
|
|
23
|
+
# allowlisting all other cops. `AllowedCops` and `DisallowedCops` should not
|
|
24
|
+
# both be set at the same time; if `DisallowedCops` is set, it takes precedence.
|
|
25
|
+
#
|
|
26
|
+
# `AllowedDirectives` names directive forms - `disable`, `todo`,
|
|
27
|
+
# `disable-next`, `todo-next`, `push`, `next` - and exempts them from the
|
|
28
|
+
# cop entirely. `rubocop:todo` is the usual candidate, since
|
|
29
|
+
# `--disable-uncorrectable` generates those and they record debt rather
|
|
30
|
+
# than a decision someone should be asked to justify.
|
|
31
|
+
#
|
|
32
|
+
# With `AllowWithReason` set to `true`, a disable directive carrying
|
|
33
|
+
# a `--` trailing justification comment is allowed, so a team can require
|
|
34
|
+
# every disable to be documented instead of banning them outright. Enable
|
|
35
|
+
# directives are not checked in this mode, since they end a suppression
|
|
36
|
+
# rather than start one.
|
|
37
|
+
#
|
|
38
|
+
# This cop cannot be disabled via directive comments when it is explicitly
|
|
39
|
+
# enabled with `Enabled: true`. This prevents users from bypassing the cop
|
|
40
|
+
# with `# rubocop:disable Style/DisableCopsWithinSourceCodeDirective`.
|
|
41
|
+
#
|
|
15
42
|
# @example
|
|
16
43
|
# # bad
|
|
17
44
|
# # rubocop:disable Metrics/AbcSize
|
|
@@ -30,17 +57,54 @@ module RuboCop
|
|
|
30
57
|
# end
|
|
31
58
|
# # rubocop:enable Metrics/AbcSize
|
|
32
59
|
#
|
|
60
|
+
# @example DisallowedCops: [Lint/Void]
|
|
61
|
+
# # bad
|
|
62
|
+
# # rubocop:disable Lint/Void
|
|
63
|
+
# foo
|
|
64
|
+
# # rubocop:enable Lint/Void
|
|
65
|
+
#
|
|
66
|
+
# # good
|
|
67
|
+
# # rubocop:disable Metrics/AbcSize
|
|
68
|
+
# foo
|
|
69
|
+
# # rubocop:enable Metrics/AbcSize
|
|
70
|
+
#
|
|
71
|
+
# @example AllowedDirectives: [todo]
|
|
72
|
+
# # good - the cop does not look at `todo` directives at all
|
|
73
|
+
# x = 0 # rubocop:todo Layout/SpaceAroundOperators
|
|
74
|
+
#
|
|
75
|
+
# # bad
|
|
76
|
+
# x = 0 # rubocop:disable Layout/SpaceAroundOperators
|
|
77
|
+
#
|
|
78
|
+
# @example AllowedCops: [Metrics]
|
|
79
|
+
# # good - every cop the directive disables is in an exempt department
|
|
80
|
+
# # rubocop:disable Metrics/AbcSize
|
|
81
|
+
# def foo
|
|
82
|
+
# end
|
|
83
|
+
# # rubocop:enable Metrics/AbcSize
|
|
84
|
+
#
|
|
85
|
+
# @example AllowWithReason: true
|
|
86
|
+
# # bad
|
|
87
|
+
# x = 0 # rubocop:disable Layout/SpaceAroundOperators
|
|
88
|
+
#
|
|
89
|
+
# # good
|
|
90
|
+
# x = 0 # rubocop:disable Layout/SpaceAroundOperators -- would misalign the table
|
|
91
|
+
#
|
|
33
92
|
class DisableCopsWithinSourceCodeDirective < Base
|
|
34
93
|
extend AutoCorrector
|
|
35
94
|
|
|
36
95
|
# rubocop:enable Lint/RedundantCopDisableDirective
|
|
37
96
|
MSG = 'RuboCop disable/enable directives are not permitted.'
|
|
38
97
|
MSG_FOR_COPS = 'RuboCop disable/enable directives for %<cops>s are not permitted.'
|
|
98
|
+
MSG_MISSING_REASON = 'RuboCop disable directives without a `--` justification ' \
|
|
99
|
+
'comment are not permitted.'
|
|
39
100
|
|
|
40
101
|
def on_new_investigation
|
|
41
102
|
processed_source.comments.each do |comment|
|
|
42
|
-
|
|
43
|
-
|
|
103
|
+
directive = DirectiveComment.new(comment)
|
|
104
|
+
next if ignored?(directive)
|
|
105
|
+
|
|
106
|
+
directive_cops = directive_cops(directive)
|
|
107
|
+
disallowed_cops = compute_disallowed_cops(directive_cops)
|
|
44
108
|
|
|
45
109
|
next unless disallowed_cops.any?
|
|
46
110
|
|
|
@@ -50,14 +114,20 @@ module RuboCop
|
|
|
50
114
|
|
|
51
115
|
private
|
|
52
116
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
117
|
+
def compute_disallowed_cops(directive_cops)
|
|
118
|
+
if disallowed_cops_config.any?
|
|
119
|
+
if directive_cops.include?('all')
|
|
120
|
+
directive_cops
|
|
121
|
+
else
|
|
122
|
+
directive_cops.uniq.select { |cop| listed?(disallowed_cops_config, cop) }
|
|
123
|
+
end
|
|
124
|
+
else
|
|
125
|
+
directive_cops.reject { |cop| cop != 'all' && listed?(allowed_cops, cop) }
|
|
126
|
+
end
|
|
127
|
+
end
|
|
59
128
|
|
|
60
|
-
|
|
129
|
+
def register_offense(comment, directive_cops, disallowed_cops)
|
|
130
|
+
add_offense(comment, message: offense_message(disallowed_cops)) do |corrector|
|
|
61
131
|
replacement = ''
|
|
62
132
|
|
|
63
133
|
if directive_cops.length != disallowed_cops.length
|
|
@@ -69,18 +139,56 @@ module RuboCop
|
|
|
69
139
|
end
|
|
70
140
|
end
|
|
71
141
|
|
|
72
|
-
def
|
|
73
|
-
|
|
142
|
+
def offense_message(disallowed_cops)
|
|
143
|
+
if allow_with_reason?
|
|
144
|
+
MSG_MISSING_REASON
|
|
145
|
+
elsif any_cops_allowed? || disallowed_cops_config.any?
|
|
146
|
+
format(MSG_FOR_COPS, cops: "`#{disallowed_cops.join('`, `')}`")
|
|
147
|
+
else
|
|
148
|
+
MSG
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def directive_cops(directive)
|
|
153
|
+
match_captures = directive.match_captures
|
|
74
154
|
match_captures && match_captures[1] ? match_captures[1].split(',').map(&:strip) : []
|
|
75
155
|
end
|
|
76
156
|
|
|
157
|
+
def ignored?(directive)
|
|
158
|
+
return true if exempt_mode?(directive)
|
|
159
|
+
|
|
160
|
+
allow_with_reason? && (directive.reason || directive.enabled?)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def exempt_mode?(directive)
|
|
164
|
+
allowed_directives.include?(directive.mode)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def allowed_directives
|
|
168
|
+
@allowed_directives ||= Array(cop_config['AllowedDirectives'])
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def allow_with_reason?
|
|
172
|
+
cop_config['AllowWithReason']
|
|
173
|
+
end
|
|
174
|
+
|
|
77
175
|
def allowed_cops
|
|
78
|
-
Array(cop_config['AllowedCops'])
|
|
176
|
+
@allowed_cops ||= Array(cop_config['AllowedCops']).to_set
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# A name matches either outright or through its department, so
|
|
180
|
+
# `Metrics` covers `Metrics/AbcSize` but not the other way round.
|
|
181
|
+
def listed?(names, cop)
|
|
182
|
+
names.include?(cop) || names.include?(cop.split('/').first)
|
|
79
183
|
end
|
|
80
184
|
|
|
81
185
|
def any_cops_allowed?
|
|
82
186
|
allowed_cops.any?
|
|
83
187
|
end
|
|
188
|
+
|
|
189
|
+
def disallowed_cops_config
|
|
190
|
+
@disallowed_cops_config ||= Array(cop_config['DisallowedCops']).to_set
|
|
191
|
+
end
|
|
84
192
|
end
|
|
85
193
|
end
|
|
86
194
|
end
|
|
@@ -161,7 +161,12 @@ module RuboCop
|
|
|
161
161
|
source = source.gsub(COMMENT_REGEXP, '')
|
|
162
162
|
return if source.blank?
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
# Treat `\#` (an escaped interpolation marker in the heredoc) as matching
|
|
165
|
+
# either `\#` or `#` in the comment, since the comment may show either
|
|
166
|
+
# the literal source form or the runtime appearance.
|
|
167
|
+
segments = source.strip.split('\\#', -1).map { |segment| Regexp.escape(segment) }
|
|
168
|
+
|
|
169
|
+
/\s*#{segments.join('\\\\?#')}/
|
|
165
170
|
end
|
|
166
171
|
end
|
|
167
172
|
end
|
|
@@ -13,6 +13,11 @@ module RuboCop
|
|
|
13
13
|
# a `#:nodoc:` comment next to it. Likewise, `#:nodoc: all` does the
|
|
14
14
|
# same for all its children.
|
|
15
15
|
#
|
|
16
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
17
|
+
# installed, a reopened class or module is not reported when any of its
|
|
18
|
+
# other definition sites (in the same or another file) carries a
|
|
19
|
+
# documentation comment.
|
|
20
|
+
#
|
|
16
21
|
# @example
|
|
17
22
|
# # bad
|
|
18
23
|
# class Person
|
|
@@ -62,19 +67,24 @@ module RuboCop
|
|
|
62
67
|
#
|
|
63
68
|
# @example AllowedConstants: ['ClassMethods']
|
|
64
69
|
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
70
|
+
# # good
|
|
71
|
+
# module A
|
|
72
|
+
# module ClassMethods
|
|
73
|
+
# # ...
|
|
74
|
+
# end
|
|
75
|
+
# end
|
|
71
76
|
#
|
|
72
77
|
class Documentation < Base
|
|
73
78
|
include DocumentationComment
|
|
79
|
+
include ProjectIndexHelp
|
|
74
80
|
include RangeHelp
|
|
75
81
|
|
|
76
82
|
MSG = 'Missing top-level documentation comment for `%<type>s %<identifier>s`.'
|
|
77
83
|
|
|
84
|
+
# Comments that configure tooling rather than document the code.
|
|
85
|
+
DIRECTIVE_COMMENT_REGEXP = /\A\#\s*(rubocop:|frozen_string_literal:|encoding:|
|
|
86
|
+
shareable_constant_value:|typed:|-\*-)/x.freeze
|
|
87
|
+
|
|
78
88
|
# @!method constant_definition?(node)
|
|
79
89
|
def_node_matcher :constant_definition?, '{class module casgn}'
|
|
80
90
|
|
|
@@ -109,12 +119,49 @@ module RuboCop
|
|
|
109
119
|
return if constant_allowed?(node)
|
|
110
120
|
return if nodoc_self_or_outer_module?(node)
|
|
111
121
|
return if include_statement_only?(body)
|
|
122
|
+
return if documented_elsewhere?(node)
|
|
123
|
+
|
|
124
|
+
add_documentation_offense(node)
|
|
125
|
+
end
|
|
112
126
|
|
|
127
|
+
def add_documentation_offense(node)
|
|
113
128
|
range = range_between(node.source_range.begin_pos, node.loc.name.end_pos)
|
|
114
129
|
message = format(MSG, type: node.type, identifier: identifier(node))
|
|
115
130
|
add_offense(range, message: message)
|
|
116
131
|
end
|
|
117
132
|
|
|
133
|
+
# A reopened class or module is typically documented at a single
|
|
134
|
+
# definition site. When `AllCops/UseProjectIndex` is enabled, the
|
|
135
|
+
# documentation requirement is satisfied by a comment on any other
|
|
136
|
+
# definition of the same class or module.
|
|
137
|
+
def documented_elsewhere?(node)
|
|
138
|
+
return false unless project_index
|
|
139
|
+
|
|
140
|
+
declaration = resolve_constant_in_index(node.identifier)
|
|
141
|
+
return false unless declaration.is_a?(Rubydex::Namespace)
|
|
142
|
+
|
|
143
|
+
declaration.definitions.any? do |definition|
|
|
144
|
+
other_definition?(definition, node) && documenting_comments?(definition)
|
|
145
|
+
end
|
|
146
|
+
rescue StandardError
|
|
147
|
+
false
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def other_definition?(definition, node)
|
|
151
|
+
location = definition.location
|
|
152
|
+
return false unless location.uri.start_with?(FILE_URI_PREFIX)
|
|
153
|
+
|
|
154
|
+
!same_file?(location.to_file_path, processed_source.file_path) ||
|
|
155
|
+
location.to_display.start_line != node.first_line
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def documenting_comments?(definition)
|
|
159
|
+
definition.comments.to_a.any? do |comment|
|
|
160
|
+
text = comment.string.strip
|
|
161
|
+
!text.empty? && !DIRECTIVE_COMMENT_REGEXP.match?(text)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
118
165
|
def nodoc_self_or_outer_module?(node)
|
|
119
166
|
nodoc_comment?(node) ||
|
|
120
167
|
(compact_namespace?(node) && nodoc_comment?(outer_module(node).first))
|
|
@@ -97,14 +97,14 @@ module RuboCop
|
|
|
97
97
|
#
|
|
98
98
|
# @example AllowedMethods: ['method_missing', 'respond_to_missing?']
|
|
99
99
|
#
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
103
|
-
#
|
|
100
|
+
# # good
|
|
101
|
+
# class Foo
|
|
102
|
+
# def method_missing(name, *args)
|
|
103
|
+
# end
|
|
104
104
|
#
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
#
|
|
105
|
+
# def respond_to_missing?(symbol, include_private)
|
|
106
|
+
# end
|
|
107
|
+
# end
|
|
108
108
|
#
|
|
109
109
|
class DocumentationMethod < Base
|
|
110
110
|
include DocumentationComment
|
|
@@ -119,6 +119,7 @@ module RuboCop
|
|
|
119
119
|
|
|
120
120
|
def on_def(node)
|
|
121
121
|
return if node.method?(:initialize)
|
|
122
|
+
return if allowed_methods.include?(node.method_name)
|
|
122
123
|
|
|
123
124
|
parent = node.parent
|
|
124
125
|
modifier_node?(parent) ? check(parent) : check(node)
|
|
@@ -130,7 +131,6 @@ module RuboCop
|
|
|
130
131
|
def check(node)
|
|
131
132
|
return if non_public?(node) && !require_for_non_public_methods?
|
|
132
133
|
return if documentation_comment?(node)
|
|
133
|
-
return if method_allowed?(node)
|
|
134
134
|
|
|
135
135
|
add_offense(node)
|
|
136
136
|
end
|
|
@@ -139,10 +139,6 @@ module RuboCop
|
|
|
139
139
|
cop_config['RequireForNonPublicMethods']
|
|
140
140
|
end
|
|
141
141
|
|
|
142
|
-
def method_allowed?(node)
|
|
143
|
-
allowed_methods.include?(node.method_name)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
142
|
def allowed_methods
|
|
147
143
|
@allowed_methods ||= cop_config.fetch('AllowedMethods', []).map(&:to_sym)
|
|
148
144
|
end
|
|
@@ -96,20 +96,20 @@ module RuboCop
|
|
|
96
96
|
elsif last_child.type?(:pair, :hash) || last_child.parent.array_type?
|
|
97
97
|
false
|
|
98
98
|
else
|
|
99
|
-
last_child.
|
|
99
|
+
last_child.first_line <= node.first_line
|
|
100
100
|
end
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
def find_def_node_from_ascendant(node)
|
|
104
104
|
return unless (parent = node.parent)
|
|
105
|
-
return parent if parent.
|
|
105
|
+
return parent if parent.any_def_type?
|
|
106
106
|
return node.parent.child_nodes.first if define_method?(parent)
|
|
107
107
|
|
|
108
108
|
find_def_node_from_ascendant(node.parent)
|
|
109
109
|
end
|
|
110
110
|
|
|
111
111
|
def define_method?(node)
|
|
112
|
-
return false unless node.
|
|
112
|
+
return false unless node.any_block_type?
|
|
113
113
|
|
|
114
114
|
child = node.child_nodes.first
|
|
115
115
|
return false unless child.send_type?
|
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
|
26
26
|
|
|
27
27
|
MSG = 'Use `Integer#times` for a simple loop which iterates a fixed number of times.'
|
|
28
28
|
|
|
29
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
29
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- only matches blocks that take no parameters
|
|
30
30
|
return unless offending?(node)
|
|
31
31
|
|
|
32
32
|
send_node = node.send_node
|
|
@@ -40,6 +40,8 @@ module RuboCop
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
alias on_itblock on_block
|
|
44
|
+
|
|
43
45
|
def on_numblock(node)
|
|
44
46
|
each_with_object_numblock_candidate?(node) do |method, body|
|
|
45
47
|
_, method_name, method_arg = *method
|
|
@@ -58,7 +60,7 @@ module RuboCop
|
|
|
58
60
|
|
|
59
61
|
# @!method each_with_object_block_candidate?(node)
|
|
60
62
|
def_node_matcher :each_with_object_block_candidate?, <<~PATTERN
|
|
61
|
-
(block $(call _ {:inject :reduce} _) $_ $_)
|
|
63
|
+
(block $(call _ {:inject :reduce} _) $(args _ _) $_)
|
|
62
64
|
PATTERN
|
|
63
65
|
|
|
64
66
|
# @!method each_with_object_numblock_candidate?(node)
|
|
@@ -71,8 +73,7 @@ module RuboCop
|
|
|
71
73
|
|
|
72
74
|
first_arg, second_arg = *node.arguments
|
|
73
75
|
|
|
74
|
-
corrector.
|
|
75
|
-
corrector.replace(second_arg, first_arg.source)
|
|
76
|
+
corrector.swap(first_arg, second_arg)
|
|
76
77
|
|
|
77
78
|
if return_value_occupies_whole_line?(return_value)
|
|
78
79
|
corrector.remove(whole_line_expression(return_value))
|
|
@@ -28,7 +28,7 @@ module RuboCop
|
|
|
28
28
|
|
|
29
29
|
MSG = 'Omit pipes for the empty block parameters.'
|
|
30
30
|
|
|
31
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
31
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- the offense is an empty `||`
|
|
32
32
|
send_node = node.send_node
|
|
33
33
|
check(node) unless send_node.send_type? && send_node.lambda_literal?
|
|
34
34
|
end
|
|
@@ -40,9 +40,9 @@ module RuboCop
|
|
|
40
40
|
extend AutoCorrector
|
|
41
41
|
|
|
42
42
|
MSG = 'Do not use empty `case` condition, instead use an `if` expression.'
|
|
43
|
-
NOT_SUPPORTED_PARENT_TYPES = %i[return break next send csend].freeze
|
|
43
|
+
NOT_SUPPORTED_PARENT_TYPES = %i[return break next send csend yield super].freeze
|
|
44
44
|
|
|
45
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
45
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
46
46
|
def on_case(case_node)
|
|
47
47
|
if case_node.condition || NOT_SUPPORTED_PARENT_TYPES.include?(case_node.parent&.type)
|
|
48
48
|
return
|
|
@@ -56,7 +56,6 @@ module RuboCop
|
|
|
56
56
|
|
|
57
57
|
add_offense(case_node.loc.keyword) { |corrector| autocorrect(corrector, case_node) }
|
|
58
58
|
end
|
|
59
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
60
59
|
|
|
61
60
|
private
|
|
62
61
|
|
|
@@ -90,7 +89,17 @@ module RuboCop
|
|
|
90
89
|
range = range_between(conditions.first.source_range.begin_pos,
|
|
91
90
|
conditions.last.source_range.end_pos)
|
|
92
91
|
|
|
93
|
-
corrector.replace(range, conditions.map(
|
|
92
|
+
corrector.replace(range, conditions.map { |c| parenthesize_condition(c) }.join(' || '))
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# A condition that binds looser than `||` (e.g. a ternary, range, or
|
|
97
|
+
# assignment) must be parenthesized so the joined `||` keeps its meaning.
|
|
98
|
+
def parenthesize_condition(condition)
|
|
99
|
+
if condition.assignment? || condition.type?(:if, :and, :or, :range)
|
|
100
|
+
"(#{condition.source})"
|
|
101
|
+
else
|
|
102
|
+
condition.source
|
|
94
103
|
end
|
|
95
104
|
end
|
|
96
105
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Enforces consistent style for empty class definitions.
|
|
7
|
+
#
|
|
8
|
+
# This cop can enforce either a standard class definition or `Class.new`
|
|
9
|
+
# for classes with no body.
|
|
10
|
+
#
|
|
11
|
+
# The supported styles are:
|
|
12
|
+
#
|
|
13
|
+
# * class_keyword (default) - prefer standard class definition over `Class.new`
|
|
14
|
+
# * class_new - prefer `Class.new` over class definition
|
|
15
|
+
#
|
|
16
|
+
# One difference between the two styles is that the `Class.new` form does not make
|
|
17
|
+
# the subclass name available to the base class's `inherited` callback.
|
|
18
|
+
# For this reason, `EnforcedStyle: class_keyword` is set as the default style.
|
|
19
|
+
# Class definitions without a superclass, which are not involved in inheritance,
|
|
20
|
+
# are not detected. This ensures safe detection regardless of the applied style.
|
|
21
|
+
# This avoids overlapping responsibilities with the `Lint/EmptyClass` cop.
|
|
22
|
+
#
|
|
23
|
+
# Use `AllowedParentClasses` to permit both styles for specific parent classes.
|
|
24
|
+
# For example, adding `StandardError` allows both `Error = Class.new(StandardError)`
|
|
25
|
+
# and `class Error < StandardError; end` regardless of the enforced style.
|
|
26
|
+
#
|
|
27
|
+
# @example EnforcedStyle: class_keyword (default)
|
|
28
|
+
# # bad
|
|
29
|
+
# FooError = Class.new(StandardError)
|
|
30
|
+
#
|
|
31
|
+
# # okish
|
|
32
|
+
# class FooError < StandardError; end
|
|
33
|
+
#
|
|
34
|
+
# # good
|
|
35
|
+
# class FooError < StandardError
|
|
36
|
+
# end
|
|
37
|
+
#
|
|
38
|
+
# @example EnforcedStyle: class_new
|
|
39
|
+
# # bad
|
|
40
|
+
# class FooError < StandardError
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# # bad
|
|
44
|
+
# class FooError < StandardError; end
|
|
45
|
+
#
|
|
46
|
+
# # good
|
|
47
|
+
# FooError = Class.new(StandardError)
|
|
48
|
+
#
|
|
49
|
+
# @example AllowedParentClasses: ['StandardError']
|
|
50
|
+
# # good - allowed regardless of EnforcedStyle
|
|
51
|
+
# FooError = Class.new(StandardError)
|
|
52
|
+
#
|
|
53
|
+
# # good - allowed regardless of EnforcedStyle
|
|
54
|
+
# class FooError < StandardError
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
class EmptyClassDefinition < Base
|
|
58
|
+
include ConfigurableEnforcedStyle
|
|
59
|
+
extend AutoCorrector
|
|
60
|
+
|
|
61
|
+
MSG_CLASS_KEYWORD =
|
|
62
|
+
'Use the `class` keyword instead of `Class.new` to define an empty class.'
|
|
63
|
+
MSG_CLASS_NEW = 'Use `Class.new` instead of the `class` keyword to define an empty class.'
|
|
64
|
+
|
|
65
|
+
# @!method class_new_assignment(node)
|
|
66
|
+
def_node_matcher :class_new_assignment, <<~PATTERN
|
|
67
|
+
(casgn _ _ $(send (const _ :Class) :new _))
|
|
68
|
+
PATTERN
|
|
69
|
+
|
|
70
|
+
def on_casgn(node)
|
|
71
|
+
return unless %i[class_keyword class_definition].include?(style)
|
|
72
|
+
return unless (class_new_node = class_new_assignment(node))
|
|
73
|
+
return if (arg = class_new_node.first_argument) && !arg.const_type?
|
|
74
|
+
return if allowed_parent_class?(class_new_node.first_argument.source)
|
|
75
|
+
|
|
76
|
+
add_offense(node, message: MSG_CLASS_KEYWORD) do |corrector|
|
|
77
|
+
autocorrect_class_new(corrector, node, class_new_node)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def on_class(node)
|
|
82
|
+
return unless style == :class_new
|
|
83
|
+
return unless node.parent_class
|
|
84
|
+
return if (body = node.body) && !body.children.empty?
|
|
85
|
+
return if allowed_parent_class?(node.parent_class.source)
|
|
86
|
+
|
|
87
|
+
add_offense(node, message: MSG_CLASS_NEW) do |corrector|
|
|
88
|
+
autocorrect_class_definition(corrector, node)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
def allowed_parent_class?(parent_class_name)
|
|
95
|
+
allowed_parent_classes.include?(parent_class_name)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def allowed_parent_classes
|
|
99
|
+
cop_config.fetch('AllowedParentClasses', [])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def autocorrect_class_new(corrector, node, class_new_node)
|
|
103
|
+
indent = ' ' * node.loc.column
|
|
104
|
+
class_name = constant_name(node)
|
|
105
|
+
parent_class_name = class_new_node.first_argument.source
|
|
106
|
+
|
|
107
|
+
corrector.replace(node, "class #{class_name} < #{parent_class_name}\n#{indent}end")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Preserve any namespace on the assigned constant (e.g. `Foo::Bar`),
|
|
111
|
+
# which `node.name` drops.
|
|
112
|
+
def constant_name(node)
|
|
113
|
+
namespace = node.namespace
|
|
114
|
+
namespace ? "#{namespace.source}::#{node.name}" : node.name
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def autocorrect_class_definition(corrector, node)
|
|
118
|
+
class_name = node.identifier.source
|
|
119
|
+
parent_class_name = node.parent_class.source
|
|
120
|
+
|
|
121
|
+
corrector.replace(node, "#{class_name} = Class.new(#{parent_class_name})")
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -42,6 +42,10 @@ module RuboCop
|
|
|
42
42
|
MSG = 'Use an empty string literal instead of heredoc.'
|
|
43
43
|
|
|
44
44
|
def on_heredoc(node)
|
|
45
|
+
# A backtick heredoc (`<<~`CMD``) executes a command, so it cannot be
|
|
46
|
+
# replaced with an empty string literal.
|
|
47
|
+
return if node.xstr_type?
|
|
48
|
+
|
|
45
49
|
heredoc_body = node.loc.heredoc_body
|
|
46
50
|
|
|
47
51
|
return unless heredoc_body.source.empty?
|
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
|
23
23
|
|
|
24
24
|
MSG = 'Omit parentheses for the empty lambda parameters.'
|
|
25
25
|
|
|
26
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
26
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler -- the offense is an empty `()`
|
|
27
27
|
send_node = node.send_node
|
|
28
28
|
return unless send_node.send_type?
|
|
29
29
|
|
|
@@ -6,6 +6,10 @@ module RuboCop
|
|
|
6
6
|
# Checks for the use of a method, the result of which
|
|
7
7
|
# would be a literal, like an empty array, hash, or string.
|
|
8
8
|
#
|
|
9
|
+
# NOTE: When frozen string literals are enabled, `String.new`
|
|
10
|
+
# isn't corrected to an empty string since the former is
|
|
11
|
+
# mutable and the latter would be frozen.
|
|
12
|
+
#
|
|
9
13
|
# @example
|
|
10
14
|
# # bad
|
|
11
15
|
# a = Array.new
|
|
@@ -40,13 +44,18 @@ module RuboCop
|
|
|
40
44
|
def_node_matcher :str_node, '(send (const {nil? cbase} :String) :new)'
|
|
41
45
|
|
|
42
46
|
# @!method array_with_block(node)
|
|
43
|
-
def_node_matcher :array_with_block,
|
|
47
|
+
def_node_matcher :array_with_block, <<~PATTERN
|
|
48
|
+
{
|
|
49
|
+
(block (send (const {nil? cbase} :Array) :new) args _)
|
|
50
|
+
({numblock itblock} (send (const {nil? cbase} :Array) :new) ...)
|
|
51
|
+
}
|
|
52
|
+
PATTERN
|
|
44
53
|
|
|
45
54
|
# @!method hash_with_block(node)
|
|
46
55
|
def_node_matcher :hash_with_block, <<~PATTERN
|
|
47
56
|
{
|
|
48
57
|
(block (send (const {nil? cbase} :Hash) :new) args _)
|
|
49
|
-
(numblock (send (const {nil? cbase} :Hash) :new) ...)
|
|
58
|
+
({numblock itblock} (send (const {nil? cbase} :Hash) :new) ...)
|
|
50
59
|
}
|
|
51
60
|
PATTERN
|
|
52
61
|
|