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
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks for indentation that doesn't use the specified number of spaces.
|
|
7
7
|
# The indentation width can be configured using the `Width` setting. The default width is 2.
|
|
8
|
+
# The block body indentation for method chain blocks can be configured using the
|
|
9
|
+
# `EnforcedStyleAlignWith` setting.
|
|
8
10
|
#
|
|
9
11
|
# See also the `Layout/IndentationConsistency` cop which is the companion to this one.
|
|
10
12
|
#
|
|
@@ -23,6 +25,17 @@ module RuboCop
|
|
|
23
25
|
# end
|
|
24
26
|
# end
|
|
25
27
|
#
|
|
28
|
+
# @example
|
|
29
|
+
# # bad
|
|
30
|
+
# value = (
|
|
31
|
+
# foo - bar
|
|
32
|
+
# )
|
|
33
|
+
#
|
|
34
|
+
# # good
|
|
35
|
+
# value = (
|
|
36
|
+
# foo - bar
|
|
37
|
+
# )
|
|
38
|
+
#
|
|
26
39
|
# @example AllowedPatterns: ['^\s*module']
|
|
27
40
|
# # bad
|
|
28
41
|
# module A
|
|
@@ -41,7 +54,22 @@ module RuboCop
|
|
|
41
54
|
# end
|
|
42
55
|
# end
|
|
43
56
|
# end
|
|
57
|
+
#
|
|
58
|
+
# @example EnforcedStyleAlignWith: start_of_line (default)
|
|
59
|
+
# # good
|
|
60
|
+
# records.uniq { |el| el[:profile_id] }
|
|
61
|
+
# .map do |message|
|
|
62
|
+
# SomeJob.perform_later(message[:id])
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# @example EnforcedStyleAlignWith: relative_to_receiver
|
|
66
|
+
# # good
|
|
67
|
+
# records.uniq { |el| el[:profile_id] }
|
|
68
|
+
# .map do |message|
|
|
69
|
+
# SomeJob.perform_later(message[:id])
|
|
70
|
+
# end
|
|
44
71
|
class IndentationWidth < Base # rubocop:disable Metrics/ClassLength
|
|
72
|
+
include ConfigurableEnforcedStyle
|
|
45
73
|
include EndKeywordAlignment
|
|
46
74
|
include Alignment
|
|
47
75
|
include CheckAssignment
|
|
@@ -50,7 +78,7 @@ module RuboCop
|
|
|
50
78
|
extend AutoCorrector
|
|
51
79
|
|
|
52
80
|
MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
|
|
53
|
-
'
|
|
81
|
+
'%<indentation_type>s for%<name>s indentation.'
|
|
54
82
|
|
|
55
83
|
# @!method access_modifier?(node)
|
|
56
84
|
def_node_matcher :access_modifier?, <<~PATTERN
|
|
@@ -78,19 +106,32 @@ module RuboCop
|
|
|
78
106
|
check_indentation(node.loc.end, node.children.first)
|
|
79
107
|
end
|
|
80
108
|
|
|
109
|
+
def on_begin(node)
|
|
110
|
+
# Only a parenthesized grouping expression (e.g. `(\n foo\n)`) has
|
|
111
|
+
# explicit delimiters. Indent the body one step from the line
|
|
112
|
+
# the opening parenthesis is on, but only when the closing parenthesis is
|
|
113
|
+
# first on its line (a body on the opening line is skipped downstream).
|
|
114
|
+
return unless parentheses?(node) && begins_its_line?(node.loc.end)
|
|
115
|
+
|
|
116
|
+
check_indentation(opening_line_start(node.loc.begin), node.children.first)
|
|
117
|
+
end
|
|
118
|
+
|
|
81
119
|
def on_block(node)
|
|
82
120
|
end_loc = node.loc.end
|
|
83
121
|
|
|
84
122
|
return unless begins_its_line?(end_loc)
|
|
85
123
|
|
|
86
|
-
|
|
124
|
+
base_loc = block_body_indentation_base(node, end_loc)
|
|
125
|
+
check_indentation(base_loc, node.body)
|
|
87
126
|
|
|
88
127
|
return unless indented_internal_methods_style?
|
|
128
|
+
return unless contains_access_modifier?(node.body)
|
|
89
129
|
|
|
90
130
|
check_members(end_loc, [node.body])
|
|
91
131
|
end
|
|
92
132
|
|
|
93
133
|
alias on_numblock on_block
|
|
134
|
+
alias on_itblock on_block
|
|
94
135
|
|
|
95
136
|
def on_class(node)
|
|
96
137
|
base = node.loc.keyword
|
|
@@ -144,7 +185,7 @@ module RuboCop
|
|
|
144
185
|
end
|
|
145
186
|
|
|
146
187
|
def on_case_match(case_match)
|
|
147
|
-
case_match.
|
|
188
|
+
case_match.in_pattern_branches.each do |in_pattern_node|
|
|
148
189
|
check_indentation(in_pattern_node.loc.keyword, in_pattern_node.body)
|
|
149
190
|
end
|
|
150
191
|
|
|
@@ -163,7 +204,18 @@ module RuboCop
|
|
|
163
204
|
private
|
|
164
205
|
|
|
165
206
|
def autocorrect(corrector, node)
|
|
166
|
-
|
|
207
|
+
return unless node
|
|
208
|
+
|
|
209
|
+
AlignmentCorrector.correct(
|
|
210
|
+
corrector, processed_source, node, @column_delta, tab_indentation: true
|
|
211
|
+
)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
# Returns a range at the first non-space column of the line the opening parenthesis is on,
|
|
215
|
+
# used as the base to indent the body from.
|
|
216
|
+
def opening_line_start(begin_loc)
|
|
217
|
+
column = begin_loc.source_line =~ /\S/
|
|
218
|
+
source_range(processed_source.buffer, begin_loc.line, column)
|
|
167
219
|
end
|
|
168
220
|
|
|
169
221
|
def check_members(base, members)
|
|
@@ -171,7 +223,7 @@ module RuboCop
|
|
|
171
223
|
|
|
172
224
|
return unless members.any? && members.first.begin_type?
|
|
173
225
|
|
|
174
|
-
if
|
|
226
|
+
if indented_internal_methods_style?
|
|
175
227
|
check_members_for_indented_internal_methods_style(members)
|
|
176
228
|
else
|
|
177
229
|
check_members_for_normal_style(base, members)
|
|
@@ -300,10 +352,32 @@ module RuboCop
|
|
|
300
352
|
end
|
|
301
353
|
|
|
302
354
|
def message(configured_indentation_width, indentation, name)
|
|
355
|
+
if using_tabs?
|
|
356
|
+
message_for_tabs(configured_indentation_width, indentation, name)
|
|
357
|
+
else
|
|
358
|
+
message_for_spaces(configured_indentation_width, indentation, name)
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def message_for_tabs(configured_indentation_width, indentation, name)
|
|
363
|
+
configured_tabs = 1
|
|
364
|
+
actual_tabs = indentation / configured_indentation_width
|
|
365
|
+
|
|
366
|
+
format(
|
|
367
|
+
MSG,
|
|
368
|
+
configured_indentation_width: configured_tabs,
|
|
369
|
+
indentation: actual_tabs,
|
|
370
|
+
indentation_type: 'tabs',
|
|
371
|
+
name: name
|
|
372
|
+
)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def message_for_spaces(configured_indentation_width, indentation, name)
|
|
303
376
|
format(
|
|
304
377
|
MSG,
|
|
305
378
|
configured_indentation_width: configured_indentation_width,
|
|
306
379
|
indentation: indentation,
|
|
380
|
+
indentation_type: 'spaces',
|
|
307
381
|
name: name
|
|
308
382
|
)
|
|
309
383
|
end
|
|
@@ -326,7 +400,7 @@ module RuboCop
|
|
|
326
400
|
if body_node.rescue_type?
|
|
327
401
|
check_rescue?(body_node)
|
|
328
402
|
elsif body_node.ensure_type?
|
|
329
|
-
block_body, = *body_node # rubocop:disable InternalAffairs/NodeDestructuring
|
|
403
|
+
block_body, = *body_node # rubocop:disable InternalAffairs/NodeDestructuring -- `EnsureNode` has no accessor for the protected body
|
|
330
404
|
if block_body&.rescue_type?
|
|
331
405
|
check_rescue?(block_body)
|
|
332
406
|
else
|
|
@@ -359,8 +433,14 @@ module RuboCop
|
|
|
359
433
|
def offending_range(body_node, indentation)
|
|
360
434
|
expr = body_node.source_range
|
|
361
435
|
begin_pos = expr.begin_pos
|
|
362
|
-
|
|
363
|
-
|
|
436
|
+
|
|
437
|
+
ind = if using_tabs?
|
|
438
|
+
begin_pos - line_indentation(expr).length
|
|
439
|
+
else
|
|
440
|
+
begin_pos - indentation
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
pos = ind <= begin_pos ? ind..begin_pos : begin_pos..ind
|
|
364
444
|
range_between(pos.begin, pos.end)
|
|
365
445
|
end
|
|
366
446
|
|
|
@@ -373,8 +453,47 @@ module RuboCop
|
|
|
373
453
|
starting_node.send_type? && starting_node.bare_access_modifier?
|
|
374
454
|
end
|
|
375
455
|
|
|
376
|
-
def
|
|
377
|
-
|
|
456
|
+
def contains_access_modifier?(body_node)
|
|
457
|
+
return false unless body_node&.begin_type?
|
|
458
|
+
|
|
459
|
+
body_node.children.any? { |child| child.send_type? && child.bare_access_modifier? }
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def indentation_style
|
|
463
|
+
config.for_cop('Layout/IndentationStyle')['EnforcedStyle'] || 'spaces'
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
def using_tabs?
|
|
467
|
+
indentation_style == 'tabs'
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
def column_offset_between(base_range, range)
|
|
471
|
+
return super unless using_tabs?
|
|
472
|
+
|
|
473
|
+
base_uses_tabs = line_uses_tabs?(base_range)
|
|
474
|
+
range_uses_tabs = line_uses_tabs?(range)
|
|
475
|
+
|
|
476
|
+
return super unless base_uses_tabs || range_uses_tabs
|
|
477
|
+
|
|
478
|
+
visual_column(base_range) - visual_column(range)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
def line_indentation(range)
|
|
482
|
+
line = processed_source.lines[range.line - 1]
|
|
483
|
+
line[0...range.column]
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
def line_uses_tabs?(range)
|
|
487
|
+
line_indentation(range).include?("\t")
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def visual_column(range)
|
|
491
|
+
indentation = line_indentation(range)
|
|
492
|
+
|
|
493
|
+
tab_count = indentation.count("\t")
|
|
494
|
+
space_count = indentation.count(' ')
|
|
495
|
+
|
|
496
|
+
(tab_count * configured_indentation_width) + space_count
|
|
378
497
|
end
|
|
379
498
|
|
|
380
499
|
def leftmost_modifier_of(node)
|
|
@@ -382,6 +501,34 @@ module RuboCop
|
|
|
382
501
|
|
|
383
502
|
leftmost_modifier_of(node.parent)
|
|
384
503
|
end
|
|
504
|
+
|
|
505
|
+
def block_body_indentation_base(node, end_loc)
|
|
506
|
+
return end_loc unless style == :relative_to_receiver
|
|
507
|
+
|
|
508
|
+
if dot_on_new_line?(node)
|
|
509
|
+
node.send_node.loc.dot
|
|
510
|
+
elsif selector_on_new_line?(node)
|
|
511
|
+
node.send_node.loc.selector
|
|
512
|
+
else
|
|
513
|
+
end_loc
|
|
514
|
+
end
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
def dot_on_new_line?(node)
|
|
518
|
+
send_node = node.send_node
|
|
519
|
+
return false unless send_node.loc?(:dot)
|
|
520
|
+
|
|
521
|
+
receiver = send_node.receiver
|
|
522
|
+
receiver && receiver.last_line < send_node.loc.dot.line
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
def selector_on_new_line?(node)
|
|
526
|
+
send_node = node.send_node
|
|
527
|
+
return false unless send_node.loc?(:dot) && send_node.loc?(:selector)
|
|
528
|
+
|
|
529
|
+
receiver = send_node.receiver
|
|
530
|
+
receiver && receiver.last_line < send_node.loc.selector.line
|
|
531
|
+
end
|
|
385
532
|
end
|
|
386
533
|
end
|
|
387
534
|
end
|
|
@@ -58,6 +58,12 @@ module RuboCop
|
|
|
58
58
|
# attr_reader :name #: String
|
|
59
59
|
# attr_reader :age #: Integer?
|
|
60
60
|
#
|
|
61
|
+
# #: (
|
|
62
|
+
# #| Integer,
|
|
63
|
+
# #| String
|
|
64
|
+
# #| ) -> void
|
|
65
|
+
# def foo; end
|
|
66
|
+
#
|
|
61
67
|
# @example AllowRBSInlineAnnotation: true
|
|
62
68
|
#
|
|
63
69
|
# # good
|
|
@@ -67,6 +73,12 @@ module RuboCop
|
|
|
67
73
|
# attr_reader :name #: String
|
|
68
74
|
# attr_reader :age #: Integer?
|
|
69
75
|
#
|
|
76
|
+
# #: (
|
|
77
|
+
# #| Integer,
|
|
78
|
+
# #| String
|
|
79
|
+
# #| ) -> void
|
|
80
|
+
# def foo; end
|
|
81
|
+
#
|
|
70
82
|
# @example AllowSteepAnnotation: false (default)
|
|
71
83
|
#
|
|
72
84
|
# # bad
|
|
@@ -86,6 +98,24 @@ module RuboCop
|
|
|
86
98
|
#
|
|
87
99
|
# name = 'John' #: String
|
|
88
100
|
#
|
|
101
|
+
# @example AllowYARDCommentBlockSeparator: false (default)
|
|
102
|
+
#
|
|
103
|
+
# # bad
|
|
104
|
+
#
|
|
105
|
+
# # Copyright (c) Example Corp
|
|
106
|
+
# #-
|
|
107
|
+
# class Client
|
|
108
|
+
# end
|
|
109
|
+
#
|
|
110
|
+
# @example AllowYARDCommentBlockSeparator: true
|
|
111
|
+
#
|
|
112
|
+
# # good
|
|
113
|
+
#
|
|
114
|
+
# # Copyright (c) Example Corp
|
|
115
|
+
# #-
|
|
116
|
+
# class Client
|
|
117
|
+
# end
|
|
118
|
+
#
|
|
89
119
|
class LeadingCommentSpace < Base
|
|
90
120
|
include RangeHelp
|
|
91
121
|
extend AutoCorrector
|
|
@@ -101,6 +131,7 @@ module RuboCop
|
|
|
101
131
|
next if gemfile_ruby_comment?(comment)
|
|
102
132
|
next if rbs_inline_annotation?(comment)
|
|
103
133
|
next if steep_annotation?(comment)
|
|
134
|
+
next if yard_comment_block_separator?(comment)
|
|
104
135
|
|
|
105
136
|
add_offense(comment) do |corrector|
|
|
106
137
|
expr = comment.source_range
|
|
@@ -175,7 +206,7 @@ module RuboCop
|
|
|
175
206
|
end
|
|
176
207
|
|
|
177
208
|
def rbs_inline_annotation?(comment)
|
|
178
|
-
allow_rbs_inline_annotation? && comment.text.start_with?(/#:|#\[.+\]
|
|
209
|
+
allow_rbs_inline_annotation? && comment.text.start_with?(/#:|#\[.+\]|#\|/)
|
|
179
210
|
end
|
|
180
211
|
|
|
181
212
|
def allow_steep_annotation?
|
|
@@ -185,6 +216,14 @@ module RuboCop
|
|
|
185
216
|
def steep_annotation?(comment)
|
|
186
217
|
allow_steep_annotation? && comment.text.start_with?(/#[$:]/)
|
|
187
218
|
end
|
|
219
|
+
|
|
220
|
+
def allow_yard_comment_block_separator?
|
|
221
|
+
cop_config['AllowYARDCommentBlockSeparator']
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def yard_comment_block_separator?(comment)
|
|
225
|
+
allow_yard_comment_block_separator? && comment.text.match?(/\A#-\s*\z/)
|
|
226
|
+
end
|
|
188
227
|
end
|
|
189
228
|
end
|
|
190
229
|
end
|
|
@@ -87,7 +87,7 @@ module RuboCop
|
|
|
87
87
|
corrector.replace(range, correction)
|
|
88
88
|
end
|
|
89
89
|
|
|
90
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
90
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
91
91
|
def ignored_literal_ranges(ast)
|
|
92
92
|
# which lines start inside a string literal?
|
|
93
93
|
return [] if ast.nil?
|
|
@@ -101,12 +101,11 @@ module RuboCop
|
|
|
101
101
|
ranges << loc.expression
|
|
102
102
|
elsif literal.heredoc?
|
|
103
103
|
ranges << loc.heredoc_body
|
|
104
|
-
elsif
|
|
104
|
+
elsif literal.loc?(:begin) || ignored_parent?(literal)
|
|
105
105
|
ranges << loc.expression
|
|
106
106
|
end
|
|
107
107
|
end
|
|
108
108
|
end
|
|
109
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
110
109
|
|
|
111
110
|
def comment_ranges(comments)
|
|
112
111
|
comments.map(&:source_range)
|
|
@@ -65,6 +65,7 @@ module RuboCop
|
|
|
65
65
|
include AllowedPattern
|
|
66
66
|
include RangeHelp
|
|
67
67
|
include LineLengthHelp
|
|
68
|
+
include EndlessMethodRewriter
|
|
68
69
|
extend AutoCorrector
|
|
69
70
|
|
|
70
71
|
exclude_limit 'Max'
|
|
@@ -75,6 +76,7 @@ module RuboCop
|
|
|
75
76
|
check_for_breakable_block(node)
|
|
76
77
|
end
|
|
77
78
|
alias on_numblock on_block
|
|
79
|
+
alias on_itblock on_block
|
|
78
80
|
|
|
79
81
|
def on_str(node)
|
|
80
82
|
check_for_breakable_str(node)
|
|
@@ -91,9 +93,22 @@ module RuboCop
|
|
|
91
93
|
alias on_hash on_potential_breakable_node
|
|
92
94
|
alias on_send on_potential_breakable_node
|
|
93
95
|
alias on_csend on_potential_breakable_node
|
|
94
|
-
|
|
96
|
+
|
|
97
|
+
def on_def(node)
|
|
98
|
+
if node.endless?
|
|
99
|
+
track_endless_method(node)
|
|
100
|
+
else
|
|
101
|
+
check_for_breakable_node(node)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
alias on_defs on_def
|
|
95
105
|
|
|
96
106
|
def on_new_investigation
|
|
107
|
+
@breakable_range_by_line_index = {}
|
|
108
|
+
@breakable_string_delimiters = {}
|
|
109
|
+
@endless_methods_by_line = {}
|
|
110
|
+
@heredocs = nil
|
|
111
|
+
|
|
97
112
|
return unless processed_source.raw_source.include?(';')
|
|
98
113
|
|
|
99
114
|
check_for_breakable_semicolons(processed_source)
|
|
@@ -109,6 +124,70 @@ module RuboCop
|
|
|
109
124
|
|
|
110
125
|
attr_accessor :breakable_range
|
|
111
126
|
|
|
127
|
+
def track_endless_method(node)
|
|
128
|
+
line_index = node.first_line - processed_source.buffer.first_line
|
|
129
|
+
endless_methods_by_line[line_index] = node
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def handle_endless_method_line(line, line_index)
|
|
133
|
+
if require_endless_methods?
|
|
134
|
+
return register_required_endless_method_offense(line, line_index)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
register_endless_method_offense(line, line_index)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def require_endless_methods?
|
|
141
|
+
config.cop_enabled?('Style/EndlessMethod') &&
|
|
142
|
+
config.for_cop('Style/EndlessMethod')['EnforcedStyle'] == 'require_always'
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def register_endless_method_offense(line, line_index)
|
|
146
|
+
message = format(MSG, length: line_length(line), max: max)
|
|
147
|
+
loc = excess_range(nil, line, line_index)
|
|
148
|
+
|
|
149
|
+
add_offense(loc, message: message) do |corrector|
|
|
150
|
+
self.max = line_length(line)
|
|
151
|
+
|
|
152
|
+
correct_to_multiline(corrector, endless_methods_by_line[line_index])
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def register_required_endless_method_offense(line, line_index)
|
|
157
|
+
node = endless_methods_by_line[line_index]
|
|
158
|
+
loc = excess_range(nil, line, line_index)
|
|
159
|
+
|
|
160
|
+
add_offense(loc, message: format(MSG, length: line_length(line), max: max)) do |corrector|
|
|
161
|
+
self.max = line_length(line)
|
|
162
|
+
|
|
163
|
+
if correctable_endless_method_block?(node)
|
|
164
|
+
correct_endless_method_block_to_multiline(corrector, node)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def correctable_endless_method_block?(node)
|
|
170
|
+
block_node = node.body
|
|
171
|
+
|
|
172
|
+
block_node&.type?(:any_block) &&
|
|
173
|
+
block_node.braces? &&
|
|
174
|
+
block_node.single_line? &&
|
|
175
|
+
block_node.body &&
|
|
176
|
+
!receiver_contains_heredoc?(block_node)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def correct_endless_method_block_to_multiline(corrector, node)
|
|
180
|
+
block_node = node.body
|
|
181
|
+
block_arguments = block_node.arguments? ? " #{block_node.arguments.source}" : ''
|
|
182
|
+
replacement = [
|
|
183
|
+
"#{block_node.send_node.source} do#{block_arguments}",
|
|
184
|
+
"#{indent(node, offset: 2)}#{block_node.body.source}",
|
|
185
|
+
"#{indent(node)}end"
|
|
186
|
+
].join("\n")
|
|
187
|
+
|
|
188
|
+
corrector.replace(block_node, replacement)
|
|
189
|
+
end
|
|
190
|
+
|
|
112
191
|
def check_for_breakable_node(node)
|
|
113
192
|
breakable_node = extract_breakable_node(node, max)
|
|
114
193
|
return if breakable_node.nil?
|
|
@@ -132,6 +211,7 @@ module RuboCop
|
|
|
132
211
|
|
|
133
212
|
def check_for_breakable_block(block_node)
|
|
134
213
|
return unless block_node.single_line?
|
|
214
|
+
return if receiver_contains_heredoc?(block_node)
|
|
135
215
|
|
|
136
216
|
line_index = block_node.loc.line - 1
|
|
137
217
|
range = breakable_block_range(block_node)
|
|
@@ -209,11 +289,11 @@ module RuboCop
|
|
|
209
289
|
# are not bisected.
|
|
210
290
|
# If the string contains spaces, use them to determine a place for a clean break;
|
|
211
291
|
# otherwise, the string will be broken at the line length limit.
|
|
212
|
-
def breakable_string_range(node)
|
|
292
|
+
def breakable_string_range(node)
|
|
213
293
|
source_range = node.source_range
|
|
214
294
|
relevant_substr = largest_possible_string(node)
|
|
215
295
|
|
|
216
|
-
if (space_pos = relevant_substr
|
|
296
|
+
if (space_pos = breakable_space_position(node, relevant_substr))
|
|
217
297
|
source_range.resize(space_pos + 1)
|
|
218
298
|
elsif (escape_pos = relevant_substr.rindex(/\\(u[\da-f]{0,4}|x[\da-f]{0,2})?\z/))
|
|
219
299
|
source_range.resize(escape_pos)
|
|
@@ -221,19 +301,36 @@ module RuboCop
|
|
|
221
301
|
adjustment = max - source_range.last_column - 3
|
|
222
302
|
return if adjustment.abs > source_range.size
|
|
223
303
|
|
|
224
|
-
source_range.adjust(end_pos:
|
|
304
|
+
source_range.adjust(end_pos: adjustment)
|
|
225
305
|
end
|
|
226
306
|
end
|
|
227
307
|
|
|
308
|
+
def breakable_space_position(node, substr)
|
|
309
|
+
limit = string_content_length(node) - 1
|
|
310
|
+
space_pos = substr.rindex(/\s/)
|
|
311
|
+
space_pos = substr[0, limit].rindex(/\s/) if space_pos && space_pos + 1 > limit
|
|
312
|
+
space_pos
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def string_content_length(node)
|
|
316
|
+
content_end = node.loc?(:end) ? node.loc.end.begin_pos : node.source_range.end_pos
|
|
317
|
+
|
|
318
|
+
content_end - node.source_range.begin_pos
|
|
319
|
+
end
|
|
320
|
+
|
|
228
321
|
def breakable_dstr_begin_position(node)
|
|
229
322
|
source_range = node.source_range
|
|
230
|
-
source_range.begin_pos if source_range.
|
|
323
|
+
source_range.begin_pos if source_range.column < max && source_range.last_column >= max
|
|
231
324
|
end
|
|
232
325
|
|
|
233
326
|
def breakable_range_by_line_index
|
|
234
327
|
@breakable_range_by_line_index ||= {}
|
|
235
328
|
end
|
|
236
329
|
|
|
330
|
+
def endless_methods_by_line
|
|
331
|
+
@endless_methods_by_line ||= {}
|
|
332
|
+
end
|
|
333
|
+
|
|
237
334
|
def breakable_string_delimiters
|
|
238
335
|
@breakable_string_delimiters ||= {}
|
|
239
336
|
end
|
|
@@ -249,14 +346,23 @@ module RuboCop
|
|
|
249
346
|
[max - indentation_difference(line), 0].max
|
|
250
347
|
end
|
|
251
348
|
|
|
349
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
252
350
|
def check_line(line, line_index)
|
|
253
351
|
return if line_length(line) <= max
|
|
254
352
|
return if allowed_line?(line, line_index)
|
|
255
353
|
|
|
256
|
-
if
|
|
354
|
+
if endless_methods_by_line.key?(line_index)
|
|
355
|
+
return handle_endless_method_line(line, line_index)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
if allow_rbs_inline_annotation? && rbs_inline_annotation_on_source_line?(line_index)
|
|
359
|
+
return
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
if allow_cop_directives? && directive_on_source_line?(line_index)
|
|
257
363
|
return check_directive_line(line, line_index)
|
|
258
364
|
end
|
|
259
|
-
return
|
|
365
|
+
return check_line_for_exemptions(line, line_index) if allow_uri? || allow_qualified_name?
|
|
260
366
|
|
|
261
367
|
register_offense(excess_range(nil, line, line_index), line, line_index)
|
|
262
368
|
end
|
|
@@ -303,10 +409,7 @@ module RuboCop
|
|
|
303
409
|
def max
|
|
304
410
|
cop_config['Max']
|
|
305
411
|
end
|
|
306
|
-
|
|
307
|
-
def allow_heredoc?
|
|
308
|
-
allowed_heredoc
|
|
309
|
-
end
|
|
412
|
+
alias max_line_length max
|
|
310
413
|
|
|
311
414
|
def allowed_heredoc
|
|
312
415
|
cop_config['AllowHeredoc']
|
|
@@ -319,7 +422,7 @@ module RuboCop
|
|
|
319
422
|
def extract_heredocs(ast)
|
|
320
423
|
return [] unless ast
|
|
321
424
|
|
|
322
|
-
ast.each_node(:
|
|
425
|
+
ast.each_node(:any_str).select(&:heredoc?).map do |node|
|
|
323
426
|
body = node.location.heredoc_body
|
|
324
427
|
delimiter = node.location.heredoc_end.source.strip
|
|
325
428
|
[body.first_line...body.last_line, delimiter]
|
|
@@ -335,8 +438,11 @@ module RuboCop
|
|
|
335
438
|
end
|
|
336
439
|
end
|
|
337
440
|
|
|
338
|
-
def
|
|
339
|
-
|
|
441
|
+
def receiver_contains_heredoc?(node)
|
|
442
|
+
return false unless (receiver = node.receiver)
|
|
443
|
+
return true if receiver.any_str_type? && receiver.heredoc?
|
|
444
|
+
|
|
445
|
+
receiver.each_descendant(:any_str).any?(&:heredoc?)
|
|
340
446
|
end
|
|
341
447
|
|
|
342
448
|
def check_directive_line(line, line_index)
|
|
@@ -356,11 +462,32 @@ module RuboCop
|
|
|
356
462
|
)
|
|
357
463
|
end
|
|
358
464
|
|
|
359
|
-
def
|
|
360
|
-
uri_range
|
|
361
|
-
|
|
465
|
+
def check_line_for_exemptions(line, line_index)
|
|
466
|
+
uri_range = range_if_applicable(line, :uri)
|
|
467
|
+
qualified_name_range = range_if_applicable(line, :qualified_name)
|
|
468
|
+
|
|
469
|
+
return if allowed_combination?(line, uri_range, qualified_name_range)
|
|
470
|
+
|
|
471
|
+
range = uri_range || qualified_name_range
|
|
472
|
+
register_offense(excess_range(range, line, line_index), line, line_index)
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
def range_if_applicable(line, type)
|
|
476
|
+
return unless type == :uri ? allow_uri? : allow_qualified_name?
|
|
362
477
|
|
|
363
|
-
|
|
478
|
+
find_excessive_range(line, type)
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
def allowed_combination?(line, uri_range, qualified_name_range)
|
|
482
|
+
if uri_range && qualified_name_range
|
|
483
|
+
allowed_position?(line, uri_range) && allowed_position?(line, qualified_name_range)
|
|
484
|
+
elsif uri_range
|
|
485
|
+
allowed_position?(line, uri_range)
|
|
486
|
+
elsif qualified_name_range
|
|
487
|
+
allowed_position?(line, qualified_name_range)
|
|
488
|
+
else
|
|
489
|
+
false
|
|
490
|
+
end
|
|
364
491
|
end
|
|
365
492
|
|
|
366
493
|
def breakable_dstr?(node)
|
|
@@ -369,9 +496,11 @@ module RuboCop
|
|
|
369
496
|
end
|
|
370
497
|
|
|
371
498
|
def string_delimiter(node)
|
|
372
|
-
delimiter = node.loc
|
|
373
|
-
|
|
374
|
-
|
|
499
|
+
delimiter = if node.loc?(:begin)
|
|
500
|
+
node.loc.begin
|
|
501
|
+
elsif node.parent&.dstr_type? && node.parent.loc?(:begin)
|
|
502
|
+
node.parent.loc.begin
|
|
503
|
+
end&.source
|
|
375
504
|
|
|
376
505
|
delimiter if %w[' "].include?(delimiter)
|
|
377
506
|
end
|
|
@@ -381,8 +510,16 @@ module RuboCop
|
|
|
381
510
|
# The maximum allowed length of a string value is:
|
|
382
511
|
# `Max` - end delimiter (quote) - continuation characters (space and slash)
|
|
383
512
|
max_length = max - 3
|
|
384
|
-
#
|
|
385
|
-
|
|
513
|
+
# Offset by the string's starting column so the broken line actually fits
|
|
514
|
+
# within `Max`. When on the same line as its parent, use the column difference;
|
|
515
|
+
# otherwise the string is indented on its own line, so subtract that indentation.
|
|
516
|
+
# (Without this, an indented string under a multi-line parent never shortens
|
|
517
|
+
# below `Max` and the autocorrect loops, inserting empty `"" \` fragments.)
|
|
518
|
+
max_length -= if same_line?(node, node.parent)
|
|
519
|
+
column_offset_between(node.loc, node.parent.loc)
|
|
520
|
+
else
|
|
521
|
+
node.loc.column
|
|
522
|
+
end
|
|
386
523
|
node.source[0...(max_length)]
|
|
387
524
|
end
|
|
388
525
|
end
|