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
|
@@ -22,6 +22,11 @@ module RuboCop
|
|
|
22
22
|
# * Private attribute macros (`attr_accessor`, `attr_writer`, `attr_reader`)
|
|
23
23
|
# * Private instance methods
|
|
24
24
|
#
|
|
25
|
+
# NOTE: Simply enabling the cop with `Enabled: true` will not use
|
|
26
|
+
# the example order shown below.
|
|
27
|
+
# To enforce the order of macros like `attr_reader`,
|
|
28
|
+
# you must define both `ExpectedOrder` *and* `Categories`.
|
|
29
|
+
#
|
|
25
30
|
# You can configure the following order:
|
|
26
31
|
#
|
|
27
32
|
# [source,yaml]
|
|
@@ -44,7 +49,7 @@ module RuboCop
|
|
|
44
49
|
# - private_methods
|
|
45
50
|
# ----
|
|
46
51
|
#
|
|
47
|
-
# Instead of putting all literals in the expected order, is also
|
|
52
|
+
# Instead of putting all literals in the expected order, it is also
|
|
48
53
|
# possible to group categories of macros. Visibility levels are handled
|
|
49
54
|
# automatically.
|
|
50
55
|
#
|
|
@@ -68,6 +73,36 @@ module RuboCop
|
|
|
68
73
|
# - extend
|
|
69
74
|
# ----
|
|
70
75
|
#
|
|
76
|
+
# If you only set `ExpectedOrder`
|
|
77
|
+
# without defining `Categories`,
|
|
78
|
+
# macros such as `attr_reader` or `has_many`
|
|
79
|
+
# will not be recognized as part of a category, and their order will not be validated.
|
|
80
|
+
# For example, the following will NOT raise any offenses, even if the order is incorrect:
|
|
81
|
+
#
|
|
82
|
+
# [source,yaml]
|
|
83
|
+
# ----
|
|
84
|
+
# Layout/ClassStructure:
|
|
85
|
+
# Enabled: true
|
|
86
|
+
# ExpectedOrder:
|
|
87
|
+
# - public_attribute_macros
|
|
88
|
+
# - initializer
|
|
89
|
+
# ----
|
|
90
|
+
#
|
|
91
|
+
# To make it work as expected, you must also specify `Categories` like this:
|
|
92
|
+
#
|
|
93
|
+
# [source,yaml]
|
|
94
|
+
# ----
|
|
95
|
+
# Layout/ClassStructure:
|
|
96
|
+
# ExpectedOrder:
|
|
97
|
+
# - public_attribute_macros
|
|
98
|
+
# - initializer
|
|
99
|
+
# Categories:
|
|
100
|
+
# attribute_macros:
|
|
101
|
+
# - attr_reader
|
|
102
|
+
# - attr_writer
|
|
103
|
+
# - attr_accessor
|
|
104
|
+
# ----
|
|
105
|
+
#
|
|
71
106
|
# @safety
|
|
72
107
|
# Autocorrection is unsafe because class methods and module inclusion
|
|
73
108
|
# can behave differently, based on which methods or constants have
|
|
@@ -155,40 +190,65 @@ module RuboCop
|
|
|
155
190
|
|
|
156
191
|
# Validates code style on class declaration.
|
|
157
192
|
# Add offense when find a node out of expected order.
|
|
193
|
+
# A node is out of order when its category is expected earlier than
|
|
194
|
+
# the highest-priority category seen so far, so that a low-priority element
|
|
195
|
+
# (even an unmovable one) cannot mask disorder among the elements that follow it.
|
|
196
|
+
# Consecutive elements of the same category are reported only once,
|
|
197
|
+
# on the first element of the group.
|
|
158
198
|
def on_class(class_node)
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
199
|
+
# Corrections are registered in reverse source order because an insertion at
|
|
200
|
+
# a given position lands before any insertion already made there;
|
|
201
|
+
# this keeps the source order of nodes moved before the same anchor.
|
|
202
|
+
out_of_order_elements(class_node).reverse_each do |node, category, previous|
|
|
203
|
+
message = format(MSG, category: category, previous: previous)
|
|
204
|
+
|
|
205
|
+
add_offense(node, message: message) do |corrector|
|
|
206
|
+
autocorrect(corrector, node)
|
|
165
207
|
end
|
|
166
|
-
previous = index
|
|
167
208
|
end
|
|
168
209
|
end
|
|
169
210
|
alias on_sclass on_class
|
|
170
211
|
|
|
171
212
|
private
|
|
172
213
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
214
|
+
def out_of_order_elements(class_node)
|
|
215
|
+
out_of_order = []
|
|
216
|
+
max_index = -1
|
|
217
|
+
previous_category = nil
|
|
218
|
+
walk_over_nested_class_definition(class_node) do |node, category|
|
|
219
|
+
index = expected_order.index(category)
|
|
220
|
+
if index < max_index && category != previous_category
|
|
221
|
+
out_of_order << [node, category, expected_order[max_index]]
|
|
222
|
+
end
|
|
223
|
+
max_index = index if index > max_index
|
|
224
|
+
previous_category = category
|
|
177
225
|
end
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
current_range = source_range_with_comment(node)
|
|
181
|
-
previous_range = source_range_with_comment(previous)
|
|
226
|
+
out_of_order
|
|
227
|
+
end
|
|
182
228
|
|
|
183
|
-
|
|
184
|
-
|
|
229
|
+
# Autocorrect by moving the node, together with the contiguous group of
|
|
230
|
+
# same-category elements that follows it, to its expected position.
|
|
231
|
+
def autocorrect(corrector, node)
|
|
232
|
+
return if dynamic_constant?(node)
|
|
233
|
+
|
|
234
|
+
anchor = insertion_anchor(node)
|
|
235
|
+
return unless anchor
|
|
236
|
+
|
|
237
|
+
anchor_range = source_range_with_comment(anchor)
|
|
238
|
+
# Reversed for the same reason offenses are registered in reverse source order:
|
|
239
|
+
# the last insertion at a position comes first.
|
|
240
|
+
movable_group(node).reverse_each do |group_node|
|
|
241
|
+
current_range = source_range_with_comment(group_node)
|
|
242
|
+
corrector.insert_before(anchor_range, current_range.source)
|
|
243
|
+
corrector.remove(current_range)
|
|
244
|
+
end
|
|
185
245
|
end
|
|
186
246
|
|
|
187
247
|
# Classifies a node to match with something in the {expected_order}
|
|
188
248
|
# @param node to be analysed
|
|
189
249
|
# @return String when the node type is a `:block` then
|
|
190
250
|
# {classify} recursively with the first children
|
|
191
|
-
# @return String when the node type is a `:send` then {
|
|
251
|
+
# @return String when the node type is a `:send` then {find_send_node_category}
|
|
192
252
|
# by method name
|
|
193
253
|
# @return String otherwise trying to {humanize_node} of the current node
|
|
194
254
|
def classify(node)
|
|
@@ -198,9 +258,10 @@ module RuboCop
|
|
|
198
258
|
when :block
|
|
199
259
|
classify(node.send_node)
|
|
200
260
|
when :send
|
|
201
|
-
|
|
261
|
+
find_send_node_category(node)
|
|
202
262
|
else
|
|
203
|
-
humanize_node(node)
|
|
263
|
+
name = humanize_node(node)
|
|
264
|
+
find_category(name) || name
|
|
204
265
|
end.to_s
|
|
205
266
|
end
|
|
206
267
|
|
|
@@ -209,19 +270,25 @@ module RuboCop
|
|
|
209
270
|
# also its visibility.
|
|
210
271
|
# @param node to be analysed.
|
|
211
272
|
# @return [String] with the key category or the `method_name` as string
|
|
212
|
-
def
|
|
273
|
+
def find_send_node_category(node)
|
|
213
274
|
name = node.method_name.to_s
|
|
214
|
-
category
|
|
275
|
+
category = find_category(name)
|
|
215
276
|
key = category || name
|
|
216
277
|
visibility_key =
|
|
217
278
|
if node.def_modifier?
|
|
218
|
-
"#{name}_methods"
|
|
279
|
+
name.end_with?('_class_method') ? "#{name}s" : "#{name}_methods"
|
|
219
280
|
else
|
|
220
281
|
"#{node_visibility(node)}_#{key}"
|
|
221
282
|
end
|
|
222
283
|
expected_order.include?(visibility_key) ? visibility_key : key
|
|
223
284
|
end
|
|
224
285
|
|
|
286
|
+
def find_category(name)
|
|
287
|
+
name = name.to_s
|
|
288
|
+
category, = categories.find { |_, names| names.include?(name) }
|
|
289
|
+
category
|
|
290
|
+
end
|
|
291
|
+
|
|
225
292
|
def walk_over_nested_class_definition(class_node)
|
|
226
293
|
class_elements(class_node).each do |node|
|
|
227
294
|
classification = classify(node)
|
|
@@ -236,10 +303,14 @@ module RuboCop
|
|
|
236
303
|
|
|
237
304
|
return [] unless class_def
|
|
238
305
|
|
|
239
|
-
|
|
240
|
-
|
|
306
|
+
# Only a multi-statement body (`begin`/`kwbegin`) wraps several elements; any
|
|
307
|
+
# single statement (`def`, `send`, `csend`, `if`, ...) is itself the sole element.
|
|
308
|
+
# Exploding such a node into its children would yield non-node values (e.g. a
|
|
309
|
+
# method-name `Symbol` from a `csend`) and crash later checks.
|
|
310
|
+
if class_def.type?(:begin, :kwbegin)
|
|
311
|
+
flatten_class_elements(class_def)
|
|
241
312
|
else
|
|
242
|
-
class_def
|
|
313
|
+
[class_def]
|
|
243
314
|
end
|
|
244
315
|
end
|
|
245
316
|
|
|
@@ -250,13 +321,10 @@ module RuboCop
|
|
|
250
321
|
private_constant?(node)
|
|
251
322
|
end
|
|
252
323
|
|
|
253
|
-
def
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
ignore?(sibling, sibling_class) ||
|
|
258
|
-
classification == sibling_class ||
|
|
259
|
-
dynamic_constant?(node)
|
|
324
|
+
def flatten_class_elements(node)
|
|
325
|
+
node.children.compact.flat_map do |child|
|
|
326
|
+
child.kwbegin_type? ? flatten_class_elements(child) : [child]
|
|
327
|
+
end
|
|
260
328
|
end
|
|
261
329
|
|
|
262
330
|
def humanize_node(node)
|
|
@@ -276,6 +344,66 @@ module RuboCop
|
|
|
276
344
|
!(expression.method?(:freeze) && expression.receiver&.recursive_basic_literal?)
|
|
277
345
|
end
|
|
278
346
|
|
|
347
|
+
# The expected position of the node: the first left sibling within its movable span
|
|
348
|
+
# whose category is expected to appear after the node's.
|
|
349
|
+
# Requiring a strictly later category keeps the order of elements sharing a category stable.
|
|
350
|
+
def insertion_anchor(node)
|
|
351
|
+
index = expected_order.index(classify(node))
|
|
352
|
+
|
|
353
|
+
movable_span(node).find do |sibling|
|
|
354
|
+
classification = classify(sibling)
|
|
355
|
+
|
|
356
|
+
!ignore?(sibling, classification) && expected_order.index(classification) > index
|
|
357
|
+
end
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
# The node together with the contiguous same-category right siblings,
|
|
361
|
+
# so that the whole group moves in a single pass while the offense is
|
|
362
|
+
# reported only on its first element.
|
|
363
|
+
def movable_group(node)
|
|
364
|
+
classification = classify(node)
|
|
365
|
+
group = [node]
|
|
366
|
+
|
|
367
|
+
node.right_siblings.each do |sibling|
|
|
368
|
+
break unless classify(sibling) == classification
|
|
369
|
+
break if ignore?(sibling, classification) || dynamic_constant?(sibling)
|
|
370
|
+
|
|
371
|
+
group << sibling
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
group
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
# Left siblings the node may be reordered with: those after the last barrier.
|
|
378
|
+
# Ignored elements within the span are simply jumped over.
|
|
379
|
+
def movable_span(node)
|
|
380
|
+
left_siblings = node.left_siblings
|
|
381
|
+
barrier_index = left_siblings.rindex { |sibling| barrier?(node, sibling) }
|
|
382
|
+
|
|
383
|
+
barrier_index ? left_siblings[(barrier_index + 1)..] : left_siblings
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
# A dynamic constant blocks every element: the cop does not move such constants,
|
|
387
|
+
# and letting other elements jump over one would change execution order just the same.
|
|
388
|
+
# A bare visibility modifier blocks only the elements whose meaning depends on
|
|
389
|
+
# the visibility section they appear in.
|
|
390
|
+
def barrier?(node, sibling)
|
|
391
|
+
dynamic_constant?(sibling) || (visibility_dependent?(node) && visibility_block?(sibling))
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
# Whether moving the node across a bare visibility modifier would change its meaning.
|
|
395
|
+
# This is the case for `def` nodes and for macros whose category is classified by visibility
|
|
396
|
+
# (e.g. `attr_accessor` when the expected order lists `private_attribute_macros`).
|
|
397
|
+
# Inline visibility (`private def foo`, `def self.foo`) travels with the node.
|
|
398
|
+
def visibility_dependent?(node)
|
|
399
|
+
return true if node.def_type?
|
|
400
|
+
return false if !node.send_type? || node.def_modifier?
|
|
401
|
+
|
|
402
|
+
key = find_category(node.method_name) || node.method_name.to_s
|
|
403
|
+
|
|
404
|
+
VISIBILITY_SCOPES.any? { |visibility| expected_order.include?("#{visibility}_#{key}") }
|
|
405
|
+
end
|
|
406
|
+
|
|
279
407
|
def private_constant?(node)
|
|
280
408
|
return false unless node.casgn_type? && node.namespace.nil?
|
|
281
409
|
return false unless (parent = node.parent)
|
|
@@ -322,7 +450,7 @@ module RuboCop
|
|
|
322
450
|
end
|
|
323
451
|
|
|
324
452
|
def find_heredoc(node)
|
|
325
|
-
node.each_node(:
|
|
453
|
+
node.each_node(:any_str).find(&:heredoc?)
|
|
326
454
|
end
|
|
327
455
|
|
|
328
456
|
def buffer
|
|
@@ -155,13 +155,13 @@ module RuboCop
|
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
def all_elements_aligned?(elements)
|
|
158
|
-
elements.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
158
|
+
if elements.first.hash_type?
|
|
159
|
+
elements.first.each_child_node.map { |child| child.loc.column }
|
|
160
|
+
else
|
|
161
|
+
elements.flat_map do |e|
|
|
162
162
|
e.loc.column
|
|
163
163
|
end
|
|
164
|
-
end.uniq.
|
|
164
|
+
end.uniq.one?
|
|
165
165
|
end
|
|
166
166
|
|
|
167
167
|
def first_argument_line(elements)
|
|
@@ -64,10 +64,10 @@ module RuboCop
|
|
|
64
64
|
autocorrect_one(corrector, comment)
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
# Corrects all comment lines that
|
|
68
|
-
#
|
|
69
|
-
# of correcting, saving the file, parsing
|
|
70
|
-
# then correcting one more line, and so on.
|
|
67
|
+
# Corrects all preceding comment lines that have the same indentation
|
|
68
|
+
# and are separated from the given comment by nothing but blank lines.
|
|
69
|
+
# This is to avoid a long chain of correcting, saving the file, parsing
|
|
70
|
+
# and inspecting again, and then correcting one more line, and so on.
|
|
71
71
|
def autocorrect_preceding_comments(corrector, comment)
|
|
72
72
|
comments = processed_source.comments
|
|
73
73
|
index = comments.index(comment)
|
|
@@ -82,7 +82,10 @@ module RuboCop
|
|
|
82
82
|
def should_correct?(preceding_comment, reference_comment)
|
|
83
83
|
loc = preceding_comment.loc
|
|
84
84
|
ref_loc = reference_comment.loc
|
|
85
|
-
|
|
85
|
+
return false unless loc.column == ref_loc.column
|
|
86
|
+
return false unless own_line_comment?(preceding_comment)
|
|
87
|
+
|
|
88
|
+
((loc.line + 1)...ref_loc.line).all? { |line| processed_source[line - 1].blank? }
|
|
86
89
|
end
|
|
87
90
|
|
|
88
91
|
def autocorrect_one(corrector, comment)
|
|
@@ -155,8 +158,15 @@ module RuboCop
|
|
|
155
158
|
|
|
156
159
|
def less_indented?(line)
|
|
157
160
|
rule = config.for_cop('Layout/AccessModifierIndentation')['EnforcedStyle'] == 'outdent'
|
|
158
|
-
|
|
159
|
-
|
|
161
|
+
/\A\s*(end\b|[)}\]])/.match?(line) || (rule && bare_access_modifier?(line))
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Only a bare access modifier (the keyword alone on its line) is outdented by
|
|
165
|
+
# `Layout/AccessModifierIndentation`. An inline modifier such as `private def foo`
|
|
166
|
+
# keeps the regular method indentation, so a comment above it must not be pushed
|
|
167
|
+
# one level deeper.
|
|
168
|
+
def bare_access_modifier?(line)
|
|
169
|
+
/\A\s*(private|protected|public)\s*(#.*)?\z/.match?(line)
|
|
160
170
|
end
|
|
161
171
|
|
|
162
172
|
def two_alternatives?(line)
|
|
@@ -44,16 +44,26 @@ module RuboCop
|
|
|
44
44
|
message = message(condition)
|
|
45
45
|
|
|
46
46
|
add_offense(condition, message: message) do |corrector|
|
|
47
|
-
range = range_by_whole_lines(condition.source_range, include_final_newline: true)
|
|
48
|
-
|
|
49
47
|
corrector.insert_after(condition.parent.loc.keyword, " #{condition.source}")
|
|
50
|
-
corrector.remove(
|
|
48
|
+
corrector.remove(removal_range(node, condition))
|
|
51
49
|
end
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
def message(condition)
|
|
55
53
|
format(MSG, keyword: condition.parent.keyword)
|
|
56
54
|
end
|
|
55
|
+
|
|
56
|
+
# When a body statement shares the condition's line (e.g. `while\n cond; body\nend`),
|
|
57
|
+
# removing the whole line would delete the body too. In that case only remove the
|
|
58
|
+
# condition and its trailing separator, preserving the body statement.
|
|
59
|
+
def removal_range(node, condition)
|
|
60
|
+
body = node.body
|
|
61
|
+
if body && body.source_range.line == condition.source_range.last_line
|
|
62
|
+
range_between(condition.source_range.begin_pos, body.source_range.begin_pos)
|
|
63
|
+
else
|
|
64
|
+
range_by_whole_lines(condition.source_range, include_final_newline: true)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
57
67
|
end
|
|
58
68
|
end
|
|
59
69
|
end
|
|
@@ -48,7 +48,7 @@ module RuboCop
|
|
|
48
48
|
def on_send(node)
|
|
49
49
|
return unless node.def_modifier?
|
|
50
50
|
|
|
51
|
-
method_def = node.each_descendant(:
|
|
51
|
+
method_def = node.each_descendant(:any_def).first
|
|
52
52
|
expr = node.source_range
|
|
53
53
|
|
|
54
54
|
line_start = range_between(expr.begin_pos, method_def.loc.keyword.end_pos)
|
|
@@ -112,7 +112,7 @@ module RuboCop
|
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
def last_heredoc_line(node)
|
|
115
|
-
if node.
|
|
115
|
+
if node.call_type?
|
|
116
116
|
node.arguments.select { |arg| heredoc?(arg) }.map { |arg| arg.loc.heredoc_end.line }.max
|
|
117
117
|
elsif heredoc?(node)
|
|
118
118
|
node.loc.heredoc_end.line
|
|
@@ -120,7 +120,7 @@ module RuboCop
|
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
def heredoc?(node)
|
|
123
|
-
node.
|
|
123
|
+
node.any_str_type? && node.heredoc?
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
def end_range(node)
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
def on_rescue(node)
|
|
52
|
-
return unless node.loc
|
|
52
|
+
return unless node.loc?(:else)
|
|
53
53
|
|
|
54
54
|
check_alignment(base_range_of_rescue(node), node.loc.else)
|
|
55
55
|
end
|
|
@@ -92,13 +92,8 @@ module RuboCop
|
|
|
92
92
|
case parent.type
|
|
93
93
|
when :def, :defs then base_for_method_definition(parent)
|
|
94
94
|
when :kwbegin then parent.loc.begin
|
|
95
|
-
when :block
|
|
96
|
-
|
|
97
|
-
if same_line?(parent, assignment_node)
|
|
98
|
-
assignment_node.source_range
|
|
99
|
-
else
|
|
100
|
-
parent.send_node.source_range
|
|
101
|
-
end
|
|
95
|
+
when :block, :numblock, :itblock then start_line_range(parent)
|
|
96
|
+
when :class, :module, :sclass then parent.loc.keyword
|
|
102
97
|
else node.loc.keyword
|
|
103
98
|
end
|
|
104
99
|
end
|
|
@@ -143,13 +138,6 @@ module RuboCop
|
|
|
143
138
|
autocorrect(corrector, else_range)
|
|
144
139
|
end
|
|
145
140
|
end
|
|
146
|
-
|
|
147
|
-
def assignment_node(node)
|
|
148
|
-
assignment_node = node.ancestors.first
|
|
149
|
-
return unless assignment_node&.assignment?
|
|
150
|
-
|
|
151
|
-
assignment_node
|
|
152
|
-
end
|
|
153
141
|
end
|
|
154
142
|
end
|
|
155
143
|
end
|
|
@@ -95,8 +95,7 @@ module RuboCop
|
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
def autocorrect(corrector, node)
|
|
98
|
-
|
|
99
|
-
range = if previous_token && same_line?(node, previous_token)
|
|
98
|
+
range = if inline_comment?(node)
|
|
100
99
|
range_with_surrounding_space(node.source_range, newlines: false)
|
|
101
100
|
else
|
|
102
101
|
range_by_whole_lines(node.source_range, include_final_newline: true)
|
|
@@ -138,14 +137,13 @@ module RuboCop
|
|
|
138
137
|
cop_config['AllowMarginComment']
|
|
139
138
|
end
|
|
140
139
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
index.zero? ? nil : processed_source.tokens[index - 1]
|
|
140
|
+
# A comment is inline when code precedes it on the same line. Detecting this
|
|
141
|
+
# from the source (rather than the token stream) is required because, for a
|
|
142
|
+
# comment trailing a heredoc opener, the preceding token is the heredoc end on
|
|
143
|
+
# a later line, which would wrongly trigger whole-line removal of the opener.
|
|
144
|
+
def inline_comment?(comment)
|
|
145
|
+
preceding_source = processed_source.lines[comment.loc.line - 1][0...comment.loc.column]
|
|
146
|
+
!preceding_source.strip.empty?
|
|
149
147
|
end
|
|
150
148
|
end
|
|
151
149
|
end
|
|
@@ -5,8 +5,10 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Enforces empty line after guard clause.
|
|
7
7
|
#
|
|
8
|
-
# This cop allows
|
|
9
|
-
# SimpleCov excludes code from the coverage report by wrapping it in
|
|
8
|
+
# This cop allows a SimpleCov directive comment after guard clause because
|
|
9
|
+
# SimpleCov excludes code from the coverage report by wrapping it in such directives.
|
|
10
|
+
# Both the legacy `# :nocov:` comment and the newer `# simplecov:disable` /
|
|
11
|
+
# `# simplecov:enable` comments are recognized:
|
|
10
12
|
#
|
|
11
13
|
# [source,ruby]
|
|
12
14
|
# ----
|
|
@@ -16,6 +18,13 @@ module RuboCop
|
|
|
16
18
|
# # :nocov:
|
|
17
19
|
# bar
|
|
18
20
|
# end
|
|
21
|
+
#
|
|
22
|
+
# def foo
|
|
23
|
+
# # simplecov:disable
|
|
24
|
+
# return if condition
|
|
25
|
+
# # simplecov:enable
|
|
26
|
+
# bar
|
|
27
|
+
# end
|
|
19
28
|
# ----
|
|
20
29
|
#
|
|
21
30
|
# Refer to SimpleCov's documentation for more details:
|
|
@@ -58,7 +67,12 @@ module RuboCop
|
|
|
58
67
|
|
|
59
68
|
MSG = 'Add empty line after guard clause.'
|
|
60
69
|
END_OF_HEREDOC_LINE = 1
|
|
61
|
-
|
|
70
|
+
SIMPLECOV_COMMENT_PATTERN = /\A#\s*(?::nocov:|simplecov\s*:\s*(?:disable|enable)\b)/.freeze
|
|
71
|
+
|
|
72
|
+
# @!method guard_clause_branch?(node)
|
|
73
|
+
def_node_matcher :guard_clause_branch?, <<~PATTERN
|
|
74
|
+
{(send nil? {:raise :fail} ...) return break next}
|
|
75
|
+
PATTERN
|
|
62
76
|
|
|
63
77
|
def on_if(node)
|
|
64
78
|
return if correct_style?(node)
|
|
@@ -97,14 +111,16 @@ module RuboCop
|
|
|
97
111
|
end
|
|
98
112
|
|
|
99
113
|
def correct_style?(node)
|
|
100
|
-
!
|
|
114
|
+
!node.if_branch&.guard_clause? ||
|
|
101
115
|
next_line_rescue_or_ensure?(node) ||
|
|
102
116
|
next_sibling_parent_empty_or_else?(node) ||
|
|
103
117
|
next_sibling_empty_or_guard_clause?(node)
|
|
104
118
|
end
|
|
105
119
|
|
|
106
120
|
def contains_guard_clause?(node)
|
|
107
|
-
node.if_branch
|
|
121
|
+
return false unless (branch = node.if_branch)
|
|
122
|
+
|
|
123
|
+
branch.guard_clause? || guard_clause_branch?(branch)
|
|
108
124
|
end
|
|
109
125
|
|
|
110
126
|
def next_line_empty_or_allowed_directive_comment?(line)
|
|
@@ -131,7 +147,7 @@ module RuboCop
|
|
|
131
147
|
|
|
132
148
|
def next_sibling_parent_empty_or_else?(node)
|
|
133
149
|
next_sibling = node.right_sibling
|
|
134
|
-
return true
|
|
150
|
+
return true unless next_sibling.is_a?(AST::Node)
|
|
135
151
|
|
|
136
152
|
parent = next_sibling.parent
|
|
137
153
|
|
|
@@ -145,8 +161,10 @@ module RuboCop
|
|
|
145
161
|
next_sibling.if_type? && contains_guard_clause?(next_sibling)
|
|
146
162
|
end
|
|
147
163
|
|
|
164
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
148
165
|
def last_heredoc_argument(node)
|
|
149
166
|
n = last_heredoc_argument_node(node)
|
|
167
|
+
n = n.children.first while n.respond_to?(:begin_type?) && n.begin_type?
|
|
150
168
|
|
|
151
169
|
return n if heredoc?(n)
|
|
152
170
|
return unless n.respond_to?(:arguments)
|
|
@@ -189,7 +207,7 @@ module RuboCop
|
|
|
189
207
|
end
|
|
190
208
|
|
|
191
209
|
def offense_location(node)
|
|
192
|
-
if node.loc
|
|
210
|
+
if node.loc?(:end)
|
|
193
211
|
node.loc.end
|
|
194
212
|
else
|
|
195
213
|
node
|
|
@@ -203,10 +221,10 @@ module RuboCop
|
|
|
203
221
|
parent.begin_type? && same_line?(node, node.right_sibling)
|
|
204
222
|
end
|
|
205
223
|
|
|
206
|
-
# SimpleCov excludes code from the coverage report by wrapping it in
|
|
224
|
+
# SimpleCov excludes code from the coverage report by wrapping it in directive comments:
|
|
207
225
|
# https://github.com/simplecov-ruby/simplecov#ignoringskipping-code
|
|
208
226
|
def simplecov_directive_comment?(comment)
|
|
209
|
-
|
|
227
|
+
SIMPLECOV_COMMENT_PATTERN.match?(comment.text)
|
|
210
228
|
end
|
|
211
229
|
end
|
|
212
230
|
end
|