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,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for `map { |x| x.to_s }.join` and similar calls where the
|
|
7
|
+
# `map` is redundant because `Array#join` implicitly calls `#to_s` on
|
|
8
|
+
# each element.
|
|
9
|
+
#
|
|
10
|
+
# @safety
|
|
11
|
+
# This cop is unsafe because it cannot guarantee that the receiver
|
|
12
|
+
# is an `Array` by static analysis. If the receiver does not have
|
|
13
|
+
# an `Array#join`-compatible implementation (i.e. one that calls
|
|
14
|
+
# `#to_s` on elements), the correction may change behavior.
|
|
15
|
+
#
|
|
16
|
+
# @example
|
|
17
|
+
# # bad
|
|
18
|
+
# array.map(&:to_s).join(', ')
|
|
19
|
+
#
|
|
20
|
+
# # bad
|
|
21
|
+
# array.map { |x| x.to_s }.join(', ')
|
|
22
|
+
#
|
|
23
|
+
# # bad
|
|
24
|
+
# array.collect(&:to_s).join
|
|
25
|
+
#
|
|
26
|
+
# # good
|
|
27
|
+
# array.join(', ')
|
|
28
|
+
#
|
|
29
|
+
# # good
|
|
30
|
+
# array.join
|
|
31
|
+
#
|
|
32
|
+
class MapJoin < Base
|
|
33
|
+
extend AutoCorrector
|
|
34
|
+
include RangeHelp
|
|
35
|
+
|
|
36
|
+
MSG = 'Remove redundant `%<method>s(&:to_s)` before `join`.'
|
|
37
|
+
RESTRICT_ON_SEND = %i[join].freeze
|
|
38
|
+
|
|
39
|
+
# map(&:to_s).join(...)
|
|
40
|
+
# @!method map_to_s_join?(node)
|
|
41
|
+
def_node_matcher :map_to_s_join?, <<~PATTERN
|
|
42
|
+
(call
|
|
43
|
+
$(call _ ${:map :collect} (block_pass (sym :to_s)))
|
|
44
|
+
:join ...)
|
|
45
|
+
PATTERN
|
|
46
|
+
|
|
47
|
+
# map { |x| x.to_s }.join(...)
|
|
48
|
+
# @!method map_to_s_block_join?(node)
|
|
49
|
+
def_node_matcher :map_to_s_block_join?, <<~PATTERN
|
|
50
|
+
(call
|
|
51
|
+
$(block
|
|
52
|
+
(call _ ${:map :collect})
|
|
53
|
+
(args (arg _x))
|
|
54
|
+
(send (lvar _x) :to_s))
|
|
55
|
+
:join ...)
|
|
56
|
+
PATTERN
|
|
57
|
+
|
|
58
|
+
# map { _1.to_s }.join(...)
|
|
59
|
+
# @!method map_to_s_numblock_join?(node)
|
|
60
|
+
def_node_matcher :map_to_s_numblock_join?, <<~PATTERN
|
|
61
|
+
(call
|
|
62
|
+
$(numblock
|
|
63
|
+
(call _ ${:map :collect})
|
|
64
|
+
1
|
|
65
|
+
(send (lvar :_1) :to_s))
|
|
66
|
+
:join ...)
|
|
67
|
+
PATTERN
|
|
68
|
+
|
|
69
|
+
# map { it.to_s }.join(...)
|
|
70
|
+
# @!method map_to_s_itblock_join?(node)
|
|
71
|
+
def_node_matcher :map_to_s_itblock_join?, <<~PATTERN
|
|
72
|
+
(call
|
|
73
|
+
$(itblock
|
|
74
|
+
(call _ ${:map :collect})
|
|
75
|
+
:it
|
|
76
|
+
(send (lvar :it) :to_s))
|
|
77
|
+
:join ...)
|
|
78
|
+
PATTERN
|
|
79
|
+
|
|
80
|
+
def on_send(node)
|
|
81
|
+
map_to_s_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
82
|
+
map_to_s_block_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
83
|
+
map_to_s_numblock_join?(node) { |m, n| register_offense(node, m, n) } ||
|
|
84
|
+
map_to_s_itblock_join?(node) { |m, n| register_offense(node, m, n) }
|
|
85
|
+
end
|
|
86
|
+
alias on_csend on_send
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def register_offense(join_node, map_node, method_name)
|
|
91
|
+
map_send = map_node.any_block_type? ? map_node.send_node : map_node
|
|
92
|
+
message = format(MSG, method: method_name)
|
|
93
|
+
|
|
94
|
+
add_offense(map_send.loc.selector, message: message) do |corrector|
|
|
95
|
+
remove_map_call(corrector, join_node, map_node, map_send)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def remove_map_call(corrector, join_node, map_node, map_send)
|
|
100
|
+
receiver = map_send.receiver
|
|
101
|
+
if receiver
|
|
102
|
+
corrector.replace(removal_range(receiver, map_node, map_send), '')
|
|
103
|
+
else
|
|
104
|
+
corrector.replace(no_receiver_range(map_node, join_node), '')
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def removal_range(receiver, map_node, map_send)
|
|
109
|
+
start_pos = if receiver.last_line < map_send.loc.dot.line
|
|
110
|
+
receiver.source_range.end_pos
|
|
111
|
+
else
|
|
112
|
+
map_send.loc.dot.begin_pos
|
|
113
|
+
end
|
|
114
|
+
range_between(start_pos, map_node.source_range.end_pos)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def no_receiver_range(map_node, join_node)
|
|
118
|
+
range_between(map_node.source_range.begin_pos, join_node.loc.dot.end_pos)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -45,18 +45,21 @@ module RuboCop
|
|
|
45
45
|
}
|
|
46
46
|
PATTERN
|
|
47
47
|
|
|
48
|
+
# @!method destructuring_argument(node)
|
|
49
|
+
def_node_matcher :destructuring_argument, <<~PATTERN
|
|
50
|
+
(args $(mlhs (arg _)+))
|
|
51
|
+
PATTERN
|
|
52
|
+
|
|
48
53
|
def self.autocorrect_incompatible_with
|
|
49
54
|
[Layout::SingleLineBlockChain]
|
|
50
55
|
end
|
|
51
56
|
|
|
52
57
|
def on_send(node)
|
|
53
58
|
return unless (to_h_node, map_node = map_to_h(node))
|
|
59
|
+
return if to_h_node.block_literal?
|
|
54
60
|
|
|
55
61
|
message = format(MSG, method: map_node.loc.selector.source, dot: to_h_node.loc.dot.source)
|
|
56
62
|
add_offense(map_node.loc.selector, message: message) do |corrector|
|
|
57
|
-
# If the `to_h` call already has a block, do not autocorrect.
|
|
58
|
-
next if to_h_node.block_literal?
|
|
59
|
-
|
|
60
63
|
autocorrect(corrector, to_h_node, map_node)
|
|
61
64
|
end
|
|
62
65
|
end
|
|
@@ -64,7 +67,7 @@ module RuboCop
|
|
|
64
67
|
|
|
65
68
|
private
|
|
66
69
|
|
|
67
|
-
# rubocop:disable Metrics/AbcSize
|
|
70
|
+
# rubocop:disable-next Metrics/AbcSize
|
|
68
71
|
def autocorrect(corrector, to_h, map)
|
|
69
72
|
removal_range = range_between(to_h.loc.dot.begin_pos, to_h.loc.selector.end_pos)
|
|
70
73
|
|
|
@@ -73,8 +76,13 @@ module RuboCop
|
|
|
73
76
|
corrector.replace(map_dot, to_h.loc.dot.source)
|
|
74
77
|
end
|
|
75
78
|
corrector.replace(map.loc.selector, 'to_h')
|
|
79
|
+
|
|
80
|
+
return unless map.parent.block_type?
|
|
81
|
+
|
|
82
|
+
if (argument = destructuring_argument(map.parent.arguments))
|
|
83
|
+
corrector.replace(argument, argument.source[1..-2])
|
|
84
|
+
end
|
|
76
85
|
end
|
|
77
|
-
# rubocop:enable Metrics/AbcSize
|
|
78
86
|
end
|
|
79
87
|
end
|
|
80
88
|
end
|
|
@@ -40,12 +40,10 @@ module RuboCop
|
|
|
40
40
|
|
|
41
41
|
def on_send(node)
|
|
42
42
|
return unless (to_set_node, map_node = map_to_set?(node))
|
|
43
|
+
return if to_set_node.block_literal?
|
|
43
44
|
|
|
44
45
|
message = format(MSG, method: map_node.loc.selector.source)
|
|
45
46
|
add_offense(map_node.loc.selector, message: message) do |corrector|
|
|
46
|
-
# If the `to_set` call already has a block, do not autocorrect.
|
|
47
|
-
next if to_set_node.block_literal?
|
|
48
|
-
|
|
49
47
|
autocorrect(corrector, to_set_node, map_node)
|
|
50
48
|
end
|
|
51
49
|
end
|
|
@@ -5,14 +5,29 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
class MethodCallWithArgsParentheses
|
|
7
7
|
# Style omit_parentheses
|
|
8
|
-
# rubocop:disable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
|
8
|
+
# rubocop:disable-next Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
|
9
9
|
module OmitParentheses
|
|
10
10
|
include RangeHelp
|
|
11
|
+
include ReparsedEquivalence
|
|
11
12
|
|
|
12
13
|
TRAILING_WHITESPACE_REGEX = /\s+\Z/.freeze
|
|
13
14
|
OMIT_MSG = 'Omit parentheses for method calls with arguments.'
|
|
14
15
|
private_constant :OMIT_MSG
|
|
15
16
|
|
|
17
|
+
def on_investigation_end
|
|
18
|
+
# Each candidate's exact correction is verified by reparsing before
|
|
19
|
+
# the offense is registered, so an omission that would change how
|
|
20
|
+
# the code parses is never reported or offered.
|
|
21
|
+
verified_by_reparse(@pending_omit_offenses || []).each do |node|
|
|
22
|
+
add_offense(offense_range(node), message: OMIT_MSG) do |corrector|
|
|
23
|
+
autocorrect(corrector, node)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
@pending_omit_offenses = []
|
|
27
|
+
|
|
28
|
+
super
|
|
29
|
+
end
|
|
30
|
+
|
|
16
31
|
private
|
|
17
32
|
|
|
18
33
|
def omit_parentheses(node) # rubocop:disable Metrics/PerceivedComplexity
|
|
@@ -26,9 +41,11 @@ module RuboCop
|
|
|
26
41
|
return if allowed_camel_case_method_call?(node)
|
|
27
42
|
return if allowed_string_interpolation_method_call?(node)
|
|
28
43
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
(@pending_omit_offenses ||= []) << node
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def apply_reparse_correction(corrector, node)
|
|
48
|
+
autocorrect(corrector, node)
|
|
32
49
|
end
|
|
33
50
|
|
|
34
51
|
def autocorrect(corrector, node)
|
|
@@ -49,7 +66,7 @@ module RuboCop
|
|
|
49
66
|
|
|
50
67
|
def inside_endless_method_def?(node)
|
|
51
68
|
# parens are required around arguments inside an endless method
|
|
52
|
-
node.each_ancestor(:
|
|
69
|
+
node.each_ancestor(:any_def).any?(&:endless?) && node.arguments.any?
|
|
53
70
|
end
|
|
54
71
|
|
|
55
72
|
def require_parentheses_for_hash_value_omission?(node) # rubocop:disable Metrics/PerceivedComplexity
|
|
@@ -108,7 +125,7 @@ module RuboCop
|
|
|
108
125
|
end
|
|
109
126
|
|
|
110
127
|
def call_in_literals?(node)
|
|
111
|
-
parent = node.parent&.
|
|
128
|
+
parent = node.parent&.any_block_type? ? node.parent.parent : node.parent
|
|
112
129
|
return false unless parent
|
|
113
130
|
|
|
114
131
|
parent.type?(:pair, :array, :range) ||
|
|
@@ -117,7 +134,7 @@ module RuboCop
|
|
|
117
134
|
end
|
|
118
135
|
|
|
119
136
|
def call_in_logical_operators?(node)
|
|
120
|
-
parent = node.parent&.
|
|
137
|
+
parent = node.parent&.any_block_type? ? node.parent.parent : node.parent
|
|
121
138
|
return false unless parent
|
|
122
139
|
|
|
123
140
|
logical_operator?(parent) ||
|
|
@@ -133,7 +150,7 @@ module RuboCop
|
|
|
133
150
|
node.parent&.class_type? && node.parent.single_line?
|
|
134
151
|
end
|
|
135
152
|
|
|
136
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
|
153
|
+
# rubocop:disable-next Metrics/PerceivedComplexity
|
|
137
154
|
def call_with_ambiguous_arguments?(node)
|
|
138
155
|
call_with_braced_block?(node) ||
|
|
139
156
|
call_in_argument_with_block?(node) ||
|
|
@@ -146,14 +163,13 @@ module RuboCop
|
|
|
146
163
|
ambiguous_literal?(n) || logical_operator?(n)
|
|
147
164
|
end
|
|
148
165
|
end
|
|
149
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
|
150
166
|
|
|
151
167
|
def call_with_braced_block?(node)
|
|
152
168
|
node.type?(:call, :super) && node.block_node&.braces?
|
|
153
169
|
end
|
|
154
170
|
|
|
155
171
|
def call_in_argument_with_block?(node)
|
|
156
|
-
parent = node.parent&.
|
|
172
|
+
parent = node.parent&.any_block_type? && node.parent.parent
|
|
157
173
|
return false unless parent
|
|
158
174
|
|
|
159
175
|
parent.type?(:call, :super, :yield)
|
|
@@ -167,7 +183,7 @@ module RuboCop
|
|
|
167
183
|
def call_in_match_pattern?(node)
|
|
168
184
|
return false unless (parent = node.parent)
|
|
169
185
|
|
|
170
|
-
parent.
|
|
186
|
+
parent.any_match_pattern_type?
|
|
171
187
|
end
|
|
172
188
|
|
|
173
189
|
def hash_literal_in_arguments?(node)
|
|
@@ -222,8 +238,9 @@ module RuboCop
|
|
|
222
238
|
end
|
|
223
239
|
|
|
224
240
|
def unary_literal?(node)
|
|
225
|
-
|
|
226
|
-
|
|
241
|
+
return true if node.numeric_type? && node.sign?
|
|
242
|
+
|
|
243
|
+
node.parent&.send_type? && node.parent.unary_operation?
|
|
227
244
|
end
|
|
228
245
|
|
|
229
246
|
def assigned_before?(node, target)
|
|
@@ -248,10 +265,9 @@ module RuboCop
|
|
|
248
265
|
return false unless (last_argument = node.last_argument)
|
|
249
266
|
return true if last_argument.forwarded_restarg_type?
|
|
250
267
|
|
|
251
|
-
last_argument.hash_type? && last_argument.children.
|
|
268
|
+
last_argument.hash_type? && last_argument.children.any?(&:forwarded_kwrestarg_type?)
|
|
252
269
|
end
|
|
253
270
|
end
|
|
254
|
-
# rubocop:enable Metrics/ModuleLength, Metrics/CyclomaticComplexity
|
|
255
271
|
end
|
|
256
272
|
end
|
|
257
273
|
end
|
|
@@ -33,13 +33,26 @@ module RuboCop
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def included_macros_list
|
|
36
|
-
cop_config.fetch('IncludedMacros', []).map(&:to_sym)
|
|
36
|
+
@included_macros_list ||= cop_config.fetch('IncludedMacros', []).map(&:to_sym).freeze
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def included_macro_patterns
|
|
40
|
+
@included_macro_patterns ||=
|
|
41
|
+
cop_config.fetch('IncludedMacroPatterns', [])
|
|
42
|
+
.map { |pattern| Regexp.new(pattern) }.freeze
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def matches_included_macro_pattern?(method_name)
|
|
46
|
+
included_macro_patterns.any? do |pattern|
|
|
47
|
+
pattern.match?(method_name.to_s)
|
|
48
|
+
end
|
|
37
49
|
end
|
|
38
50
|
|
|
39
51
|
def ignored_macro?(node)
|
|
40
52
|
cop_config['IgnoreMacros'] &&
|
|
41
53
|
node.macro? &&
|
|
42
|
-
!included_macros_list.include?(node.method_name)
|
|
54
|
+
!included_macros_list.include?(node.method_name) &&
|
|
55
|
+
!matches_included_macro_pattern?(node.method_name)
|
|
43
56
|
end
|
|
44
57
|
end
|
|
45
58
|
end
|
|
@@ -9,17 +9,20 @@ module RuboCop
|
|
|
9
9
|
# In the default style (require_parentheses), macro methods are allowed.
|
|
10
10
|
# Additional methods can be added to the `AllowedMethods` or
|
|
11
11
|
# `AllowedPatterns` list. These options are valid only in the default
|
|
12
|
-
# style. Macros can be included by either setting `IgnoreMacros` to false
|
|
13
|
-
#
|
|
12
|
+
# style. Macros can be included by either setting `IgnoreMacros` to false,
|
|
13
|
+
# adding specific macros to the `IncludedMacros` list, or using
|
|
14
|
+
# `IncludedMacroPatterns` for pattern-based matching.
|
|
14
15
|
#
|
|
15
16
|
# Precedence of options is as follows:
|
|
16
17
|
#
|
|
17
18
|
# 1. `AllowedMethods`
|
|
18
19
|
# 2. `AllowedPatterns`
|
|
19
20
|
# 3. `IncludedMacros`
|
|
21
|
+
# 4. `IncludedMacroPatterns`
|
|
20
22
|
#
|
|
21
|
-
# If a method is listed in both `IncludedMacros`
|
|
22
|
-
# then the latter takes precedence (that is, the
|
|
23
|
+
# If a method is listed in both `IncludedMacros`/`IncludedMacroPatterns`
|
|
24
|
+
# and `AllowedMethods`, then the latter takes precedence (that is, the
|
|
25
|
+
# method is allowed).
|
|
23
26
|
#
|
|
24
27
|
# In the alternative style (omit_parentheses), there are three additional
|
|
25
28
|
# options.
|
|
@@ -132,6 +135,32 @@ module RuboCop
|
|
|
132
135
|
# bar :baz
|
|
133
136
|
# end
|
|
134
137
|
#
|
|
138
|
+
# @example AllowedMethods: ["puts", "print"]
|
|
139
|
+
#
|
|
140
|
+
# # good
|
|
141
|
+
# puts "Hello world"
|
|
142
|
+
# print "Hello world"
|
|
143
|
+
# # still enforces parentheses on other methods
|
|
144
|
+
# array.delete(e)
|
|
145
|
+
#
|
|
146
|
+
# @example AllowedPatterns: ["^assert"]
|
|
147
|
+
#
|
|
148
|
+
# # good
|
|
149
|
+
# assert_equal 'test', x
|
|
150
|
+
# assert_match(/foo/, bar)
|
|
151
|
+
# # still enforces parentheses on other methods
|
|
152
|
+
# array.delete(e)
|
|
153
|
+
#
|
|
154
|
+
# @example IncludedMacroPatterns: ["^assert", "^refute"]
|
|
155
|
+
#
|
|
156
|
+
# # bad
|
|
157
|
+
# assert_equal 'test', x
|
|
158
|
+
# refute_nil value
|
|
159
|
+
#
|
|
160
|
+
# # good
|
|
161
|
+
# assert_equal('test', x)
|
|
162
|
+
# refute_nil(value)
|
|
163
|
+
#
|
|
135
164
|
# @example AllowParenthesesInMultilineCall: false (default)
|
|
136
165
|
#
|
|
137
166
|
# # bad
|
|
@@ -213,7 +242,7 @@ module RuboCop
|
|
|
213
242
|
extend AutoCorrector
|
|
214
243
|
|
|
215
244
|
def self.autocorrect_incompatible_with
|
|
216
|
-
[Style::NestedParenthesizedCalls, Style::RescueModifier]
|
|
245
|
+
[Style::NestedParenthesizedCalls, Style::RescueModifier, Style::TrailingCommaInArguments]
|
|
217
246
|
end
|
|
218
247
|
|
|
219
248
|
def on_send(node)
|
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
|
33
33
|
|
|
34
34
|
MSG = 'Do not use parentheses for method calls with no arguments.'
|
|
35
35
|
|
|
36
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
36
|
+
# rubocop:disable-next Metrics/CyclomaticComplexity
|
|
37
37
|
def on_send(node)
|
|
38
38
|
return unless !node.arguments? && node.parenthesized?
|
|
39
39
|
return if ineligible_node?(node)
|
|
@@ -44,15 +44,16 @@ module RuboCop
|
|
|
44
44
|
|
|
45
45
|
register_offense(node)
|
|
46
46
|
end
|
|
47
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
48
47
|
alias on_csend on_send
|
|
49
48
|
|
|
50
49
|
private
|
|
51
50
|
|
|
52
51
|
def register_offense(node)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
range = offense_range(node)
|
|
53
|
+
return if processed_source.contains_comment?(range)
|
|
54
|
+
|
|
55
|
+
add_offense(range) do |corrector|
|
|
56
|
+
corrector.remove(range)
|
|
56
57
|
end
|
|
57
58
|
end
|
|
58
59
|
|
|
@@ -88,8 +89,12 @@ module RuboCop
|
|
|
88
89
|
#
|
|
89
90
|
def parenthesized_it_method_in_block?(node)
|
|
90
91
|
return false unless node.method?(:it)
|
|
91
|
-
return false unless (block_node = node.each_ancestor(:
|
|
92
|
-
|
|
92
|
+
return false unless (block_node = node.each_ancestor(:any_block).first)
|
|
93
|
+
# Inside a numbered/`it` block, a bare `it` is a parse error (it conflicts
|
|
94
|
+
# with the implicit parameter), so `it()` must keep its parentheses.
|
|
95
|
+
if block_node.block_type? && !block_node.arguments.empty_and_without_delimiters?
|
|
96
|
+
return false
|
|
97
|
+
end
|
|
93
98
|
|
|
94
99
|
!node.receiver && node.arguments.empty? && !node.block_literal?
|
|
95
100
|
end
|
|
@@ -36,12 +36,13 @@ module RuboCop
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
alias on_numblock on_block
|
|
39
|
+
alias on_itblock on_block
|
|
39
40
|
|
|
40
41
|
def on_send(node)
|
|
41
42
|
return if ignored_node?(node)
|
|
42
43
|
|
|
43
44
|
return unless (receiver = node.receiver)
|
|
44
|
-
return unless receiver.any_block_type? && receiver.
|
|
45
|
+
return unless receiver.any_block_type? && receiver.keywords?
|
|
45
46
|
|
|
46
47
|
range = range_between(receiver.loc.end.begin_pos, node.source_range.end_pos)
|
|
47
48
|
|
|
@@ -102,9 +102,11 @@ module RuboCop
|
|
|
102
102
|
MSG_PRESENT = 'Use def without parentheses.'
|
|
103
103
|
MSG_MISSING = 'Use def with parentheses when there are parameters.'
|
|
104
104
|
|
|
105
|
-
def
|
|
106
|
-
|
|
105
|
+
def self.autocorrect_incompatible_with
|
|
106
|
+
[Style::ArgumentsForwarding]
|
|
107
|
+
end
|
|
107
108
|
|
|
109
|
+
def on_def(node)
|
|
108
110
|
args = node.arguments
|
|
109
111
|
|
|
110
112
|
if require_parentheses?(args)
|
|
@@ -113,10 +115,10 @@ module RuboCop
|
|
|
113
115
|
else
|
|
114
116
|
correct_style_detected
|
|
115
117
|
end
|
|
118
|
+
elsif forced_parentheses?(node)
|
|
119
|
+
correct_style_detected
|
|
116
120
|
elsif parentheses?(args)
|
|
117
121
|
unwanted_parentheses(args)
|
|
118
|
-
else
|
|
119
|
-
correct_style_detected
|
|
120
122
|
end
|
|
121
123
|
end
|
|
122
124
|
alias on_defs on_def
|
|
@@ -168,7 +170,7 @@ module RuboCop
|
|
|
168
170
|
|
|
169
171
|
def anonymous_arguments?(node)
|
|
170
172
|
return true if node.arguments.any? do |arg|
|
|
171
|
-
arg.type?(:
|
|
173
|
+
arg.forward_arg_type? || (arg.type?(:restarg, :kwrestarg) && arg.name.nil?)
|
|
172
174
|
end
|
|
173
175
|
return false unless (last_argument = node.last_argument)
|
|
174
176
|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Enforces the use of `max` or `min` instead of comparison for greater or less.
|
|
7
7
|
#
|
|
8
8
|
# NOTE: It can be used if you want to present limit or threshold in Ruby 2.7+.
|
|
9
|
-
#
|
|
9
|
+
# It is slow though. So autocorrection will apply generic `max` or `min`:
|
|
10
10
|
#
|
|
11
11
|
# [source,ruby]
|
|
12
12
|
# ----
|
|
@@ -39,16 +39,27 @@ module RuboCop
|
|
|
39
39
|
include RangeHelp
|
|
40
40
|
|
|
41
41
|
MSG = 'Use `%<prefer>s` instead.'
|
|
42
|
-
|
|
42
|
+
GREATER_OPERATORS = %i[> >=].freeze
|
|
43
43
|
LESS_OPERATORS = %i[< <=].freeze
|
|
44
|
-
COMPARISON_OPERATORS =
|
|
44
|
+
COMPARISON_OPERATORS = (GREATER_OPERATORS + LESS_OPERATORS).to_set.freeze
|
|
45
|
+
|
|
46
|
+
# @!method comparison_condition(node, name)
|
|
47
|
+
def_node_matcher :comparison_condition, <<~PATTERN
|
|
48
|
+
{
|
|
49
|
+
(send $_lhs $COMPARISON_OPERATORS $_rhs)
|
|
50
|
+
(begin (send $_lhs $COMPARISON_OPERATORS $_rhs))
|
|
51
|
+
}
|
|
52
|
+
PATTERN
|
|
45
53
|
|
|
46
54
|
def on_if(node)
|
|
47
|
-
lhs, operator, rhs =
|
|
48
|
-
return unless
|
|
55
|
+
lhs, operator, rhs = comparison_condition(node.condition)
|
|
56
|
+
return unless operator
|
|
49
57
|
|
|
58
|
+
# For `unless`, the branches run opposite to an `if`, so swap them to
|
|
59
|
+
# keep the `max`/`min` decision correct.
|
|
50
60
|
if_branch = node.if_branch
|
|
51
61
|
else_branch = node.else_branch
|
|
62
|
+
if_branch, else_branch = else_branch, if_branch if node.unless?
|
|
52
63
|
preferred_method = preferred_method(operator, lhs, rhs, if_branch, else_branch)
|
|
53
64
|
return unless preferred_method
|
|
54
65
|
|
|
@@ -63,7 +74,7 @@ module RuboCop
|
|
|
63
74
|
|
|
64
75
|
def preferred_method(operator, lhs, rhs, if_branch, else_branch)
|
|
65
76
|
if lhs == if_branch && rhs == else_branch
|
|
66
|
-
|
|
77
|
+
GREATER_OPERATORS.include?(operator) ? 'max' : 'min'
|
|
67
78
|
elsif lhs == else_branch && rhs == if_branch
|
|
68
79
|
LESS_OPERATORS.include?(operator) ? 'max' : 'min'
|
|
69
80
|
end
|
|
@@ -28,6 +28,11 @@ module RuboCop
|
|
|
28
28
|
# delegator.upcase # => FOO
|
|
29
29
|
# ----
|
|
30
30
|
#
|
|
31
|
+
# When `AllCops/UseProjectIndex` is enabled and the `rubydex` gem is
|
|
32
|
+
# installed, `respond_to_missing?` defined in another definition of the
|
|
33
|
+
# same class or module (e.g. a reopening in another file) also
|
|
34
|
+
# satisfies the check.
|
|
35
|
+
#
|
|
31
36
|
# @example
|
|
32
37
|
# # bad
|
|
33
38
|
# def method_missing(name, *args)
|
|
@@ -52,11 +57,14 @@ module RuboCop
|
|
|
52
57
|
# end
|
|
53
58
|
#
|
|
54
59
|
class MissingRespondToMissing < Base
|
|
60
|
+
include ProjectIndexHelp
|
|
61
|
+
|
|
55
62
|
MSG = 'When using `method_missing`, define `respond_to_missing?`.'
|
|
56
63
|
|
|
57
64
|
def on_def(node)
|
|
58
65
|
return unless node.method?(:method_missing)
|
|
59
66
|
return if implements_respond_to_missing?(node)
|
|
67
|
+
return if respond_to_missing_elsewhere?(node)
|
|
60
68
|
|
|
61
69
|
add_offense(node)
|
|
62
70
|
end
|
|
@@ -64,17 +72,42 @@ module RuboCop
|
|
|
64
72
|
|
|
65
73
|
private
|
|
66
74
|
|
|
67
|
-
|
|
68
|
-
|
|
75
|
+
# When `AllCops/UseProjectIndex` is enabled, `respond_to_missing?`
|
|
76
|
+
# defined in another definition of the same class or module (e.g. a
|
|
77
|
+
# reopening in another file) also satisfies the check. Ancestors are
|
|
78
|
+
# not consulted: overriding `method_missing` warrants a matching
|
|
79
|
+
# `respond_to_missing?` for the same class.
|
|
80
|
+
def respond_to_missing_elsewhere?(node)
|
|
81
|
+
return false unless project_index
|
|
82
|
+
return false unless (namespace_node = node.each_ancestor(:class, :module).first)
|
|
83
|
+
|
|
84
|
+
declaration = resolve_constant_in_index(namespace_node.identifier)
|
|
85
|
+
return false unless declaration.is_a?(Rubydex::Namespace)
|
|
86
|
+
|
|
87
|
+
scope = singleton_definition?(node) ? indexed_singleton_of(declaration) : declaration
|
|
88
|
+
!scope&.member('respond_to_missing?()').nil?
|
|
89
|
+
rescue StandardError
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def singleton_definition?(node)
|
|
94
|
+
node.defs_type? || node.each_ancestor(:sclass, :class, :module).first&.sclass_type?
|
|
95
|
+
end
|
|
69
96
|
|
|
70
|
-
|
|
71
|
-
|
|
97
|
+
def implements_respond_to_missing?(node)
|
|
98
|
+
scope = enclosing_scope(node)
|
|
99
|
+
search_root = scope || node.parent
|
|
100
|
+
return false unless search_root
|
|
72
101
|
|
|
73
|
-
|
|
74
|
-
|
|
102
|
+
search_root.each_descendant(node.type).any? do |descendant|
|
|
103
|
+
descendant.method?(:respond_to_missing?) && enclosing_scope(descendant).equal?(scope)
|
|
75
104
|
end
|
|
105
|
+
end
|
|
76
106
|
|
|
77
|
-
|
|
107
|
+
# The class/module/`class << self` body that lexically contains `node`,
|
|
108
|
+
# or `nil` when `node` is defined at the top level.
|
|
109
|
+
def enclosing_scope(node)
|
|
110
|
+
node.each_ancestor(:class, :module, :sclass).first
|
|
78
111
|
end
|
|
79
112
|
end
|
|
80
113
|
end
|
|
@@ -110,9 +110,11 @@ module RuboCop
|
|
|
110
110
|
def_node_matcher :private_directive?, '(send nil? :private ...)'
|
|
111
111
|
|
|
112
112
|
def on_module(node)
|
|
113
|
-
return unless node.body
|
|
113
|
+
return unless node.body
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
body_nodes = node.body.begin_type? ? node.body.children : [node.body]
|
|
116
|
+
|
|
117
|
+
each_wrong_style(body_nodes) do |child_node|
|
|
116
118
|
add_offense(child_node) do |corrector|
|
|
117
119
|
next if style == :forbidden
|
|
118
120
|
|