rubocop 1.71.1 → 1.88.2
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 +513 -149
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +38 -4
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- 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 +48 -11
- data/lib/rubocop/comment_config.rb +60 -18
- data/lib/rubocop/config.rb +53 -16
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +65 -49
- data/lib/rubocop/config_loader_resolver.rb +44 -19
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +6 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +7 -6
- data/lib/rubocop/cop/autocorrect_logic.rb +27 -14
- data/lib/rubocop/cop/base.rb +38 -12
- 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/commissioner.rb +13 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- 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/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 +13 -13
- 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 -1
- 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 +1 -1
- 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 +2 -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 +60 -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 +56 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +9 -2
- 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 +2 -15
- data/lib/rubocop/cop/layout/empty_comment.rb +8 -10
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +28 -9
- 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 +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +35 -2
- 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/hash_alignment.rb +5 -8
- 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 +152 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +13 -1
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +62 -15
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -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 +236 -41
- 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 +12 -6
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +15 -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 +1 -1
- 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 +18 -3
- 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 +12 -3
- 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/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +2 -3
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +13 -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 +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -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/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +219 -32
- 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/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +129 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- 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/nested_method_definition.rb +1 -1
- 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/parentheses_as_grouped_expression.rb +3 -13
- 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 +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- 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 +4 -23
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +134 -11
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +268 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +4 -1
- 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 +22 -4
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- 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/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +123 -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 +36 -3
- 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 +17 -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/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +30 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +55 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +92 -0
- 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 +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +11 -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 +147 -0
- data/lib/rubocop/cop/lint/void.rb +50 -21
- 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 +38 -7
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -1
- 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/migration/department_name.rb +12 -1
- 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/check_line_breakable.rb +4 -4
- 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 +1 -1
- 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/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 +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +27 -4
- 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/line_length_help.rb +45 -10
- 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/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -7
- 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 +25 -6
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +3 -3
- 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 +11 -2
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +330 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -4
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +66 -39
- 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/style/access_modifier_declarations.rb +45 -12
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -8
- 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 +46 -31
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +117 -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 +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +42 -34
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/case_like_if.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +67 -12
- 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 +6 -0
- 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 +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +33 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/data_inheritance.rb +11 -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/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +12 -8
- 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 +12 -2
- 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 +0 -6
- 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 +181 -18
- 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 +4 -2
- 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 +15 -1
- data/lib/rubocop/cop/style/for.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +17 -4
- data/lib/rubocop/cop/style/format_string_token.rb +85 -14
- 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 +29 -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 +3 -2
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_lookup_method.rb +102 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -1
- 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 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +26 -20
- data/lib/rubocop/cop/style/if_unless_modifier.rb +83 -16
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +16 -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 +8 -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 +3 -3
- 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 +12 -3
- data/lib/rubocop/cop/style/map_to_set.rb +1 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +9 -8
- 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 +33 -4
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +11 -5
- 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 +10 -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 +4 -4
- data/lib/rubocop/cop/style/multiline_memoization.rb +7 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +13 -16
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +9 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- 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 +21 -12
- data/lib/rubocop/cop/style/open_struct_use.rb +1 -1
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -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 +57 -25
- 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_begin.rb +38 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +61 -1
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +26 -4
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- 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_filter_chain.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +312 -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 +28 -7
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +111 -37
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +12 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +20 -7
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +1 -1
- 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_struct_keyword_init.rb +133 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +32 -3
- data/lib/rubocop/cop/style/rescue_modifier.rb +6 -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 +67 -20
- 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 +53 -20
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +45 -12
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +21 -6
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -8
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +77 -101
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +18 -15
- data/lib/rubocop/cop/style/string_hash_keys.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +24 -2
- data/lib/rubocop/cop/style/super_arguments.rb +3 -4
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +10 -7
- 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/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 +1 -1
- 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/team.rb +105 -40
- data/lib/rubocop/cop/util.rb +4 -5
- 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 +10 -3
- data/lib/rubocop/cop/variable_force.rb +26 -9
- data/lib/rubocop/cops_documentation_generator.rb +23 -7
- data/lib/rubocop/directive_comment.rb +80 -3
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- 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 +38 -13
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +22 -37
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +47 -11
- data/lib/rubocop/lsp/runtime.rb +19 -8
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +11 -18
- data/lib/rubocop/magic_comment.rb +28 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +60 -14
- data/lib/rubocop/path_util.rb +18 -2
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -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 +66 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +72 -47
- data/lib/rubocop/rspec/cop_helper.rb +21 -1
- data/lib/rubocop/rspec/expect_offense.rb +9 -3
- data/lib/rubocop/rspec/shared_contexts.rb +71 -3
- data/lib/rubocop/rspec/support.rb +4 -0
- data/lib/rubocop/runner.rb +188 -65
- data/lib/rubocop/server/cache.rb +56 -41
- data/lib/rubocop/server/cli.rb +2 -2
- 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/target_finder.rb +21 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +50 -10
- data/lib/rubocop.rb +47 -96
- data/lib/ruby_lsp/rubocop/addon.rb +29 -17
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +86 -16
- 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,197 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Looks for places where a subset of an Enumerable (array,
|
|
7
|
+
# range, set, etc.; see note below) is calculated based on a range
|
|
8
|
+
# check, and suggests `grep` or `grep_v` instead.
|
|
9
|
+
#
|
|
10
|
+
# NOTE: Hashes do not behave as you may expect with `grep`, which
|
|
11
|
+
# means that `hash.grep` is not equivalent to `hash.select`. Although
|
|
12
|
+
# RuboCop is limited by static analysis, this cop attempts to avoid
|
|
13
|
+
# registering an offense when the receiver is a hash (hash literal,
|
|
14
|
+
# `Hash.new`, `Hash#[]`, or `to_h`/`to_hash`).
|
|
15
|
+
#
|
|
16
|
+
# @safety
|
|
17
|
+
# Autocorrection is marked as unsafe because the cop cannot guarantee
|
|
18
|
+
# that the receiver is actually an array by static analysis, so the
|
|
19
|
+
# correction may not be actually equivalent.
|
|
20
|
+
#
|
|
21
|
+
# @example
|
|
22
|
+
# # bad (select or find_all)
|
|
23
|
+
# array.select { |x| x.between?(1, 10) }
|
|
24
|
+
# array.select { |x| (1..10).cover?(x) }
|
|
25
|
+
# array.select { |x| (1..10).include?(x) }
|
|
26
|
+
#
|
|
27
|
+
# # bad (reject)
|
|
28
|
+
# array.reject { |x| x.between?(1, 10) }
|
|
29
|
+
#
|
|
30
|
+
# # bad (find or detect)
|
|
31
|
+
# array.find { |x| x.between?(1, 10) }
|
|
32
|
+
# array.detect { |x| (1..10).cover?(x) }
|
|
33
|
+
#
|
|
34
|
+
# # bad (negative form)
|
|
35
|
+
# array.reject { |x| !x.between?(1, 10) }
|
|
36
|
+
# array.find { |x| !(1..10).cover?(x) }
|
|
37
|
+
#
|
|
38
|
+
# # good
|
|
39
|
+
# array.grep(1..10)
|
|
40
|
+
# array.grep_v(1..10)
|
|
41
|
+
# array.grep(1..10).first
|
|
42
|
+
# array.grep_v(1..10).first
|
|
43
|
+
class SelectByRange < Base
|
|
44
|
+
extend AutoCorrector
|
|
45
|
+
include RangeHelp
|
|
46
|
+
|
|
47
|
+
MSG = 'Prefer `%<replacement>s` to `%<original_method>s` with a range check.'
|
|
48
|
+
RESTRICT_ON_SEND = %i[select filter find_all reject find detect].freeze
|
|
49
|
+
SELECT_METHODS = %i[select filter find_all].freeze
|
|
50
|
+
FIND_METHODS = %i[find detect].freeze
|
|
51
|
+
|
|
52
|
+
# @!method range_check?(node)
|
|
53
|
+
# Matches: x.between?(min, max) or (min..max).cover?(x) or (min..max).include?(x)
|
|
54
|
+
def_node_matcher :range_check?, <<~PATTERN
|
|
55
|
+
{
|
|
56
|
+
(block call (args (arg $_)) ${(send (lvar _) :between? _ _)})
|
|
57
|
+
(block call (args (arg $_)) ${(send {range (begin range)} {:cover? :include?} (lvar _))})
|
|
58
|
+
(block call (args (arg $_)) ${(send (send (lvar _) :between? _ _) :!)})
|
|
59
|
+
(block call (args (arg $_)) ${(send (send {range (begin range)} {:cover? :include?} (lvar _)) :!)})
|
|
60
|
+
(block call (args (arg $_)) ${(send (begin (send (lvar _) :between? _ _)) :!)})
|
|
61
|
+
(block call (args (arg $_)) ${(send (begin (send {range (begin range)} {:cover? :include?} (lvar _))) :!)})
|
|
62
|
+
(numblock call $1 ${(send (lvar _) :between? _ _)})
|
|
63
|
+
(numblock call $1 ${(send {range (begin range)} {:cover? :include?} (lvar _))})
|
|
64
|
+
(numblock call $1 ${(send (send (lvar _) :between? _ _) :!)})
|
|
65
|
+
(numblock call $1 ${(send (send {range (begin range)} {:cover? :include?} (lvar _)) :!)})
|
|
66
|
+
(numblock call $1 ${(send (begin (send (lvar _) :between? _ _)) :!)})
|
|
67
|
+
(numblock call $1 ${(send (begin (send {range (begin range)} {:cover? :include?} (lvar _))) :!)})
|
|
68
|
+
(itblock call $_ ${(send (lvar _) :between? _ _)})
|
|
69
|
+
(itblock call $_ ${(send {range (begin range)} {:cover? :include?} (lvar _))})
|
|
70
|
+
(itblock call $_ ${(send (send (lvar _) :between? _ _) :!)})
|
|
71
|
+
(itblock call $_ ${(send (send {range (begin range)} {:cover? :include?} (lvar _)) :!)})
|
|
72
|
+
(itblock call $_ ${(send (begin (send (lvar _) :between? _ _)) :!)})
|
|
73
|
+
(itblock call $_ ${(send (begin (send {range (begin range)} {:cover? :include?} (lvar _))) :!)})
|
|
74
|
+
}
|
|
75
|
+
PATTERN
|
|
76
|
+
|
|
77
|
+
# Returns true if a node appears to return a hash
|
|
78
|
+
# @!method creates_hash?(node)
|
|
79
|
+
def_node_matcher :creates_hash?, <<~PATTERN
|
|
80
|
+
{
|
|
81
|
+
(call (const _ :Hash) {:new :[]} ...)
|
|
82
|
+
(block (call (const _ :Hash) :new ...) ...)
|
|
83
|
+
(call _ { :to_h :to_hash } ...)
|
|
84
|
+
}
|
|
85
|
+
PATTERN
|
|
86
|
+
|
|
87
|
+
# @!method env_const?(node)
|
|
88
|
+
def_node_matcher :env_const?, <<~PATTERN
|
|
89
|
+
(const {nil? cbase} :ENV)
|
|
90
|
+
PATTERN
|
|
91
|
+
|
|
92
|
+
# @!method between_call?(node, name)
|
|
93
|
+
def_node_matcher :between_call?, <<~PATTERN
|
|
94
|
+
(send (lvar %1) :between? _ _)
|
|
95
|
+
PATTERN
|
|
96
|
+
|
|
97
|
+
# @!method range_cover_call?(node, name)
|
|
98
|
+
def_node_matcher :range_cover_call?, <<~PATTERN
|
|
99
|
+
(send {range (begin range)} {:cover? :include?} (lvar %1))
|
|
100
|
+
PATTERN
|
|
101
|
+
|
|
102
|
+
def on_send(node)
|
|
103
|
+
return unless (block_node = node.block_node)
|
|
104
|
+
return if block_node.body&.begin_type?
|
|
105
|
+
return if receiver_allowed?(block_node.receiver)
|
|
106
|
+
return unless (range_check_send_node = extract_send_node(block_node))
|
|
107
|
+
|
|
108
|
+
replacement = replacement(range_check_send_node, node)
|
|
109
|
+
range_literal = find_range(range_check_send_node)
|
|
110
|
+
|
|
111
|
+
register_offense(node, block_node, range_literal, replacement)
|
|
112
|
+
end
|
|
113
|
+
alias on_csend on_send
|
|
114
|
+
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def receiver_allowed?(node)
|
|
118
|
+
return false unless node
|
|
119
|
+
|
|
120
|
+
node.hash_type? || creates_hash?(node) || env_const?(node)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def replacement(range_check_send_node, node)
|
|
124
|
+
negated = negated?(range_check_send_node)
|
|
125
|
+
method_name = node.method_name
|
|
126
|
+
|
|
127
|
+
if SELECT_METHODS.include?(method_name)
|
|
128
|
+
negated ? 'grep_v' : 'grep'
|
|
129
|
+
elsif FIND_METHODS.include?(method_name)
|
|
130
|
+
negated ? 'grep_v(...).first' : 'grep(...).first'
|
|
131
|
+
else # reject
|
|
132
|
+
negated ? 'grep' : 'grep_v'
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def register_offense(node, block_node, range_literal, replacement)
|
|
137
|
+
message = format(MSG, replacement: replacement, original_method: node.method_name)
|
|
138
|
+
|
|
139
|
+
add_offense(block_node, message: message) do |corrector|
|
|
140
|
+
if range_literal
|
|
141
|
+
range = range_between(node.loc.selector.begin_pos, block_node.loc.end.end_pos)
|
|
142
|
+
grep_method = replacement.include?('grep_v') ? 'grep_v' : 'grep'
|
|
143
|
+
suffix = replacement.include?('.first') ? '.first' : ''
|
|
144
|
+
corrector.replace(range, "#{grep_method}(#{range_literal})#{suffix}")
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def extract_send_node(block_node)
|
|
150
|
+
return unless (block_arg_name, range_check_send_node = range_check?(block_node))
|
|
151
|
+
|
|
152
|
+
block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
|
|
153
|
+
block_arg_name = :it if block_node.type?(:itblock)
|
|
154
|
+
|
|
155
|
+
inner_node = unwrap_negation(range_check_send_node)
|
|
156
|
+
|
|
157
|
+
range_check_send_node if calls_lvar_in_range_check?(inner_node, block_arg_name)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def calls_lvar_in_range_check?(node, block_arg_name)
|
|
161
|
+
between_call?(node, block_arg_name) || range_cover_call?(node, block_arg_name)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def negated?(range_check_send_node)
|
|
165
|
+
range_check_send_node.send_type? && range_check_send_node.method?(:!)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def unwrap_negation(node)
|
|
169
|
+
if node.send_type? && node.method?(:!)
|
|
170
|
+
receiver = node.receiver
|
|
171
|
+
receiver = receiver.children.first if receiver.begin_type?
|
|
172
|
+
receiver
|
|
173
|
+
else
|
|
174
|
+
node
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def find_range(node)
|
|
179
|
+
inner = unwrap_negation(node)
|
|
180
|
+
|
|
181
|
+
if inner.method?(:between?)
|
|
182
|
+
# x.between?(min, max) -> min..max
|
|
183
|
+
min = inner.first_argument.source
|
|
184
|
+
max = inner.arguments[1].source
|
|
185
|
+
"#{min}..#{max}"
|
|
186
|
+
else
|
|
187
|
+
# (min..max).cover?(x) or (min..max).include?(x)
|
|
188
|
+
receiver = inner.receiver
|
|
189
|
+
# Unwrap begin node from parentheses
|
|
190
|
+
receiver = receiver.children.first if receiver.begin_type?
|
|
191
|
+
receiver.source
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
@@ -39,6 +39,9 @@ module RuboCop
|
|
|
39
39
|
# array.reject { |x| x =~ /regexp/ }
|
|
40
40
|
# array.reject { |x| /regexp/ =~ x }
|
|
41
41
|
#
|
|
42
|
+
# # bad (negative form)
|
|
43
|
+
# array.reject { |x| !x.match? /regexp/ }
|
|
44
|
+
#
|
|
42
45
|
# # good
|
|
43
46
|
# array.grep(regexp)
|
|
44
47
|
# array.grep_v(regexp)
|
|
@@ -48,17 +51,19 @@ module RuboCop
|
|
|
48
51
|
|
|
49
52
|
MSG = 'Prefer `%<replacement>s` to `%<original_method>s` with a regexp match.'
|
|
50
53
|
RESTRICT_ON_SEND = %i[select filter find_all reject].freeze
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}.freeze
|
|
55
|
-
REGEXP_METHODS = %i[match? =~ !~].to_set.freeze
|
|
54
|
+
SELECT_METHODS = %i[select filter find_all].freeze
|
|
55
|
+
REGEXP_METHODS = %i[match? =~].to_set.freeze
|
|
56
|
+
REGEXP_METHODS_NEGATED = %i[!~].to_set.freeze
|
|
56
57
|
|
|
57
58
|
# @!method regexp_match?(node)
|
|
58
59
|
def_node_matcher :regexp_match?, <<~PATTERN
|
|
59
60
|
{
|
|
60
|
-
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
61
|
-
(
|
|
61
|
+
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) (send _ %REGEXP_METHODS_NEGATED _) match-with-lvasgn})
|
|
62
|
+
(block call (args (arg $_)) ${(send (send _ %REGEXP_METHODS _) :!) (send (begin (send _ %REGEXP_METHODS _)) :!) (send match-with-lvasgn :!) (send (begin match-with-lvasgn) :!)})
|
|
63
|
+
(numblock call $1 ${(send _ %REGEXP_METHODS _) (send _ %REGEXP_METHODS_NEGATED _) match-with-lvasgn})
|
|
64
|
+
(numblock call $1 ${(send (send _ %REGEXP_METHODS _) :!) (send (begin (send _ %REGEXP_METHODS _)) :!) (send match-with-lvasgn :!) (send (begin match-with-lvasgn) :!)})
|
|
65
|
+
(itblock call $_ ${(send _ %REGEXP_METHODS _) (send _ %REGEXP_METHODS_NEGATED _) match-with-lvasgn})
|
|
66
|
+
(itblock call $_ ${(send (send _ %REGEXP_METHODS _) :!) (send (begin (send _ %REGEXP_METHODS _)) :!) (send match-with-lvasgn :!) (send (begin match-with-lvasgn) :!)})
|
|
62
67
|
}
|
|
63
68
|
PATTERN
|
|
64
69
|
|
|
@@ -83,6 +88,12 @@ module RuboCop
|
|
|
83
88
|
(send (lvar %1) ...)
|
|
84
89
|
(send ... (lvar %1))
|
|
85
90
|
(match-with-lvasgn regexp (lvar %1))
|
|
91
|
+
(send (send (lvar %1) ...) :!)
|
|
92
|
+
(send (send ... (lvar %1)) :!)
|
|
93
|
+
(send (match-with-lvasgn regexp (lvar %1)) :!)
|
|
94
|
+
(send (begin (send (lvar %1) ...)) :!)
|
|
95
|
+
(send (begin (send ... (lvar %1))) :!)
|
|
96
|
+
(send (begin (match-with-lvasgn regexp (lvar %1))) :!)
|
|
86
97
|
}
|
|
87
98
|
PATTERN
|
|
88
99
|
|
|
@@ -96,7 +107,7 @@ module RuboCop
|
|
|
96
107
|
return if match_predicate_without_receiver?(regexp_method_send_node)
|
|
97
108
|
|
|
98
109
|
replacement = replacement(regexp_method_send_node, node)
|
|
99
|
-
return if target_ruby_version <= 2.2 && replacement
|
|
110
|
+
return if target_ruby_version <= 2.2 && replacement.include?('grep_v')
|
|
100
111
|
|
|
101
112
|
regexp = find_regexp(regexp_method_send_node, block_node)
|
|
102
113
|
|
|
@@ -114,11 +125,14 @@ module RuboCop
|
|
|
114
125
|
end
|
|
115
126
|
|
|
116
127
|
def replacement(regexp_method_send_node, node)
|
|
117
|
-
|
|
118
|
-
|
|
128
|
+
negated = negated?(regexp_method_send_node)
|
|
119
129
|
method_name = node.method_name
|
|
120
130
|
|
|
121
|
-
|
|
131
|
+
if SELECT_METHODS.include?(method_name)
|
|
132
|
+
negated ? 'grep_v' : 'grep'
|
|
133
|
+
else # reject
|
|
134
|
+
negated ? 'grep' : 'grep_v'
|
|
135
|
+
end
|
|
122
136
|
end
|
|
123
137
|
|
|
124
138
|
def register_offense(node, block_node, regexp, replacement)
|
|
@@ -137,28 +151,47 @@ module RuboCop
|
|
|
137
151
|
return unless (block_arg_name, regexp_method_send_node = regexp_match?(block_node))
|
|
138
152
|
|
|
139
153
|
block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
|
|
154
|
+
block_arg_name = :it if block_node.type?(:itblock)
|
|
155
|
+
|
|
140
156
|
return unless calls_lvar?(regexp_method_send_node, block_arg_name)
|
|
141
157
|
|
|
142
158
|
regexp_method_send_node
|
|
143
159
|
end
|
|
144
160
|
|
|
145
|
-
def
|
|
146
|
-
regexp_method_send_node.send_type? && regexp_method_send_node.method?(
|
|
161
|
+
def negated?(regexp_method_send_node)
|
|
162
|
+
return true if regexp_method_send_node.send_type? && regexp_method_send_node.method?(:!)
|
|
163
|
+
|
|
164
|
+
inner = unwrap_negation(regexp_method_send_node)
|
|
165
|
+
inner.send_type? && inner.method?(:!~)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def unwrap_negation(node)
|
|
169
|
+
if node.send_type? && node.method?(:!)
|
|
170
|
+
receiver = node.receiver
|
|
171
|
+
receiver = receiver.children.first if receiver.begin_type?
|
|
172
|
+
receiver
|
|
173
|
+
else
|
|
174
|
+
node
|
|
175
|
+
end
|
|
147
176
|
end
|
|
148
177
|
|
|
149
178
|
def find_regexp(node, block)
|
|
150
|
-
|
|
179
|
+
inner = unwrap_negation(node)
|
|
180
|
+
|
|
181
|
+
return inner.child_nodes.first if inner.match_with_lvasgn_type?
|
|
151
182
|
|
|
152
|
-
if
|
|
153
|
-
(block.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
183
|
+
if inner.receiver.lvar_type? &&
|
|
184
|
+
(block.type?(:numblock, :itblock) ||
|
|
185
|
+
inner.receiver.source == block.first_argument.source)
|
|
186
|
+
inner.first_argument
|
|
187
|
+
elsif inner.first_argument&.lvar_type?
|
|
188
|
+
inner.receiver
|
|
157
189
|
end
|
|
158
190
|
end
|
|
159
191
|
|
|
160
192
|
def match_predicate_without_receiver?(node)
|
|
161
|
-
|
|
193
|
+
inner = unwrap_negation(node)
|
|
194
|
+
inner.send_type? && inner.method?(:match?) && inner.receiver.nil?
|
|
162
195
|
end
|
|
163
196
|
end
|
|
164
197
|
end
|
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for multiple expressions placed on the same line.
|
|
7
7
|
# It also checks for lines terminated with a semicolon.
|
|
8
|
+
# In idiomatic Ruby, each expression should be on its own line
|
|
9
|
+
# for readability.
|
|
8
10
|
#
|
|
9
11
|
# This cop has `AllowAsExpressionSeparator` configuration option.
|
|
10
12
|
# It allows `;` to separate several expressions on the same line.
|
|
@@ -69,10 +71,11 @@ module RuboCop
|
|
|
69
71
|
|
|
70
72
|
def each_semicolon
|
|
71
73
|
tokens_for_lines.each do |line, tokens|
|
|
72
|
-
semicolon_pos = semicolon_position(tokens)
|
|
74
|
+
next unless (semicolon_pos = semicolon_position(tokens))
|
|
75
|
+
|
|
73
76
|
after_expr_pos = semicolon_pos == -1 ? -2 : semicolon_pos
|
|
74
77
|
|
|
75
|
-
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
78
|
+
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
|
|
@@ -119,25 +122,46 @@ module RuboCop
|
|
|
119
122
|
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
|
120
123
|
end
|
|
121
124
|
|
|
125
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
122
126
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
|
123
127
|
range = source_range(processed_source.buffer, line, column)
|
|
124
128
|
|
|
125
129
|
add_offense(range) do |corrector|
|
|
126
130
|
if after_expression
|
|
127
|
-
corrector
|
|
131
|
+
replace_semicolon_with_line_break(corrector, range)
|
|
128
132
|
else
|
|
129
133
|
# Prevents becoming one range instance with subsequent line when endless range
|
|
130
134
|
# without parentheses.
|
|
131
135
|
# See: https://github.com/rubocop/rubocop/issues/10791
|
|
132
136
|
if token_before_semicolon&.regexp_dots?
|
|
133
|
-
|
|
134
|
-
|
|
137
|
+
node = find_node(range_nodes, token_before_semicolon)
|
|
138
|
+
elsif token_before_semicolon&.type == :tLABEL
|
|
139
|
+
node = find_node(value_omission_pair_nodes, token_before_semicolon).parent
|
|
140
|
+
space = node.parent.loc.selector.end.join(node.source_range.begin)
|
|
141
|
+
corrector.remove(space)
|
|
135
142
|
end
|
|
136
143
|
|
|
144
|
+
corrector.wrap(node, '(', ')') if node
|
|
137
145
|
corrector.remove(range)
|
|
138
146
|
end
|
|
139
147
|
end
|
|
140
148
|
end
|
|
149
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
150
|
+
|
|
151
|
+
def replace_semicolon_with_line_break(corrector, range)
|
|
152
|
+
# Replacing the semicolon with a newline would move the rest of the
|
|
153
|
+
# line into the body of a heredoc opened earlier on that line.
|
|
154
|
+
return if heredoc_opened_before_semicolon?(range)
|
|
155
|
+
|
|
156
|
+
corrector.replace(range, "\n")
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def heredoc_opened_before_semicolon?(semicolon_range)
|
|
160
|
+
processed_source.ast.each_descendant(:any_str).select(&:heredoc?).any? do |heredoc|
|
|
161
|
+
heredoc.first_line == semicolon_range.line &&
|
|
162
|
+
heredoc.source_range.end_pos <= semicolon_range.begin_pos
|
|
163
|
+
end
|
|
164
|
+
end
|
|
141
165
|
|
|
142
166
|
def expressions_per_line(exprs)
|
|
143
167
|
# create a map matching lines to the number of expressions on them
|
|
@@ -146,16 +170,16 @@ module RuboCop
|
|
|
146
170
|
end
|
|
147
171
|
|
|
148
172
|
def find_semicolon_positions(line)
|
|
149
|
-
# Scan for all the
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
yield
|
|
173
|
+
# Scan for all the semicolon tokens on the line. Iterating tokens rather
|
|
174
|
+
# than the raw source skips `;` characters inside string/regexp literals.
|
|
175
|
+
processed_source.tokens.each do |token|
|
|
176
|
+
yield token.column if token.line == line && token.semicolon?
|
|
153
177
|
end
|
|
154
178
|
end
|
|
155
179
|
|
|
156
|
-
def
|
|
157
|
-
|
|
158
|
-
|
|
180
|
+
def find_node(nodes, token_before_semicolon)
|
|
181
|
+
nodes.detect do |node|
|
|
182
|
+
node.source_range.overlaps?(token_before_semicolon.pos)
|
|
159
183
|
end
|
|
160
184
|
end
|
|
161
185
|
|
|
@@ -166,6 +190,15 @@ module RuboCop
|
|
|
166
190
|
@range_nodes = ast.range_type? ? [ast] : []
|
|
167
191
|
@range_nodes.concat(ast.each_descendant(:range).to_a)
|
|
168
192
|
end
|
|
193
|
+
|
|
194
|
+
def value_omission_pair_nodes
|
|
195
|
+
if instance_variable_defined?(:@value_omission_pair_nodes)
|
|
196
|
+
return @value_omission_pair_nodes
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
ast = processed_source.ast
|
|
200
|
+
@value_omission_pair_nodes = ast.each_descendant(:pair).to_a.select(&:value_omission?)
|
|
201
|
+
end
|
|
169
202
|
end
|
|
170
203
|
end
|
|
171
204
|
end
|
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
|
33
33
|
|
|
34
34
|
MSG = 'Name `%<method>s` block params `|%<params>s|`.'
|
|
35
35
|
|
|
36
|
-
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
36
|
+
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler, InternalAffairs/ItblockHandler
|
|
37
37
|
return unless node.single_line?
|
|
38
38
|
|
|
39
39
|
return unless eligible_method?(node)
|
|
@@ -89,7 +89,7 @@ module RuboCop
|
|
|
89
89
|
end
|
|
90
90
|
|
|
91
91
|
def method_names
|
|
92
|
-
methods.map { |method| method_name(method).to_sym }
|
|
92
|
+
@method_names ||= methods.map { |method| method_name(method).to_sym }.freeze
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
def method_name(method)
|
|
@@ -38,17 +38,18 @@ module RuboCop
|
|
|
38
38
|
|
|
39
39
|
# rubocop:disable Metrics/AbcSize
|
|
40
40
|
def on_block(node)
|
|
41
|
-
return if
|
|
41
|
+
return if node.multiline? || node.braces?
|
|
42
42
|
return if single_line_blocks_preferred? && suitable_as_single_line?(node)
|
|
43
43
|
|
|
44
44
|
add_offense(node) do |corrector|
|
|
45
45
|
corrector.insert_after(do_line(node), "\n")
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
if (heredoc = trailing_heredoc(node.body))
|
|
48
|
+
# The heredoc body extends past the `end` on the source, so the
|
|
49
|
+
# `end` has to be moved after it rather than before, which would
|
|
50
|
+
# otherwise move it into the heredoc body and break the syntax.
|
|
50
51
|
corrector.remove(node.loc.end)
|
|
51
|
-
corrector.insert_after(
|
|
52
|
+
corrector.insert_after(heredoc.loc.heredoc_end, "\nend")
|
|
52
53
|
else
|
|
53
54
|
corrector.insert_before(node.loc.end, "\n")
|
|
54
55
|
end
|
|
@@ -56,11 +57,25 @@ module RuboCop
|
|
|
56
57
|
end
|
|
57
58
|
# rubocop:enable Metrics/AbcSize
|
|
58
59
|
alias on_numblock on_block
|
|
60
|
+
alias on_itblock on_block
|
|
59
61
|
|
|
60
62
|
private
|
|
61
63
|
|
|
64
|
+
# Returns the heredoc opened on the block's line whose body extends the
|
|
65
|
+
# furthest down, whether it is the block body itself or nested within it.
|
|
66
|
+
def trailing_heredoc(node_body)
|
|
67
|
+
return unless node_body
|
|
68
|
+
|
|
69
|
+
heredocs = [node_body, *node_body.each_descendant].select do |node|
|
|
70
|
+
node.respond_to?(:heredoc?) && node.heredoc?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
heredocs.max_by { |heredoc| heredoc.loc.heredoc_end.line }
|
|
74
|
+
end
|
|
75
|
+
|
|
62
76
|
def do_line(node)
|
|
63
|
-
if node.
|
|
77
|
+
if node.type?(:numblock, :itblock) ||
|
|
78
|
+
node.arguments.children.empty? || node.send_node.lambda_literal?
|
|
64
79
|
node.loc.begin
|
|
65
80
|
else
|
|
66
81
|
node.arguments
|
|
@@ -4,13 +4,15 @@ module RuboCop
|
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
6
|
# Checks for single-line method definitions that contain a body.
|
|
7
|
-
#
|
|
7
|
+
# Single-line methods with a body are harder to read and debug
|
|
8
|
+
# than their multi-line equivalents. It will accept single-line
|
|
9
|
+
# methods with no body.
|
|
8
10
|
#
|
|
9
11
|
# Endless methods added in Ruby 3.0 are also accepted by this cop.
|
|
10
12
|
#
|
|
11
|
-
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`
|
|
12
|
-
# `
|
|
13
|
-
# methods if there is only one statement in the body.
|
|
13
|
+
# If `Style/EndlessMethod` is enabled with `EnforcedStyle: allow_single_line`, `allow_always`,
|
|
14
|
+
# `require_single_line`, or `require_always`, single-line methods will be autocorrected
|
|
15
|
+
# to endless methods if there is only one statement in the body.
|
|
14
16
|
#
|
|
15
17
|
# @example
|
|
16
18
|
# # bad
|
|
@@ -65,7 +67,7 @@ module RuboCop
|
|
|
65
67
|
return false if target_ruby_version < 3.0
|
|
66
68
|
return false if disallow_endless_method_style?
|
|
67
69
|
return false unless body_node
|
|
68
|
-
return false if body_node.parent.assignment_method? ||
|
|
70
|
+
return false if body_node.basic_conditional? || body_node.parent.assignment_method? ||
|
|
69
71
|
NOT_SUPPORTED_ENDLESS_METHOD_BODY_TYPES.include?(body_node.type)
|
|
70
72
|
|
|
71
73
|
!body_node.type?(:begin, :kwbegin)
|
|
@@ -86,10 +88,10 @@ module RuboCop
|
|
|
86
88
|
end
|
|
87
89
|
|
|
88
90
|
def correct_to_endless(corrector, node)
|
|
89
|
-
|
|
91
|
+
receiver = "#{node.receiver.source}." if node.receiver
|
|
90
92
|
arguments = node.arguments.any? ? node.arguments.source : '()'
|
|
91
93
|
body_source = method_body_source(node.body)
|
|
92
|
-
replacement = "def #{
|
|
94
|
+
replacement = "def #{receiver}#{node.method_name}#{arguments} = #{body_source}"
|
|
93
95
|
|
|
94
96
|
corrector.replace(node, replacement)
|
|
95
97
|
end
|
|
@@ -130,7 +132,10 @@ module RuboCop
|
|
|
130
132
|
end
|
|
131
133
|
|
|
132
134
|
def require_parentheses?(method_body)
|
|
133
|
-
|
|
135
|
+
return false unless method_body.send_type?
|
|
136
|
+
return false if method_body.arithmetic_operation?
|
|
137
|
+
|
|
138
|
+
!method_body.arguments.empty? && !method_body.comparison_method?
|
|
134
139
|
end
|
|
135
140
|
|
|
136
141
|
def disallow_endless_method_style?
|