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
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Naming
|
|
6
|
+
# Checks that predicate methods end with `?` and non-predicate methods do not.
|
|
7
|
+
#
|
|
8
|
+
# The names of predicate methods (methods that return a boolean value) should end
|
|
9
|
+
# in a question mark. Methods that don't return a boolean shouldn't
|
|
10
|
+
# end in a question mark.
|
|
11
|
+
#
|
|
12
|
+
# The cop assesses a predicate method as one that returns boolean values. Likewise,
|
|
13
|
+
# a method that only returns literal values is assessed as non-predicate. Other predicate
|
|
14
|
+
# method calls are assumed to return boolean values. The cop does not make an assessment
|
|
15
|
+
# if the return type is unknown (non-predicate method calls, variables, etc.).
|
|
16
|
+
#
|
|
17
|
+
# NOTE: The `initialize` method and operator methods (`def ==`, etc.) are ignored.
|
|
18
|
+
#
|
|
19
|
+
# By default, the cop runs in `conservative` mode, which allows a method to be named
|
|
20
|
+
# with a question mark as long as at least one return value is boolean. In `aggressive`
|
|
21
|
+
# mode, methods with a question mark will register an offense if any known non-boolean
|
|
22
|
+
# return values are detected.
|
|
23
|
+
#
|
|
24
|
+
# The cop also has `AllowedMethods` configuration in order to prevent the cop from
|
|
25
|
+
# registering an offense from a method name that does not conform to the naming
|
|
26
|
+
# guidelines. By default, `call` is allowed. The cop also has `AllowedPatterns`
|
|
27
|
+
# configuration to allow method names by regular expression.
|
|
28
|
+
#
|
|
29
|
+
# Although returning a call to another predicate method is treated as a boolean value,
|
|
30
|
+
# certain method names can be known to not return a boolean, despite ending in a `?`
|
|
31
|
+
# (for example, `Numeric#nonzero?` returns `self` or `nil`). These methods can be
|
|
32
|
+
# configured using `NonBooleanPredicates`.
|
|
33
|
+
#
|
|
34
|
+
# The cop can furthermore be configured to allow all bang methods (method names
|
|
35
|
+
# ending with `!`), with `AllowBangMethods: true` (default false).
|
|
36
|
+
#
|
|
37
|
+
# @example Mode: conservative (default)
|
|
38
|
+
# # bad
|
|
39
|
+
# def foo
|
|
40
|
+
# bar == baz
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# # good
|
|
44
|
+
# def foo?
|
|
45
|
+
# bar == baz
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
48
|
+
# # bad
|
|
49
|
+
# def foo?
|
|
50
|
+
# 5
|
|
51
|
+
# end
|
|
52
|
+
#
|
|
53
|
+
# # good
|
|
54
|
+
# def foo
|
|
55
|
+
# 5
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
# # bad
|
|
59
|
+
# def foo
|
|
60
|
+
# x == y
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# # good
|
|
64
|
+
# def foo?
|
|
65
|
+
# x == y
|
|
66
|
+
# end
|
|
67
|
+
#
|
|
68
|
+
# # bad
|
|
69
|
+
# def foo
|
|
70
|
+
# !x
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# # good
|
|
74
|
+
# def foo?
|
|
75
|
+
# !x
|
|
76
|
+
# end
|
|
77
|
+
#
|
|
78
|
+
# # bad - returns the value of another predicate method
|
|
79
|
+
# def foo
|
|
80
|
+
# bar?
|
|
81
|
+
# end
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# def foo?
|
|
85
|
+
# bar?
|
|
86
|
+
# end
|
|
87
|
+
#
|
|
88
|
+
# # good - operator method
|
|
89
|
+
# def ==(other)
|
|
90
|
+
# hash == other.hash
|
|
91
|
+
# end
|
|
92
|
+
#
|
|
93
|
+
# # good - at least one return value is boolean
|
|
94
|
+
# def foo?
|
|
95
|
+
# return unless bar?
|
|
96
|
+
# true
|
|
97
|
+
# end
|
|
98
|
+
#
|
|
99
|
+
# # ok - return type is not known
|
|
100
|
+
# def foo?
|
|
101
|
+
# bar
|
|
102
|
+
# end
|
|
103
|
+
#
|
|
104
|
+
# # ok - return type is not known
|
|
105
|
+
# def foo
|
|
106
|
+
# bar?
|
|
107
|
+
# end
|
|
108
|
+
#
|
|
109
|
+
# @example Mode: aggressive
|
|
110
|
+
# # bad - the method returns nil in some cases
|
|
111
|
+
# def foo?
|
|
112
|
+
# return unless bar?
|
|
113
|
+
# true
|
|
114
|
+
# end
|
|
115
|
+
#
|
|
116
|
+
# @example AllowedMethods: [call] (default)
|
|
117
|
+
# # good
|
|
118
|
+
# def call
|
|
119
|
+
# foo == bar
|
|
120
|
+
# end
|
|
121
|
+
#
|
|
122
|
+
# @example AllowedPatterns: [\Afoo]
|
|
123
|
+
# # good
|
|
124
|
+
# def foo?
|
|
125
|
+
# 'foo'
|
|
126
|
+
# end
|
|
127
|
+
#
|
|
128
|
+
# @example AllowBangMethods: false (default)
|
|
129
|
+
# # bad
|
|
130
|
+
# def save!
|
|
131
|
+
# true
|
|
132
|
+
# end
|
|
133
|
+
#
|
|
134
|
+
# @example AllowBangMethods: true
|
|
135
|
+
# # good
|
|
136
|
+
# def save!
|
|
137
|
+
# true
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# @example WaywardPredicates: ['infinite?', 'nonzero?'] (default)
|
|
141
|
+
# # good
|
|
142
|
+
# def non_predicate_method(num)
|
|
143
|
+
# num.infinite?
|
|
144
|
+
# end
|
|
145
|
+
#
|
|
146
|
+
# # good
|
|
147
|
+
# def non_predicate_method(num)
|
|
148
|
+
# num.nonzero?
|
|
149
|
+
# end
|
|
150
|
+
#
|
|
151
|
+
class PredicateMethod < Base
|
|
152
|
+
include AllowedMethods
|
|
153
|
+
include AllowedPattern
|
|
154
|
+
|
|
155
|
+
MSG_PREDICATE = 'Predicate method names should end with `?`.'
|
|
156
|
+
MSG_NON_PREDICATE = 'Non-predicate method names should not end with `?`.'
|
|
157
|
+
|
|
158
|
+
def on_def(node)
|
|
159
|
+
return if allowed?(node)
|
|
160
|
+
|
|
161
|
+
return_values = return_values(node.body)
|
|
162
|
+
return if acceptable?(return_values)
|
|
163
|
+
|
|
164
|
+
if node.predicate_method? && potential_non_predicate?(return_values)
|
|
165
|
+
add_offense(node.loc.name, message: MSG_NON_PREDICATE)
|
|
166
|
+
elsif !node.predicate_method? && all_return_values_boolean?(return_values)
|
|
167
|
+
add_offense(node.loc.name, message: MSG_PREDICATE)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
alias on_defs on_def
|
|
171
|
+
|
|
172
|
+
private
|
|
173
|
+
|
|
174
|
+
def allowed?(node)
|
|
175
|
+
node.method?(:initialize) ||
|
|
176
|
+
allowed_method?(node.method_name) ||
|
|
177
|
+
matches_allowed_pattern?(node.method_name) ||
|
|
178
|
+
allowed_bang_method?(node) ||
|
|
179
|
+
node.operator_method? ||
|
|
180
|
+
node.body.nil?
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def acceptable?(return_values)
|
|
184
|
+
# In `conservative` mode, if the method returns `super`, `zsuper`, or a
|
|
185
|
+
# non-comparison method call, the method name is acceptable.
|
|
186
|
+
return false unless conservative?
|
|
187
|
+
|
|
188
|
+
return_values.any? do |value|
|
|
189
|
+
value.type?(:super, :zsuper) || unknown_method_call?(value)
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
def unknown_method_call?(value)
|
|
194
|
+
return false unless value.call_type?
|
|
195
|
+
|
|
196
|
+
!method_returning_boolean?(value)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def return_values(node)
|
|
200
|
+
# Collect all the (implicit and explicit) return values of a node
|
|
201
|
+
return_values = Set.new(node.begin_type? ? [] : [extract_return_value(node)])
|
|
202
|
+
|
|
203
|
+
node.each_descendant(:return) do |return_node|
|
|
204
|
+
return_values << extract_return_value(return_node)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
return_values << last_value(node)
|
|
208
|
+
|
|
209
|
+
process_return_values(return_values)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def all_return_values_boolean?(return_values)
|
|
213
|
+
values = return_values.reject { |value| value.type?(:super, :zsuper) }
|
|
214
|
+
return false if values.empty?
|
|
215
|
+
|
|
216
|
+
values.all? { |value| boolean_return?(value) }
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def boolean_return?(value)
|
|
220
|
+
return true if value.boolean_type?
|
|
221
|
+
|
|
222
|
+
method_returning_boolean?(value)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def method_returning_boolean?(value)
|
|
226
|
+
return false unless value.call_type?
|
|
227
|
+
return false if wayward_predicate?(value.method_name)
|
|
228
|
+
|
|
229
|
+
value.comparison_method? || value.predicate_method? || value.negation_method?
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def potential_non_predicate?(return_values)
|
|
233
|
+
# Assumes a method to be non-predicate if all return values are non-boolean literals.
|
|
234
|
+
#
|
|
235
|
+
# In `Mode: conservative`, if any of the return values is a boolean,
|
|
236
|
+
# the method name is acceptable.
|
|
237
|
+
# In `Mode: aggressive`, all return values must be booleans for a predicate
|
|
238
|
+
# method, or else an offense will be registered.
|
|
239
|
+
return false if conservative? && return_values.any? { |value| boolean_return?(value) }
|
|
240
|
+
|
|
241
|
+
return_values.any? do |value|
|
|
242
|
+
value.literal? && !value.boolean_type?
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def extract_return_value(node)
|
|
247
|
+
return node unless node.return_type?
|
|
248
|
+
|
|
249
|
+
# `return` without a value is a `nil` return.
|
|
250
|
+
return s(:nil) if node.arguments.empty?
|
|
251
|
+
|
|
252
|
+
# When there's a multiple return, it cannot be a predicate
|
|
253
|
+
# so just return an `array` sexp for simplicity.
|
|
254
|
+
return s(:array) unless node.arguments.one?
|
|
255
|
+
|
|
256
|
+
node.first_argument
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def last_value(node)
|
|
260
|
+
value = node.begin_type? ? node.children.last || s(:nil) : node
|
|
261
|
+
|
|
262
|
+
value.return_type? ? extract_return_value(value) : value
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def process_return_values(return_values)
|
|
266
|
+
return_values.flat_map do |value|
|
|
267
|
+
if value.conditional?
|
|
268
|
+
process_return_values(extract_conditional_branches(value))
|
|
269
|
+
elsif and_or?(value)
|
|
270
|
+
process_return_values(extract_and_or_clauses(value))
|
|
271
|
+
else
|
|
272
|
+
value
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def and_or?(node)
|
|
278
|
+
node.type?(:and, :or)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def extract_and_or_clauses(node)
|
|
282
|
+
# Recursively traverse an `and` or `or` node to collect all clauses within
|
|
283
|
+
return node unless and_or?(node)
|
|
284
|
+
|
|
285
|
+
[extract_and_or_clauses(node.lhs), extract_and_or_clauses(node.rhs)].flatten
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def extract_conditional_branches(node)
|
|
289
|
+
return node unless node.conditional?
|
|
290
|
+
|
|
291
|
+
if node.type?(:while, :until)
|
|
292
|
+
# If there is no body, act as implicit `nil`.
|
|
293
|
+
node.body ? [last_value(node.body)] : [s(:nil)]
|
|
294
|
+
else
|
|
295
|
+
# Branches with no value act as an implicit `nil`.
|
|
296
|
+
branches = node.branches.map { |branch| branch ? last_value(branch) : s(:nil) }
|
|
297
|
+
# Missing else branches also act as an implicit `nil`.
|
|
298
|
+
branches.push(s(:nil)) unless node.else_branch
|
|
299
|
+
branches
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def conservative?
|
|
304
|
+
cop_config.fetch('Mode', :conservative).to_sym == :conservative
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def allowed_bang_method?(node)
|
|
308
|
+
return false unless allow_bang_methods?
|
|
309
|
+
|
|
310
|
+
node.bang_method?
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
def allow_bang_methods?
|
|
314
|
+
cop_config.fetch('AllowBangMethods', false)
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
# If a method ending in `?` is known to not return a boolean value,
|
|
318
|
+
# (for example, `Numeric#nonzero?`) it should be treated as a non-boolean
|
|
319
|
+
# value, despite the method naming.
|
|
320
|
+
def wayward_predicate?(name)
|
|
321
|
+
wayward_predicates.include?(name.to_s)
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def wayward_predicates
|
|
325
|
+
Array(cop_config.fetch('WaywardPredicates', []))
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
@@ -17,6 +17,15 @@ module RuboCop
|
|
|
17
17
|
# they end with a `?`. These methods should be changed to remove the
|
|
18
18
|
# prefix.
|
|
19
19
|
#
|
|
20
|
+
# When `UseSorbetSigs` is set to true (optional), the cop will only report
|
|
21
|
+
# offenses if the method has a Sorbet `sig` with a return type of
|
|
22
|
+
# `T::Boolean`. Dynamic methods are not supported with this configuration.
|
|
23
|
+
#
|
|
24
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
25
|
+
# installed, methods that override a method defined by an ancestor
|
|
26
|
+
# elsewhere in the project are not reported, since renaming an override
|
|
27
|
+
# breaks the inherited contract.
|
|
28
|
+
#
|
|
20
29
|
# @example NamePrefix: ['is_', 'has_', 'have_'] (default)
|
|
21
30
|
# # bad
|
|
22
31
|
# def is_even(value)
|
|
@@ -58,6 +67,30 @@ module RuboCop
|
|
|
58
67
|
# def is_even?(value)
|
|
59
68
|
# end
|
|
60
69
|
#
|
|
70
|
+
# @example UseSorbetSigs: false (default)
|
|
71
|
+
# # bad
|
|
72
|
+
# sig { returns(String) }
|
|
73
|
+
# def is_this_thing_on
|
|
74
|
+
# "yes"
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# # good - Sorbet signature is not evaluated
|
|
78
|
+
# sig { returns(String) }
|
|
79
|
+
# def is_this_thing_on?
|
|
80
|
+
# "yes"
|
|
81
|
+
# end
|
|
82
|
+
#
|
|
83
|
+
# @example UseSorbetSigs: true
|
|
84
|
+
# # bad
|
|
85
|
+
# sig { returns(T::Boolean) }
|
|
86
|
+
# def odd(value)
|
|
87
|
+
# end
|
|
88
|
+
#
|
|
89
|
+
# # good
|
|
90
|
+
# sig { returns(T::Boolean) }
|
|
91
|
+
# def odd?(value)
|
|
92
|
+
# end
|
|
93
|
+
#
|
|
61
94
|
# @example MethodDefinitionMacros: ['define_method', 'define_singleton_method'] (default)
|
|
62
95
|
# # bad
|
|
63
96
|
# define_method(:is_even) { |value| }
|
|
@@ -72,12 +105,13 @@ module RuboCop
|
|
|
72
105
|
# # good
|
|
73
106
|
# def_node_matcher(:even?) { |value| }
|
|
74
107
|
#
|
|
75
|
-
class
|
|
108
|
+
class PredicatePrefix < Base
|
|
109
|
+
include ProjectIndexHelp
|
|
76
110
|
include AllowedMethods
|
|
77
111
|
|
|
78
112
|
# @!method dynamic_method_define(node)
|
|
79
113
|
def_node_matcher :dynamic_method_define, <<~PATTERN
|
|
80
|
-
(send nil? #
|
|
114
|
+
(send nil? #method_definition_macro?
|
|
81
115
|
(sym $_)
|
|
82
116
|
...)
|
|
83
117
|
PATTERN
|
|
@@ -96,17 +130,24 @@ module RuboCop
|
|
|
96
130
|
end
|
|
97
131
|
|
|
98
132
|
def on_def(node)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
next if allowed_method_name?(method_name, prefix)
|
|
133
|
+
method_name = node.method_name.to_s
|
|
134
|
+
offending_prefixes = offending_prefixes_for(node, method_name)
|
|
135
|
+
return if offending_prefixes.empty? || overrides_inherited_method?(node)
|
|
103
136
|
|
|
137
|
+
offending_prefixes.each do |prefix|
|
|
104
138
|
add_offense(
|
|
105
139
|
node.loc.name,
|
|
106
140
|
message: message(method_name, expected_name(method_name, prefix))
|
|
107
141
|
)
|
|
108
142
|
end
|
|
109
143
|
end
|
|
144
|
+
|
|
145
|
+
def offending_prefixes_for(node, method_name)
|
|
146
|
+
predicate_prefixes.reject do |prefix|
|
|
147
|
+
allowed_method_name?(method_name, prefix) ||
|
|
148
|
+
(use_sorbet_sigs? && !sorbet_sig?(node, return_type: 'T::Boolean'))
|
|
149
|
+
end
|
|
150
|
+
end
|
|
110
151
|
alias on_defs on_def
|
|
111
152
|
|
|
112
153
|
def validate_config
|
|
@@ -114,13 +155,24 @@ module RuboCop
|
|
|
114
155
|
next if predicate_prefixes.include?(forbidden_prefix)
|
|
115
156
|
|
|
116
157
|
raise ValidationError, <<~MSG.chomp
|
|
117
|
-
The `Naming/
|
|
158
|
+
The `Naming/PredicatePrefix` cop is misconfigured. Prefix #{forbidden_prefix} must be included in NamePrefix because it is included in ForbiddenPrefixes.
|
|
118
159
|
MSG
|
|
119
160
|
end
|
|
120
161
|
end
|
|
121
162
|
|
|
122
163
|
private
|
|
123
164
|
|
|
165
|
+
# @!method sorbet_return_type(node)
|
|
166
|
+
def_node_matcher :sorbet_return_type, <<~PATTERN
|
|
167
|
+
(block (send nil? :sig) args (send _ :returns $_type))
|
|
168
|
+
PATTERN
|
|
169
|
+
|
|
170
|
+
def sorbet_sig?(node, return_type: nil)
|
|
171
|
+
return false unless (type = sorbet_return_type(node.left_sibling))
|
|
172
|
+
|
|
173
|
+
type.source == return_type
|
|
174
|
+
end
|
|
175
|
+
|
|
124
176
|
def allowed_method_name?(method_name, prefix)
|
|
125
177
|
!(method_name.start_with?(prefix) && # cheap check to avoid allocating Regexp
|
|
126
178
|
method_name.match?(/^#{prefix}[^0-9]/)) ||
|
|
@@ -151,9 +203,29 @@ module RuboCop
|
|
|
151
203
|
cop_config['NamePrefix']
|
|
152
204
|
end
|
|
153
205
|
|
|
154
|
-
def
|
|
206
|
+
def use_sorbet_sigs?
|
|
207
|
+
cop_config['UseSorbetSigs']
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def method_definition_macro?(macro_name)
|
|
155
211
|
cop_config['MethodDefinitionMacros'].include?(macro_name.to_s)
|
|
156
212
|
end
|
|
213
|
+
|
|
214
|
+
# When `AllCops/UseProjectIndex` is enabled, methods that override a
|
|
215
|
+
# method defined by an ancestor elsewhere in the project are not
|
|
216
|
+
# reported: renaming an override breaks the inherited contract.
|
|
217
|
+
def overrides_inherited_method?(node)
|
|
218
|
+
return false unless project_index
|
|
219
|
+
return false unless (namespace_node = node.each_ancestor(:class, :module).first)
|
|
220
|
+
|
|
221
|
+
declaration = resolve_constant_in_index(namespace_node.identifier)
|
|
222
|
+
return false unless declaration.is_a?(Rubydex::Namespace)
|
|
223
|
+
|
|
224
|
+
scope = node.defs_type? ? indexed_singleton_of(declaration) : declaration
|
|
225
|
+
!scope.nil? && inherited_index_member?(scope, "#{node.method_name}()")
|
|
226
|
+
rescue StandardError
|
|
227
|
+
false
|
|
228
|
+
end
|
|
157
229
|
end
|
|
158
230
|
end
|
|
159
231
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Naming
|
|
6
|
-
# Makes sure that rescued
|
|
6
|
+
# Makes sure that rescued exception variables are named as
|
|
7
7
|
# expected.
|
|
8
8
|
#
|
|
9
9
|
# The `PreferredName` config option takes a `String`. It represents
|
|
@@ -95,11 +95,14 @@ module RuboCop
|
|
|
95
95
|
|
|
96
96
|
def autocorrect(corrector, node, range, offending_name, preferred_name)
|
|
97
97
|
corrector.replace(range, preferred_name)
|
|
98
|
-
|
|
98
|
+
# Once the exception variable is reassigned, later references point to a
|
|
99
|
+
# different value, so stop correcting after the reassignment - both in the
|
|
100
|
+
# body and in the code following the `begin`/`rescue`.
|
|
101
|
+
return if correct_node(corrector, node.body, offending_name, preferred_name)
|
|
99
102
|
return unless (kwbegin_node = node.parent.each_ancestor(:kwbegin).first)
|
|
100
103
|
|
|
101
104
|
kwbegin_node.right_siblings.each do |child_node|
|
|
102
|
-
correct_node(corrector, child_node, offending_name, preferred_name)
|
|
105
|
+
break if correct_node(corrector, child_node, offending_name, preferred_name)
|
|
103
106
|
end
|
|
104
107
|
end
|
|
105
108
|
|
|
@@ -113,7 +116,9 @@ module RuboCop
|
|
|
113
116
|
end
|
|
114
117
|
end
|
|
115
118
|
|
|
116
|
-
#
|
|
119
|
+
# Returns the reassignment node once the exception variable is reassigned (a truthy
|
|
120
|
+
# signal to stop correcting later references), or `nil` when no reassignment is found.
|
|
121
|
+
# rubocop:disable-next Metrics/MethodLength
|
|
117
122
|
def correct_node(corrector, node, offending_name, preferred_name)
|
|
118
123
|
return unless node
|
|
119
124
|
|
|
@@ -131,11 +136,11 @@ module RuboCop
|
|
|
131
136
|
|
|
132
137
|
if child_node.type?(:masgn, :lvasgn)
|
|
133
138
|
correct_reassignment(corrector, child_node, offending_name, preferred_name)
|
|
134
|
-
|
|
139
|
+
return child_node
|
|
135
140
|
end
|
|
136
141
|
end
|
|
142
|
+
nil
|
|
137
143
|
end
|
|
138
|
-
# rubocop:enable Metrics/MethodLength
|
|
139
144
|
|
|
140
145
|
# If the exception variable is reassigned, that assignment needs to be corrected.
|
|
141
146
|
# Further `lvar` nodes will not be corrected though since they now refer to a
|
|
@@ -3,8 +3,15 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Naming
|
|
6
|
-
#
|
|
7
|
-
#
|
|
6
|
+
# Checks that the configured style (snake_case or camelCase) is used for all variable names.
|
|
7
|
+
# This includes local variables, instance variables, class variables, method arguments
|
|
8
|
+
# (positional, keyword, rest or block), and block arguments.
|
|
9
|
+
#
|
|
10
|
+
# The cop can also be configured to forbid using specific names for variables, using
|
|
11
|
+
# `ForbiddenIdentifiers` or `ForbiddenPatterns`. In addition to the above, this applies
|
|
12
|
+
# to global variables as well.
|
|
13
|
+
#
|
|
14
|
+
# Method definitions and method calls are not affected by this cop.
|
|
8
15
|
#
|
|
9
16
|
# @example EnforcedStyle: snake_case (default)
|
|
10
17
|
# # bad
|
|
@@ -26,24 +33,45 @@ module RuboCop
|
|
|
26
33
|
#
|
|
27
34
|
# @example AllowedPatterns: ['_v\d+\z']
|
|
28
35
|
# # good (with EnforcedStyle: camelCase)
|
|
29
|
-
#
|
|
36
|
+
# release_v1 = true
|
|
37
|
+
#
|
|
38
|
+
# @example ForbiddenIdentifiers: ['fooBar']
|
|
39
|
+
# # bad (in all cases)
|
|
40
|
+
# fooBar = 1
|
|
41
|
+
# @fooBar = 1
|
|
42
|
+
# @@fooBar = 1
|
|
43
|
+
# $fooBar = 1
|
|
44
|
+
#
|
|
45
|
+
# @example ForbiddenPatterns: ['_v\d+\z']
|
|
46
|
+
# # bad (in all cases)
|
|
47
|
+
# release_v1 = true
|
|
48
|
+
# @release_v1 = true
|
|
49
|
+
# @@release_v1 = true
|
|
50
|
+
# $release_v1 = true
|
|
30
51
|
#
|
|
31
52
|
class VariableName < Base
|
|
32
53
|
include AllowedIdentifiers
|
|
33
54
|
include ConfigurableNaming
|
|
34
55
|
include AllowedPattern
|
|
56
|
+
include ForbiddenIdentifiers
|
|
57
|
+
include ForbiddenPattern
|
|
35
58
|
|
|
36
59
|
MSG = 'Use %<style>s for variable names.'
|
|
60
|
+
MSG_FORBIDDEN = '`%<identifier>s` is forbidden, use another name instead.'
|
|
37
61
|
|
|
38
62
|
def valid_name?(node, name, given_style = style)
|
|
39
63
|
super || matches_allowed_pattern?(name)
|
|
40
64
|
end
|
|
41
65
|
|
|
42
66
|
def on_lvasgn(node)
|
|
43
|
-
return unless node.name
|
|
44
|
-
return if allowed_identifier?(
|
|
67
|
+
return unless (name = node.name)
|
|
68
|
+
return if allowed_identifier?(name)
|
|
45
69
|
|
|
46
|
-
|
|
70
|
+
if forbidden_name?(name)
|
|
71
|
+
register_forbidden_name(node)
|
|
72
|
+
else
|
|
73
|
+
check_name(node, name, node.loc.name)
|
|
74
|
+
end
|
|
47
75
|
end
|
|
48
76
|
alias on_ivasgn on_lvasgn
|
|
49
77
|
alias on_cvasgn on_lvasgn
|
|
@@ -56,11 +84,28 @@ module RuboCop
|
|
|
56
84
|
alias on_blockarg on_lvasgn
|
|
57
85
|
alias on_lvar on_lvasgn
|
|
58
86
|
|
|
87
|
+
# Only forbidden names are checked for global variable assignment
|
|
88
|
+
def on_gvasgn(node)
|
|
89
|
+
return unless (name = node.name)
|
|
90
|
+
return unless forbidden_name?(name)
|
|
91
|
+
|
|
92
|
+
register_forbidden_name(node)
|
|
93
|
+
end
|
|
94
|
+
|
|
59
95
|
private
|
|
60
96
|
|
|
97
|
+
def forbidden_name?(name)
|
|
98
|
+
forbidden_identifier?(name) || forbidden_pattern?(name)
|
|
99
|
+
end
|
|
100
|
+
|
|
61
101
|
def message(style)
|
|
62
102
|
format(MSG, style: style)
|
|
63
103
|
end
|
|
104
|
+
|
|
105
|
+
def register_forbidden_name(node)
|
|
106
|
+
message = format(MSG_FORBIDDEN, identifier: node.name)
|
|
107
|
+
add_offense(node.loc.name, message: message)
|
|
108
|
+
end
|
|
64
109
|
end
|
|
65
110
|
end
|
|
66
111
|
end
|
|
@@ -132,7 +132,9 @@ module RuboCop
|
|
|
132
132
|
|
|
133
133
|
def on_sym(node)
|
|
134
134
|
@node = node
|
|
135
|
-
|
|
135
|
+
|
|
136
|
+
# Prism parses a quoted empty hash key (`{ "": value }`) as an empty symbol node.
|
|
137
|
+
return if node.value.empty? || allowed_identifier?(node.value)
|
|
136
138
|
|
|
137
139
|
check_name(node, node.value, node) if cop_config['CheckSymbols']
|
|
138
140
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
# Cops for the `Naming` department. The department's cops are registered for lazy loading
|
|
6
|
+
# and their files are loaded on demand.
|
|
7
|
+
module Naming
|
|
8
|
+
extend LazyLoader
|
|
9
|
+
|
|
10
|
+
register_cop :AccessorMethodName, "#{__dir__}/naming/accessor_method_name"
|
|
11
|
+
register_cop :AsciiIdentifiers, "#{__dir__}/naming/ascii_identifiers"
|
|
12
|
+
register_cop :BlockForwarding, "#{__dir__}/naming/block_forwarding"
|
|
13
|
+
register_cop :BlockParameterName, "#{__dir__}/naming/block_parameter_name"
|
|
14
|
+
register_cop :ClassAndModuleCamelCase, "#{__dir__}/naming/class_and_module_camel_case"
|
|
15
|
+
register_cop :ConstantName, "#{__dir__}/naming/constant_name"
|
|
16
|
+
register_cop :FileName, "#{__dir__}/naming/file_name"
|
|
17
|
+
register_cop :HeredocDelimiterCase, "#{__dir__}/naming/heredoc_delimiter_case"
|
|
18
|
+
register_cop :HeredocDelimiterNaming, "#{__dir__}/naming/heredoc_delimiter_naming"
|
|
19
|
+
register_cop :InclusiveLanguage, "#{__dir__}/naming/inclusive_language"
|
|
20
|
+
register_cop :MemoizedInstanceVariableName, "#{__dir__}/naming/memoized_instance_variable_name"
|
|
21
|
+
register_cop :MethodName, "#{__dir__}/naming/method_name"
|
|
22
|
+
register_cop :MethodParameterName, "#{__dir__}/naming/method_parameter_name"
|
|
23
|
+
register_cop :BinaryOperatorParameterName, "#{__dir__}/naming/binary_operator_parameter_name"
|
|
24
|
+
register_cop :PredicateMethod, "#{__dir__}/naming/predicate_method"
|
|
25
|
+
register_cop :PredicatePrefix, "#{__dir__}/naming/predicate_prefix"
|
|
26
|
+
register_cop :RescuedExceptionsVariableName, "#{__dir__}/naming/rescued_exceptions_variable_name"
|
|
27
|
+
register_cop :VariableName, "#{__dir__}/naming/variable_name"
|
|
28
|
+
register_cop :VariableNumber, "#{__dir__}/naming/variable_number"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|