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
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
|
48
48
|
|
|
49
49
|
args = process_args(node.arguments)
|
|
50
50
|
return extract_breakable_node_from_elements(node, args, max)
|
|
51
|
-
elsif node.
|
|
51
|
+
elsif node.any_def_type?
|
|
52
52
|
return extract_breakable_node_from_elements(node, node.arguments, max)
|
|
53
53
|
elsif node.type?(:array, :hash)
|
|
54
54
|
return extract_breakable_node_from_elements(node, node.children, max)
|
|
@@ -61,11 +61,13 @@ module RuboCop
|
|
|
61
61
|
# @api private
|
|
62
62
|
def extract_breakable_node_from_elements(node, elements, max)
|
|
63
63
|
return unless breakable_collection?(node, elements)
|
|
64
|
-
return if safe_to_ignore?(node)
|
|
65
64
|
|
|
65
|
+
# Check the cheap conditions first, `safe_to_ignore?` may traverse all elements of
|
|
66
|
+
# a containing collection.
|
|
66
67
|
line = processed_source.lines[node.first_line - 1]
|
|
68
|
+
return if max && line.length <= max
|
|
67
69
|
return if processed_source.line_with_comment?(node.loc.line)
|
|
68
|
-
return if
|
|
70
|
+
return if safe_to_ignore?(node)
|
|
69
71
|
|
|
70
72
|
extract_first_element_over_column_limit(node, elements, max)
|
|
71
73
|
end
|
|
@@ -173,20 +175,36 @@ module RuboCop
|
|
|
173
175
|
node.each_ancestor.find do |ancestor|
|
|
174
176
|
if ancestor.type?(:hash, :array) &&
|
|
175
177
|
breakable_collection?(ancestor, ancestor.children)
|
|
176
|
-
return children_could_be_broken_up?(ancestor.children)
|
|
178
|
+
return children_could_be_broken_up?(ancestor, ancestor.children)
|
|
177
179
|
end
|
|
178
180
|
|
|
179
181
|
next unless ancestor.call_type?
|
|
180
182
|
|
|
181
183
|
args = process_args(ancestor.arguments)
|
|
182
|
-
|
|
184
|
+
if breakable_collection?(ancestor, args)
|
|
185
|
+
return children_could_be_broken_up?(ancestor, args)
|
|
186
|
+
end
|
|
183
187
|
end
|
|
184
188
|
|
|
185
189
|
false
|
|
186
190
|
end
|
|
187
191
|
|
|
188
192
|
# @api private
|
|
189
|
-
|
|
193
|
+
# The result depends only on the given node, but the check may traverse all children of
|
|
194
|
+
# a large collection and is repeated for each contained element, so memoize it per node.
|
|
195
|
+
def children_could_be_broken_up?(node, children)
|
|
196
|
+
if @check_line_breakable_processed_source != processed_source
|
|
197
|
+
@check_line_breakable_processed_source = processed_source
|
|
198
|
+
@children_could_be_broken_up_cache = {}.compare_by_identity
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
@children_could_be_broken_up_cache.fetch(node) do
|
|
202
|
+
@children_could_be_broken_up_cache[node] = compute_children_could_be_broken_up?(children)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# @api private
|
|
207
|
+
def compute_children_could_be_broken_up?(children)
|
|
190
208
|
return false if all_on_same_line?(children)
|
|
191
209
|
|
|
192
210
|
last_seen_line = -1
|
|
@@ -220,14 +238,14 @@ module RuboCop
|
|
|
220
238
|
|
|
221
239
|
# @api private
|
|
222
240
|
def already_on_multiple_lines?(node)
|
|
223
|
-
return node.first_line != node.last_argument.last_line if node.
|
|
241
|
+
return node.first_line != node.last_argument.last_line if node.any_def_type?
|
|
224
242
|
|
|
225
|
-
|
|
243
|
+
node.multiline?
|
|
226
244
|
end
|
|
227
245
|
|
|
228
246
|
def chained_to_heredoc?(node)
|
|
229
247
|
while (node = node.receiver)
|
|
230
|
-
return true if node.
|
|
248
|
+
return true if node.any_str_type? && node.heredoc?
|
|
231
249
|
end
|
|
232
250
|
|
|
233
251
|
false
|
|
@@ -14,6 +14,8 @@ module RuboCop
|
|
|
14
14
|
private
|
|
15
15
|
|
|
16
16
|
def too_long?(node)
|
|
17
|
+
return false unless max_line_length
|
|
18
|
+
|
|
17
19
|
lines = processed_source.lines[(node.first_line - 1)...node.last_line]
|
|
18
20
|
to_single_line(lines.join("\n")).length > max_line_length
|
|
19
21
|
end
|
|
@@ -27,22 +29,18 @@ module RuboCop
|
|
|
27
29
|
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
|
28
30
|
end
|
|
29
31
|
|
|
30
|
-
def max_line_length
|
|
31
|
-
config.for_cop('Layout/LineLength')['Max']
|
|
32
|
-
end
|
|
33
|
-
|
|
34
32
|
def comment_within?(node)
|
|
35
33
|
comment_line_numbers = processed_source.comments.map { |comment| comment.loc.line }
|
|
36
34
|
|
|
37
35
|
comment_line_numbers.any? do |comment_line_number|
|
|
38
|
-
comment_line_number
|
|
36
|
+
comment_line_number.between?(node.first_line, node.last_line)
|
|
39
37
|
end
|
|
40
38
|
end
|
|
41
39
|
|
|
42
40
|
def safe_to_split?(node)
|
|
43
|
-
node.each_descendant(:if, :case, :kwbegin, :
|
|
41
|
+
node.each_descendant(:if, :case, :kwbegin, :any_def, :rescue, :ensure).none? &&
|
|
44
42
|
node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
|
|
45
|
-
node.each_descendant(:begin, :sym).none?
|
|
43
|
+
node.each_descendant(:begin, :sym).none?(&:multiline?)
|
|
46
44
|
end
|
|
47
45
|
end
|
|
48
46
|
end
|
|
@@ -59,7 +59,7 @@ module RuboCop
|
|
|
59
59
|
return node.loc.name if node.casgn_type?
|
|
60
60
|
|
|
61
61
|
if LSP.enabled?
|
|
62
|
-
end_range = node.loc
|
|
62
|
+
end_range = node.loc?(:name) ? node.loc.name : node.loc.begin
|
|
63
63
|
node.source_range.begin.join(end_range)
|
|
64
64
|
else
|
|
65
65
|
node.source_range
|
|
@@ -64,7 +64,7 @@ module RuboCop
|
|
|
64
64
|
# Returns the end line of a node, which might be a comment and not part of the AST
|
|
65
65
|
# End line is considered either the line at which another node starts, or
|
|
66
66
|
# the line at which the parent node ends.
|
|
67
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
67
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
68
68
|
def find_end_line(node)
|
|
69
69
|
if node.if_type?
|
|
70
70
|
if node.else?
|
|
@@ -82,14 +82,13 @@ module RuboCop
|
|
|
82
82
|
next_sibling.source_range
|
|
83
83
|
next_sibling.loc.line
|
|
84
84
|
elsif (parent = node.parent)
|
|
85
|
-
if parent.loc
|
|
85
|
+
if parent.loc?(:end)
|
|
86
86
|
parent.loc.end.line
|
|
87
87
|
else
|
|
88
88
|
parent.loc.line
|
|
89
89
|
end
|
|
90
90
|
end || node.loc.end.line
|
|
91
91
|
end
|
|
92
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
93
92
|
end
|
|
94
93
|
end
|
|
95
94
|
end
|
|
@@ -25,7 +25,7 @@ module RuboCop
|
|
|
25
25
|
end
|
|
26
26
|
private_constant :SYMBOL_TO_STRING_CACHE
|
|
27
27
|
|
|
28
|
-
# rubocop:disable Metrics
|
|
28
|
+
# rubocop:disable-next Metrics
|
|
29
29
|
def style_detected(detected)
|
|
30
30
|
return if no_acceptable_style?
|
|
31
31
|
|
|
@@ -51,7 +51,6 @@ module RuboCop
|
|
|
51
51
|
config_to_allow_offenses[style_parameter_name] = updated_list.first
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
|
-
# rubocop:enable Metrics
|
|
55
54
|
|
|
56
55
|
def no_acceptable_style?
|
|
57
56
|
config_to_allow_offenses['Enabled'] == false
|
|
@@ -13,11 +13,12 @@ module RuboCop
|
|
|
13
13
|
`max=` is deprecated. Use `exclude_limit <ParameterName>` instead.
|
|
14
14
|
WARNING
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
cop_dir = RuboCop::ExcludeLimit.cop_dir_for(self.class.badge.to_s)
|
|
17
|
+
return unless cop_dir
|
|
18
|
+
|
|
19
|
+
cop_dir.mkpath
|
|
20
|
+
filepath = cop_dir.join(max_parameter_name)
|
|
21
|
+
filepath.write("#{value}\n", mode: 'a')
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
def max_parameter_name
|
|
@@ -19,7 +19,7 @@ module RuboCop
|
|
|
19
19
|
|
|
20
20
|
# @!method non_public_modifier?(node)
|
|
21
21
|
def_node_matcher :non_public_modifier?, <<~PATTERN
|
|
22
|
-
(send nil? {:private :protected :private_class_method} (
|
|
22
|
+
(send nil? {:private :protected :private_class_method} (any_def ...))
|
|
23
23
|
PATTERN
|
|
24
24
|
end
|
|
25
25
|
end
|
|
@@ -21,7 +21,7 @@ module RuboCop
|
|
|
21
21
|
|
|
22
22
|
# @!method empty_line_required?(node)
|
|
23
23
|
def_node_matcher :empty_line_required?,
|
|
24
|
-
'{
|
|
24
|
+
'{any_def class module (send nil? {:private :protected :public})}'
|
|
25
25
|
|
|
26
26
|
def check(node, body, adjusted_first_line: nil)
|
|
27
27
|
return if valid_body_style?(body)
|
|
@@ -19,8 +19,7 @@ module RuboCop
|
|
|
19
19
|
def check_end_kw_alignment(node, align_ranges)
|
|
20
20
|
return if ignored_node?(node)
|
|
21
21
|
|
|
22
|
-
end_loc = node.loc.end
|
|
23
|
-
return if accept_end_kw_alignment?(end_loc)
|
|
22
|
+
return unless (end_loc = node.loc.end)
|
|
24
23
|
|
|
25
24
|
matching = matching_ranges(end_loc, align_ranges)
|
|
26
25
|
|
|
@@ -57,11 +56,6 @@ module RuboCop
|
|
|
57
56
|
add_offense(end_loc, message: msg) { |corrector| autocorrect(corrector, node) }
|
|
58
57
|
end
|
|
59
58
|
|
|
60
|
-
def accept_end_kw_alignment?(end_loc)
|
|
61
|
-
end_loc.nil? || # Discard modifier forms of if/while/until.
|
|
62
|
-
!/\A[ \t]*end/.match?(processed_source.lines[end_loc.line - 1])
|
|
63
|
-
end
|
|
64
|
-
|
|
65
59
|
def style_parameter_name
|
|
66
60
|
'EnforcedStyleAlignWith'
|
|
67
61
|
end
|
|
@@ -5,20 +5,28 @@ module RuboCop
|
|
|
5
5
|
# Common functionality for rewriting endless methods to normal method definitions
|
|
6
6
|
module EndlessMethodRewriter
|
|
7
7
|
def correct_to_multiline(corrector, node)
|
|
8
|
-
replacement =
|
|
9
|
-
def #{node.method_name}#{arguments(node)}
|
|
10
|
-
|
|
11
|
-
end
|
|
12
|
-
|
|
8
|
+
replacement = [
|
|
9
|
+
"def #{receiver(node)}#{node.method_name}#{arguments(node)}",
|
|
10
|
+
"#{indent(node, offset: configured_indentation_width)}#{node.body.source}",
|
|
11
|
+
"#{indent(node)}end"
|
|
12
|
+
].join("\n")
|
|
13
13
|
|
|
14
14
|
corrector.replace(node, replacement)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
private
|
|
18
18
|
|
|
19
|
+
def receiver(node)
|
|
20
|
+
node.receiver ? "#{node.receiver.source}#{node.loc.operator.source}" : ''
|
|
21
|
+
end
|
|
22
|
+
|
|
19
23
|
def arguments(node, missing = '')
|
|
20
24
|
node.arguments.any? ? node.arguments.source : missing
|
|
21
25
|
end
|
|
26
|
+
|
|
27
|
+
def configured_indentation_width
|
|
28
|
+
cop_config['IndentationWidth'] || config.for_cop('Layout/IndentationWidth')['Width'] || 2
|
|
29
|
+
end
|
|
22
30
|
end
|
|
23
31
|
end
|
|
24
32
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This module encapsulates the ability to forbid certain identifiers in a cop.
|
|
6
|
+
module ForbiddenIdentifiers
|
|
7
|
+
SIGILS = '@$' # if a variable starts with a sigil it will be removed
|
|
8
|
+
|
|
9
|
+
def forbidden_identifier?(name)
|
|
10
|
+
name = name.to_s.delete(SIGILS)
|
|
11
|
+
|
|
12
|
+
forbidden_identifiers.any? && forbidden_identifiers.include?(name)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def forbidden_identifiers
|
|
16
|
+
cop_config.fetch('ForbiddenIdentifiers', [])
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# This module encapsulates the ability to forbid certain patterns in a cop.
|
|
6
|
+
module ForbiddenPattern
|
|
7
|
+
def forbidden_pattern?(name)
|
|
8
|
+
forbidden_pattern_regexps.any? { |pattern| pattern.match?(name) }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def forbidden_patterns
|
|
12
|
+
cop_config.fetch('ForbiddenPatterns', [])
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def forbidden_pattern_regexps
|
|
16
|
+
@forbidden_pattern_regexps ||= forbidden_patterns.map { |pattern| Regexp.new(pattern) }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -6,7 +6,6 @@ module RuboCop
|
|
|
6
6
|
module FrozenStringLiteral
|
|
7
7
|
module_function
|
|
8
8
|
|
|
9
|
-
FROZEN_STRING_LITERAL_REGEXP = /#\s*frozen[-_]?string[-_]?literal:/i.freeze
|
|
10
9
|
FROZEN_STRING_LITERAL_ENABLED = '# frozen_string_literal: true'
|
|
11
10
|
FROZEN_STRING_LITERAL_TYPES_RUBY27 = %i[str dstr].freeze
|
|
12
11
|
|
|
@@ -90,7 +89,7 @@ module RuboCop
|
|
|
90
89
|
|
|
91
90
|
if first_non_comment_token
|
|
92
91
|
# `line` is 1-indexed so we need to subtract 1 to get the array index
|
|
93
|
-
processed_source.lines[0...first_non_comment_token.line - 1]
|
|
92
|
+
processed_source.lines[0...(first_non_comment_token.line - 1)]
|
|
94
93
|
else
|
|
95
94
|
processed_source.lines
|
|
96
95
|
end
|
|
@@ -25,6 +25,28 @@ module RuboCop
|
|
|
25
25
|
(args
|
|
26
26
|
(arg $_)) ...)
|
|
27
27
|
PATTERN
|
|
28
|
+
|
|
29
|
+
# @!method assignment_method_declarations(node)
|
|
30
|
+
def_node_search :assignment_method_declarations, <<~PATTERN
|
|
31
|
+
(send
|
|
32
|
+
(lvar {#match_block_variable_name? :_1 :it}) _ ...)
|
|
33
|
+
PATTERN
|
|
34
|
+
|
|
35
|
+
# @!method indexed_assignment_method_declarations(node)
|
|
36
|
+
def_node_search :indexed_assignment_method_declarations, <<~PATTERN
|
|
37
|
+
(send
|
|
38
|
+
(send (lvar {#match_block_variable_name? :_1 :it}) _)
|
|
39
|
+
:[]=
|
|
40
|
+
literal?
|
|
41
|
+
_
|
|
42
|
+
)
|
|
43
|
+
PATTERN
|
|
44
|
+
|
|
45
|
+
def match_block_variable_name?(receiver_name)
|
|
46
|
+
gem_specification(processed_source.ast) do |block_variable_name|
|
|
47
|
+
return block_variable_name == receiver_name
|
|
48
|
+
end
|
|
49
|
+
end
|
|
28
50
|
end
|
|
29
51
|
end
|
|
30
52
|
end
|
|
@@ -10,7 +10,7 @@ module RuboCop
|
|
|
10
10
|
true
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def deltas_for_first_pair(first_pair
|
|
13
|
+
def deltas_for_first_pair(first_pair)
|
|
14
14
|
{
|
|
15
15
|
separator: separator_delta(first_pair),
|
|
16
16
|
value: value_delta(first_pair)
|
|
@@ -55,7 +55,7 @@ module RuboCop
|
|
|
55
55
|
# Common functionality for checking alignment of hash values.
|
|
56
56
|
module ValueAlignment
|
|
57
57
|
def checkable_layout?(node)
|
|
58
|
-
!node.pairs_on_same_line? && !node.mixed_delimiters?
|
|
58
|
+
!node.pairs_on_same_line? && !node.mixed_delimiters? && alignable_values?(node)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def deltas(first_pair, current_pair)
|
|
@@ -68,6 +68,16 @@ module RuboCop
|
|
|
68
68
|
|
|
69
69
|
private
|
|
70
70
|
|
|
71
|
+
def alignable_values?(node)
|
|
72
|
+
return false if node.pairs.first.value_omission?
|
|
73
|
+
|
|
74
|
+
node.pairs.none? { |pair| value_on_later_line?(pair) }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def value_on_later_line?(pair)
|
|
78
|
+
pair.value && pair.key.last_line != pair.value.first_line
|
|
79
|
+
end
|
|
80
|
+
|
|
71
81
|
def separator_delta(first_pair, current_pair, key_delta)
|
|
72
82
|
if current_pair.hash_rocket?
|
|
73
83
|
hash_rocket_delta(first_pair, current_pair) - key_delta
|
|
@@ -81,13 +91,7 @@ module RuboCop
|
|
|
81
91
|
class TableAlignment
|
|
82
92
|
include ValueAlignment
|
|
83
93
|
|
|
84
|
-
def
|
|
85
|
-
self.max_key_width = 0
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def deltas_for_first_pair(first_pair, node)
|
|
89
|
-
self.max_key_width = node.keys.map { |key| key.source.length }.max
|
|
90
|
-
|
|
94
|
+
def deltas_for_first_pair(first_pair)
|
|
91
95
|
separator_delta = separator_delta(first_pair, first_pair, 0)
|
|
92
96
|
{
|
|
93
97
|
separator: separator_delta,
|
|
@@ -97,30 +101,54 @@ module RuboCop
|
|
|
97
101
|
|
|
98
102
|
private
|
|
99
103
|
|
|
100
|
-
attr_accessor :max_key_width
|
|
101
|
-
|
|
102
104
|
def key_delta(first_pair, current_pair)
|
|
103
105
|
first_pair.key_delta(current_pair)
|
|
104
106
|
end
|
|
105
107
|
|
|
106
108
|
def hash_rocket_delta(first_pair, current_pair)
|
|
107
|
-
first_pair
|
|
109
|
+
target_operator_column(first_pair) - current_pair.loc.operator.column
|
|
108
110
|
end
|
|
109
111
|
|
|
110
112
|
def value_delta(first_pair, current_pair)
|
|
111
|
-
correct_value_column = first_pair
|
|
112
|
-
|
|
113
|
-
max_key_width
|
|
113
|
+
correct_value_column = target_operator_column(first_pair) +
|
|
114
|
+
max_delimiter_width(first_pair.parent) - 1
|
|
114
115
|
|
|
115
116
|
current_pair.value_omission? ? 0 : correct_value_column - current_pair.value.loc.column
|
|
116
117
|
end
|
|
118
|
+
|
|
119
|
+
# The column the separator should land on: the shared key margin
|
|
120
|
+
# plus the widest single-line key, or, if larger, a multiline key's
|
|
121
|
+
# own last-line end column. The latter can't be measured from a
|
|
122
|
+
# multiline key's (newline-including) source length, so it's a
|
|
123
|
+
# separate candidate rather than folded into `max_key_width`.
|
|
124
|
+
def target_operator_column(first_pair)
|
|
125
|
+
hash_node = first_pair.parent
|
|
126
|
+
candidates = multiline_key_end_columns(hash_node)
|
|
127
|
+
|
|
128
|
+
key_width = max_key_width(hash_node)
|
|
129
|
+
candidates << (first_pair.loc.column + key_width + 1) if key_width.positive?
|
|
130
|
+
|
|
131
|
+
candidates.max
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def multiline_key_end_columns(hash_node)
|
|
135
|
+
hash_node.keys.reject(&:single_line?).map { |key| key.source_range.end.column + 1 }
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def max_key_width(hash_node)
|
|
139
|
+
hash_node.keys.select(&:single_line?).map { |key| key.source.length }.max || 0
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def max_delimiter_width(hash_node)
|
|
143
|
+
hash_node.pairs.map { |pair| pair.delimiter(true).length }.max
|
|
144
|
+
end
|
|
117
145
|
end
|
|
118
146
|
|
|
119
147
|
# Handles calculation of deltas when the enforced style is 'separator'.
|
|
120
148
|
class SeparatorAlignment
|
|
121
149
|
include ValueAlignment
|
|
122
150
|
|
|
123
|
-
def deltas_for_first_pair(
|
|
151
|
+
def deltas_for_first_pair(_first_pair)
|
|
124
152
|
{}
|
|
125
153
|
end
|
|
126
154
|
|
|
@@ -11,6 +11,24 @@ module RuboCop
|
|
|
11
11
|
DO_NOT_MIX_OMIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{OMIT_HASH_VALUE_MSG}"
|
|
12
12
|
DO_NOT_MIX_EXPLICIT_VALUE_MSG = "#{DO_NOT_MIX_MSG_PREFIX} #{EXPLICIT_HASH_VALUE_MSG}"
|
|
13
13
|
|
|
14
|
+
DefNode = Struct.new(:node) do
|
|
15
|
+
def selector
|
|
16
|
+
if node.loc?(:selector)
|
|
17
|
+
node.loc.selector
|
|
18
|
+
else
|
|
19
|
+
node.loc.keyword
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def first_argument
|
|
24
|
+
node.first_argument
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def last_argument
|
|
28
|
+
node.last_argument
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
14
32
|
def on_hash_for_mixed_shorthand(hash_node)
|
|
15
33
|
return if ignore_mixed_hash_shorthand_syntax?(hash_node)
|
|
16
34
|
|
|
@@ -69,13 +87,17 @@ module RuboCop
|
|
|
69
87
|
def ignore_mixed_hash_shorthand_syntax?(hash_node)
|
|
70
88
|
target_ruby_version <= 3.0 ||
|
|
71
89
|
!%w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
|
|
72
|
-
!hash_node.hash_type?
|
|
90
|
+
!hash_node.hash_type? || hash_rockets_enforced?(hash_node)
|
|
73
91
|
end
|
|
74
92
|
|
|
75
93
|
def ignore_hash_shorthand_syntax?(pair_node)
|
|
76
94
|
target_ruby_version <= 3.0 || enforced_shorthand_syntax == 'either' ||
|
|
77
95
|
%w[consistent either_consistent].include?(enforced_shorthand_syntax) ||
|
|
78
|
-
!pair_node.parent.hash_type?
|
|
96
|
+
!pair_node.parent.hash_type? || hash_rockets_enforced?(pair_node.parent)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def hash_rockets_enforced?(hash_node)
|
|
100
|
+
style == :hash_rockets || force_hash_rockets?(hash_node.pairs)
|
|
79
101
|
end
|
|
80
102
|
|
|
81
103
|
def enforced_shorthand_syntax
|
|
@@ -99,7 +121,7 @@ module RuboCop
|
|
|
99
121
|
use_modifier_form_without_parenthesized_method_call?(method_dispatch_node)
|
|
100
122
|
end
|
|
101
123
|
|
|
102
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
124
|
+
# rubocop:disable-next Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
103
125
|
def def_node_that_require_parentheses(node)
|
|
104
126
|
last_pair = node.parent.pairs.last
|
|
105
127
|
return unless last_pair.key.source == last_pair.value.source
|
|
@@ -107,13 +129,12 @@ module RuboCop
|
|
|
107
129
|
return if dispatch_node.assignment_method?
|
|
108
130
|
return if dispatch_node.parenthesized?
|
|
109
131
|
return if dispatch_node.parent && parentheses?(dispatch_node.parent)
|
|
110
|
-
return if last_expression?(dispatch_node) && !
|
|
132
|
+
return if last_expression?(dispatch_node) && !requires_parentheses_context?(dispatch_node)
|
|
111
133
|
|
|
112
134
|
def_node = node.each_ancestor(:call, :super, :yield).first
|
|
113
135
|
|
|
114
136
|
DefNode.new(def_node) unless def_node && def_node.arguments.empty?
|
|
115
137
|
end
|
|
116
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
117
138
|
|
|
118
139
|
def find_ancestor_method_dispatch_node(node)
|
|
119
140
|
return unless (ancestor = node.parent.parent)
|
|
@@ -146,11 +167,11 @@ module RuboCop
|
|
|
146
167
|
!assignment_node.right_sibling
|
|
147
168
|
end
|
|
148
169
|
|
|
149
|
-
def
|
|
150
|
-
parent =
|
|
170
|
+
def requires_parentheses_context?(node)
|
|
171
|
+
parent = node.parent
|
|
151
172
|
return false unless parent
|
|
152
173
|
|
|
153
|
-
parent.type?(:call, :super, :yield)
|
|
174
|
+
parent.type?(:call, :if, :super, :until, :while, :yield)
|
|
154
175
|
end
|
|
155
176
|
|
|
156
177
|
def breakdown_value_types_of_hash(hash_node)
|
|
@@ -212,24 +233,6 @@ module RuboCop
|
|
|
212
233
|
register_offense(pair_node, OMIT_HASH_VALUE_MSG, replacement)
|
|
213
234
|
end
|
|
214
235
|
end
|
|
215
|
-
|
|
216
|
-
DefNode = Struct.new(:node) do
|
|
217
|
-
def selector
|
|
218
|
-
if node.loc.respond_to?(:selector)
|
|
219
|
-
node.loc.selector
|
|
220
|
-
else
|
|
221
|
-
node.loc.keyword
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
def first_argument
|
|
226
|
-
node.first_argument
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
def last_argument
|
|
230
|
-
node.last_argument
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
236
|
end
|
|
234
237
|
end
|
|
235
238
|
# rubocop:enable Metrics/ModuleLength
|
|
@@ -5,7 +5,7 @@ module RuboCop
|
|
|
5
5
|
# Common functionality for Style/HashExcept and Style/HashSlice cops.
|
|
6
6
|
# It registers an offense on methods with blocks that are equivalent
|
|
7
7
|
# to Hash#except or Hash#slice.
|
|
8
|
-
# rubocop:disable Metrics/ModuleLength
|
|
8
|
+
# rubocop:disable-next Metrics/ModuleLength
|
|
9
9
|
module HashSubset
|
|
10
10
|
include RangeHelp
|
|
11
11
|
extend NodePattern::Macros
|
|
@@ -23,7 +23,7 @@ module RuboCop
|
|
|
23
23
|
(call _ _)
|
|
24
24
|
(args
|
|
25
25
|
$(arg _key)
|
|
26
|
-
(arg _))
|
|
26
|
+
$(arg _))
|
|
27
27
|
{
|
|
28
28
|
$(send
|
|
29
29
|
{(lvar _key) $_ _ | _ $_ (lvar _key)})
|
|
@@ -67,7 +67,7 @@ module RuboCop
|
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def extracts_hash_subset?(block)
|
|
70
|
-
block_with_first_arg_check?(block) do |key_arg, send_node, method|
|
|
70
|
+
block_with_first_arg_check?(block) do |key_arg, value_arg, send_node, method|
|
|
71
71
|
# Only consider methods that have one argument
|
|
72
72
|
return false unless send_node.arguments.one?
|
|
73
73
|
|
|
@@ -76,15 +76,22 @@ module RuboCop
|
|
|
76
76
|
|
|
77
77
|
case method
|
|
78
78
|
when :include?, :exclude?
|
|
79
|
-
send_node
|
|
79
|
+
slices_key?(send_node, :first_argument, key_arg, value_arg)
|
|
80
80
|
when :in?
|
|
81
|
-
send_node
|
|
81
|
+
slices_key?(send_node, :receiver, key_arg, value_arg)
|
|
82
82
|
else
|
|
83
83
|
true
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
def slices_key?(send_node, method, key_arg, value_arg)
|
|
89
|
+
return false if using_value_variable?(send_node, value_arg)
|
|
90
|
+
|
|
91
|
+
node = method == :receiver ? send_node.receiver : send_node.first_argument
|
|
92
|
+
node.source == key_arg.source
|
|
93
|
+
end
|
|
94
|
+
|
|
88
95
|
def range_include?(send_node)
|
|
89
96
|
# When checking `include?`, `exclude?` and `in?` for offenses, if the receiver
|
|
90
97
|
# or first argument is a range, an offense should not be registered.
|
|
@@ -97,6 +104,14 @@ module RuboCop
|
|
|
97
104
|
receiver.range_type?
|
|
98
105
|
end
|
|
99
106
|
|
|
107
|
+
def using_value_variable?(send_node, value_arg)
|
|
108
|
+
# If the receiver of `include?` or `exclude?`, or the first argument of `in?` is the
|
|
109
|
+
# hash value block argument, an offense should not be registered.
|
|
110
|
+
# ie. `v.include?(k)` or `k.in?(v)`
|
|
111
|
+
(send_node.receiver.lvar_type? && send_node.receiver.name == value_arg.name) ||
|
|
112
|
+
(send_node.first_argument.lvar_type? && send_node.first_argument.name == value_arg.name)
|
|
113
|
+
end
|
|
114
|
+
|
|
100
115
|
def supported_subset_method?(method)
|
|
101
116
|
if active_support_extensions_enabled?
|
|
102
117
|
ACTIVE_SUPPORT_SUBSET_METHODS.include?(method)
|
|
@@ -167,10 +182,18 @@ module RuboCop
|
|
|
167
182
|
return ":\"#{value.source}\"" if value.dsym_type?
|
|
168
183
|
return "\"#{value.source}\"" if value.dstr_type?
|
|
169
184
|
return ":#{value.source}" if value.sym_type?
|
|
185
|
+
# The element of a `%w` array can contain characters that are special
|
|
186
|
+
# inside a single-quoted string (e.g. a `'`), so escape them rather than
|
|
187
|
+
# wrapping the raw source.
|
|
188
|
+
return to_single_quoted(value.value) if value.str_type?
|
|
170
189
|
|
|
171
190
|
"'#{value.source}'"
|
|
172
191
|
end
|
|
173
192
|
|
|
193
|
+
def to_single_quoted(string)
|
|
194
|
+
"'#{string.gsub(/['\\]/) { |character| "\\#{character}" }}'"
|
|
195
|
+
end
|
|
196
|
+
|
|
174
197
|
def except_key(node)
|
|
175
198
|
key_arg = node.argument_list.first.source
|
|
176
199
|
body, = extract_body_if_negated(node.body)
|
|
@@ -183,6 +206,5 @@ module RuboCop
|
|
|
183
206
|
range_between(node.loc.selector.begin_pos, node.parent.loc.end.end_pos)
|
|
184
207
|
end
|
|
185
208
|
end
|
|
186
|
-
# rubocop:enable Metrics/ModuleLength
|
|
187
209
|
end
|
|
188
210
|
end
|