rubocop 1.57.1 → 1.81.6
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 +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +48 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- 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_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -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 +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -8
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- 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 +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- 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 +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +30 -7
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +72 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- 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/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- data/lib/rubocop/path_util.rb +21 -10
- 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/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- 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 +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -96,11 +96,7 @@ module RuboCop
|
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
def autocorrect(corrector, node, if_branch)
|
|
99
|
-
if node.
|
|
100
|
-
corrector.wrap(node.condition, '(', ')')
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
if outer_condition_modify_form?(node, if_branch)
|
|
99
|
+
if node.modifier_form?
|
|
104
100
|
autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
105
101
|
else
|
|
106
102
|
autocorrect_outer_condition_basic(corrector, node, if_branch)
|
|
@@ -108,68 +104,49 @@ module RuboCop
|
|
|
108
104
|
end
|
|
109
105
|
|
|
110
106
|
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
outer_condition = node.condition
|
|
114
|
-
correct_outer_condition(corrector, outer_condition)
|
|
107
|
+
correct_node(corrector, node)
|
|
115
108
|
|
|
116
|
-
and_operator = if_branch.unless? ? ' && !' : ' && '
|
|
117
109
|
if if_branch.modifier_form?
|
|
118
|
-
correct_for_guard_condition_style(corrector,
|
|
110
|
+
correct_for_guard_condition_style(corrector, node, if_branch)
|
|
119
111
|
else
|
|
120
|
-
correct_for_basic_condition_style(corrector, node, if_branch
|
|
112
|
+
correct_for_basic_condition_style(corrector, node, if_branch)
|
|
121
113
|
correct_for_comment(corrector, node, if_branch)
|
|
122
114
|
end
|
|
123
115
|
end
|
|
124
116
|
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
|
|
117
|
+
def correct_node(corrector, node)
|
|
118
|
+
corrector.replace(node.loc.keyword, 'if') if node.unless? && !part_of_ignored_node?(node)
|
|
119
|
+
corrector.replace(node.condition, chainable_condition(node))
|
|
120
|
+
ignore_node(node)
|
|
128
121
|
end
|
|
129
122
|
|
|
130
|
-
def
|
|
131
|
-
corrector.
|
|
123
|
+
def correct_for_guard_condition_style(corrector, node, if_branch)
|
|
124
|
+
corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
|
|
132
125
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
def correct_for_guard_condition_style(corrector, outer_condition, if_branch, and_operator)
|
|
137
|
-
condition = if_branch.condition
|
|
138
|
-
corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
|
|
139
|
-
|
|
140
|
-
range = range_between(if_branch.loc.keyword.begin_pos, condition.source_range.end_pos)
|
|
126
|
+
range = range_between(
|
|
127
|
+
if_branch.loc.keyword.begin_pos, if_branch.condition.source_range.end_pos
|
|
128
|
+
)
|
|
141
129
|
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
142
|
-
corrector.remove(if_branch.loc.keyword)
|
|
143
130
|
end
|
|
144
131
|
|
|
145
|
-
def correct_for_basic_condition_style(corrector, node, if_branch
|
|
132
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
|
146
133
|
range = range_between(
|
|
147
134
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
|
148
135
|
)
|
|
149
|
-
corrector.replace(range,
|
|
150
|
-
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
|
151
|
-
|
|
152
|
-
wrap_condition(corrector, if_branch.condition)
|
|
153
|
-
end
|
|
136
|
+
corrector.replace(range, ' && ')
|
|
154
137
|
|
|
155
|
-
|
|
156
|
-
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
157
|
-
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
158
|
-
# but wrapping the argument list would be a more ergonomic correction.
|
|
159
|
-
node_to_check = condition&.block_type? ? condition.send_node : condition
|
|
160
|
-
return unless wrap_condition?(node_to_check)
|
|
138
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
|
161
139
|
|
|
162
|
-
corrector.
|
|
140
|
+
corrector.remove(range_by_whole_lines(node.loc.end, include_final_newline: true))
|
|
163
141
|
end
|
|
164
142
|
|
|
165
|
-
def
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
143
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
144
|
+
correct_node(corrector, if_branch)
|
|
145
|
+
|
|
146
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
|
169
147
|
|
|
170
|
-
|
|
171
|
-
corrector.remove(range_with_surrounding_space(
|
|
172
|
-
corrector.replace(if_branch.loc.keyword, 'if')
|
|
148
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
|
149
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
173
150
|
end
|
|
174
151
|
|
|
175
152
|
def correct_for_comment(corrector, node, if_branch)
|
|
@@ -181,71 +158,79 @@ module RuboCop
|
|
|
181
158
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
|
182
159
|
end
|
|
183
160
|
|
|
184
|
-
def
|
|
185
|
-
|
|
161
|
+
def chainable_condition(node)
|
|
162
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
|
186
163
|
|
|
187
|
-
|
|
188
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
|
189
|
-
return if end_pos > begin_pos
|
|
164
|
+
return wrapped_condition if node.if?
|
|
190
165
|
|
|
191
|
-
|
|
192
|
-
corrector.remove(range)
|
|
193
|
-
corrector.insert_after(range, '(')
|
|
194
|
-
corrector.insert_after(condition.last_argument, ')')
|
|
166
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
|
195
167
|
end
|
|
196
168
|
|
|
197
|
-
def
|
|
198
|
-
|
|
169
|
+
def add_parentheses_if_needed(condition)
|
|
170
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
171
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
172
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
|
173
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
|
174
|
+
return condition.source unless add_parentheses?(node_to_check)
|
|
199
175
|
|
|
200
|
-
if (condition
|
|
201
|
-
|
|
202
|
-
corrector.wrap(node.condition, '!(', ')')
|
|
176
|
+
if parenthesize_method?(condition)
|
|
177
|
+
parenthesized_method_arguments(condition)
|
|
203
178
|
elsif condition.and_type?
|
|
204
|
-
|
|
179
|
+
parenthesized_and(condition)
|
|
205
180
|
else
|
|
206
|
-
|
|
181
|
+
"(#{condition.source})"
|
|
207
182
|
end
|
|
208
183
|
end
|
|
209
184
|
|
|
210
|
-
def
|
|
211
|
-
|
|
185
|
+
def parenthesize_method?(node)
|
|
186
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
|
187
|
+
!node.comparison_method? && !node.operator_method?
|
|
188
|
+
end
|
|
212
189
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
end
|
|
190
|
+
def add_parentheses?(node)
|
|
191
|
+
return true if node.assignment? || node.or_type?
|
|
192
|
+
return true if assignment_in_and?(node)
|
|
193
|
+
return false unless node.call_type?
|
|
194
|
+
|
|
195
|
+
(node.arguments.any? && !node.parenthesized?) || node.prefix_not?
|
|
220
196
|
end
|
|
221
197
|
|
|
222
|
-
def
|
|
223
|
-
|
|
224
|
-
|
|
198
|
+
def assignment_in_and?(node)
|
|
199
|
+
return false unless node.and_type?
|
|
200
|
+
|
|
201
|
+
node.each_descendant.any?(&:assignment?)
|
|
225
202
|
end
|
|
226
203
|
|
|
227
|
-
def
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
204
|
+
def parenthesized_method_arguments(node)
|
|
205
|
+
method_call = node.source_range.begin.join(node.loc.selector.end).source
|
|
206
|
+
arguments = node.first_argument.source_range.begin.join(node.source_range.end).source
|
|
207
|
+
|
|
208
|
+
"#{method_call}(#{arguments})"
|
|
231
209
|
end
|
|
232
210
|
|
|
233
|
-
def
|
|
234
|
-
|
|
235
|
-
|
|
211
|
+
def parenthesized_and(node)
|
|
212
|
+
# We only need to add parentheses around the last clause if it's an assignment,
|
|
213
|
+
# because other clauses will be unchanged by merging conditionals.
|
|
214
|
+
lhs = node.lhs.source
|
|
215
|
+
rhs = parenthesized_and_clause(node.rhs)
|
|
216
|
+
operator = range_with_surrounding_space(node.loc.operator, whitespace: true).source
|
|
217
|
+
|
|
218
|
+
"#{lhs}#{operator}#{rhs}"
|
|
236
219
|
end
|
|
237
220
|
|
|
238
|
-
def
|
|
239
|
-
|
|
221
|
+
def parenthesized_and_clause(node)
|
|
222
|
+
if node.and_type?
|
|
223
|
+
parenthesized_and(node)
|
|
224
|
+
elsif node.assignment?
|
|
225
|
+
"(#{node.source})"
|
|
226
|
+
else
|
|
227
|
+
node.source
|
|
228
|
+
end
|
|
240
229
|
end
|
|
241
230
|
|
|
242
231
|
def allow_modifier?
|
|
243
232
|
cop_config['AllowModifier']
|
|
244
233
|
end
|
|
245
|
-
|
|
246
|
-
def outer_condition_modify_form?(node, if_branch)
|
|
247
|
-
node.condition.source_range.begin_pos > if_branch.condition.source_range.begin_pos
|
|
248
|
-
end
|
|
249
234
|
end
|
|
250
235
|
end
|
|
251
236
|
end
|
|
@@ -58,9 +58,8 @@ module RuboCop
|
|
|
58
58
|
#
|
|
59
59
|
# @example EnforcedStyle: use_builtin_english_names
|
|
60
60
|
#
|
|
61
|
-
# Like `use_perl_names` but allows builtin global vars.
|
|
62
|
-
#
|
|
63
61
|
# # good
|
|
62
|
+
# # Like `use_perl_names` but allows builtin global vars.
|
|
64
63
|
# puts $LOAD_PATH
|
|
65
64
|
# puts $LOADED_FEATURES
|
|
66
65
|
# puts $PROGRAM_NAME
|
|
@@ -150,7 +149,7 @@ module RuboCop
|
|
|
150
149
|
end
|
|
151
150
|
|
|
152
151
|
def on_gvar(node)
|
|
153
|
-
global_var
|
|
152
|
+
global_var = node.name
|
|
154
153
|
|
|
155
154
|
return unless (preferred = preferred_names(global_var))
|
|
156
155
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for parentheses around stabby lambda arguments.
|
|
7
7
|
# There are two different styles. Defaults to `require_parentheses`.
|
|
8
8
|
#
|
|
9
9
|
# @example EnforcedStyle: require_parentheses (default)
|
|
@@ -51,8 +51,6 @@ module RuboCop
|
|
|
51
51
|
# Pathname.new('/') + 'test'
|
|
52
52
|
#
|
|
53
53
|
class StringConcatenation < Base
|
|
54
|
-
include Util
|
|
55
|
-
include RangeHelp
|
|
56
54
|
extend AutoCorrector
|
|
57
55
|
|
|
58
56
|
MSG = 'Prefer string interpolation to string concatenation.'
|
|
@@ -102,7 +100,7 @@ module RuboCop
|
|
|
102
100
|
node.receiver.str_type? &&
|
|
103
101
|
node.first_argument.str_type? &&
|
|
104
102
|
node.multiline? &&
|
|
105
|
-
node.source
|
|
103
|
+
node.source.match?(/\+\s*\n/)
|
|
106
104
|
end
|
|
107
105
|
|
|
108
106
|
def find_topmost_plus_node(node)
|
|
@@ -129,11 +127,11 @@ module RuboCop
|
|
|
129
127
|
end
|
|
130
128
|
|
|
131
129
|
def uncorrectable?(part)
|
|
132
|
-
part.multiline? || heredoc?(part) || part.each_descendant(:
|
|
130
|
+
part.multiline? || heredoc?(part) || part.each_descendant(:any_block).any?
|
|
133
131
|
end
|
|
134
132
|
|
|
135
133
|
def heredoc?(node)
|
|
136
|
-
return false unless node.
|
|
134
|
+
return false unless node.type?(:str, :dstr)
|
|
137
135
|
|
|
138
136
|
node.heredoc?
|
|
139
137
|
end
|
|
@@ -143,22 +141,28 @@ module RuboCop
|
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
def replacement(parts)
|
|
146
|
-
interpolated_parts =
|
|
147
|
-
parts.map do |part|
|
|
148
|
-
case part.type
|
|
149
|
-
when :str
|
|
150
|
-
value = part.value
|
|
151
|
-
single_quoted?(part) ? value.gsub(/(\\|")/, '\\\\\&') : value.inspect[1..-2]
|
|
152
|
-
when :dstr
|
|
153
|
-
contents_range(part).source
|
|
154
|
-
else
|
|
155
|
-
"\#{#{part.source}}"
|
|
156
|
-
end
|
|
157
|
-
end
|
|
144
|
+
interpolated_parts = parts.map { |part| adjust_str(part) }
|
|
158
145
|
|
|
159
146
|
"\"#{handle_quotes(interpolated_parts).join}\""
|
|
160
147
|
end
|
|
161
148
|
|
|
149
|
+
def adjust_str(part)
|
|
150
|
+
case part.type
|
|
151
|
+
when :str
|
|
152
|
+
if single_quoted?(part)
|
|
153
|
+
part.value.gsub(/(\\|"|#\{|#@|#\$)/, '\\\\\&')
|
|
154
|
+
else
|
|
155
|
+
part.value.inspect[1..-2]
|
|
156
|
+
end
|
|
157
|
+
when :dstr, :begin
|
|
158
|
+
part.children.map do |child|
|
|
159
|
+
adjust_str(child)
|
|
160
|
+
end.join
|
|
161
|
+
else
|
|
162
|
+
"\#{#{part.source}}"
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
162
166
|
def handle_quotes(parts)
|
|
163
167
|
parts.map do |part|
|
|
164
168
|
part == '"' ? '\"' : part
|
|
@@ -22,20 +22,23 @@ module RuboCop
|
|
|
22
22
|
|
|
23
23
|
# @!method lstrip_rstrip(node)
|
|
24
24
|
def_node_matcher :lstrip_rstrip, <<~PATTERN
|
|
25
|
-
{
|
|
26
|
-
|
|
25
|
+
{
|
|
26
|
+
(call $(call _ :rstrip) :lstrip)
|
|
27
|
+
(call $(call _ :lstrip) :rstrip)
|
|
28
|
+
}
|
|
27
29
|
PATTERN
|
|
28
30
|
|
|
29
31
|
def on_send(node)
|
|
30
|
-
lstrip_rstrip(node) do |first_send
|
|
32
|
+
lstrip_rstrip(node) do |first_send|
|
|
31
33
|
range = range_between(first_send.loc.selector.begin_pos, node.source_range.end_pos)
|
|
32
|
-
message = format(MSG, methods:
|
|
34
|
+
message = format(MSG, methods: range.source)
|
|
33
35
|
|
|
34
36
|
add_offense(range, message: message) do |corrector|
|
|
35
37
|
corrector.replace(range, 'strip')
|
|
36
38
|
end
|
|
37
39
|
end
|
|
38
40
|
end
|
|
41
|
+
alias on_csend on_send
|
|
39
42
|
end
|
|
40
43
|
end
|
|
41
44
|
end
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for inheritance from Struct.new.
|
|
6
|
+
# Checks for inheritance from `Struct.new`. Inheriting from `Struct.new`
|
|
7
|
+
# adds a superfluous level in inheritance tree.
|
|
7
8
|
#
|
|
8
9
|
# @safety
|
|
9
10
|
# Autocorrection is unsafe because it will change the inheritance
|
|
@@ -17,12 +18,18 @@ module RuboCop
|
|
|
17
18
|
# end
|
|
18
19
|
# end
|
|
19
20
|
#
|
|
21
|
+
# Person.ancestors
|
|
22
|
+
# # => [Person, #<Class:0x000000010b4e14a0>, Struct, (...)]
|
|
23
|
+
#
|
|
20
24
|
# # good
|
|
21
25
|
# Person = Struct.new(:first_name, :last_name) do
|
|
22
26
|
# def age
|
|
23
27
|
# 42
|
|
24
28
|
# end
|
|
25
29
|
# end
|
|
30
|
+
#
|
|
31
|
+
# Person.ancestors
|
|
32
|
+
# # => [Person, Struct, (...)]
|
|
26
33
|
class StructInheritance < Base
|
|
27
34
|
include RangeHelp
|
|
28
35
|
extend AutoCorrector
|
|
@@ -33,7 +40,7 @@ module RuboCop
|
|
|
33
40
|
def on_class(node)
|
|
34
41
|
return unless struct_constructor?(node.parent_class)
|
|
35
42
|
|
|
36
|
-
add_offense(node.parent_class
|
|
43
|
+
add_offense(node.parent_class) do |corrector|
|
|
37
44
|
corrector.remove(range_with_surrounding_space(node.loc.keyword, newlines: false))
|
|
38
45
|
corrector.replace(node.loc.operator, '=')
|
|
39
46
|
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for redundant argument forwarding when calling super with arguments identical to
|
|
7
|
+
# the method definition.
|
|
8
|
+
#
|
|
9
|
+
# Using zero arity `super` within a `define_method` block results in `RuntimeError`:
|
|
10
|
+
#
|
|
11
|
+
# [source,ruby]
|
|
12
|
+
# ----
|
|
13
|
+
# def m
|
|
14
|
+
# define_method(:foo) { super() } # => OK
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# def m
|
|
18
|
+
# define_method(:foo) { super } # => RuntimeError
|
|
19
|
+
# end
|
|
20
|
+
# ----
|
|
21
|
+
#
|
|
22
|
+
# Furthermore, any arguments accompanied by a block may potentially be delegating to
|
|
23
|
+
# `define_method`, therefore, `super` used within these blocks will be allowed.
|
|
24
|
+
# This approach might result in false negatives, yet ensuring safe detection takes precedence.
|
|
25
|
+
#
|
|
26
|
+
# NOTE: When forwarding the same arguments but replacing the block argument with a new inline
|
|
27
|
+
# block, it is not necessary to explicitly list the non-block arguments. As such, an offense
|
|
28
|
+
# will be registered in this case.
|
|
29
|
+
#
|
|
30
|
+
# @example
|
|
31
|
+
# # bad
|
|
32
|
+
# def method(*args, **kwargs)
|
|
33
|
+
# super(*args, **kwargs)
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
# # good - implicitly passing all arguments
|
|
37
|
+
# def method(*args, **kwargs)
|
|
38
|
+
# super
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# # good - forwarding a subset of the arguments
|
|
42
|
+
# def method(*args, **kwargs)
|
|
43
|
+
# super(*args)
|
|
44
|
+
# end
|
|
45
|
+
#
|
|
46
|
+
# # good - forwarding no arguments
|
|
47
|
+
# def method(*args, **kwargs)
|
|
48
|
+
# super()
|
|
49
|
+
# end
|
|
50
|
+
#
|
|
51
|
+
# # bad - forwarding with overridden block
|
|
52
|
+
# def method(*args, **kwargs, &block)
|
|
53
|
+
# super(*args, **kwargs) { do_something }
|
|
54
|
+
# end
|
|
55
|
+
#
|
|
56
|
+
# # good - implicitly passing all non-block arguments
|
|
57
|
+
# def method(*args, **kwargs, &block)
|
|
58
|
+
# super { do_something }
|
|
59
|
+
# end
|
|
60
|
+
#
|
|
61
|
+
# # good - assigning to the block variable before calling super
|
|
62
|
+
# def method(&block)
|
|
63
|
+
# # Assigning to the block variable would pass the old value to super,
|
|
64
|
+
# # under this circumstance the block must be referenced explicitly.
|
|
65
|
+
# block ||= proc { 'fallback behavior' }
|
|
66
|
+
# super(&block)
|
|
67
|
+
# end
|
|
68
|
+
class SuperArguments < Base
|
|
69
|
+
extend AutoCorrector
|
|
70
|
+
|
|
71
|
+
ASSIGN_TYPES = %i[or_asgn lvasgn].freeze
|
|
72
|
+
|
|
73
|
+
MSG = 'Call `super` without arguments and parentheses when the signature is identical.'
|
|
74
|
+
MSG_INLINE_BLOCK = 'Call `super` without arguments and parentheses when all positional ' \
|
|
75
|
+
'and keyword arguments are forwarded.'
|
|
76
|
+
|
|
77
|
+
def on_super(super_node)
|
|
78
|
+
return unless (def_node = find_def_node(super_node))
|
|
79
|
+
|
|
80
|
+
def_node_args = def_node.arguments.argument_list
|
|
81
|
+
super_args = preprocess_super_args(super_node.arguments)
|
|
82
|
+
|
|
83
|
+
return unless arguments_identical?(def_node, super_node, def_node_args, super_args)
|
|
84
|
+
|
|
85
|
+
# If the number of arguments to the def node and super node are different here,
|
|
86
|
+
# it's because the block argument is not forwarded.
|
|
87
|
+
message = def_node_args.size == super_args.size ? MSG : MSG_INLINE_BLOCK
|
|
88
|
+
add_offense(super_node, message: message) do |corrector|
|
|
89
|
+
corrector.replace(super_node, 'super')
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
def find_def_node(super_node)
|
|
96
|
+
super_node.ancestors.find do |node|
|
|
97
|
+
# When defining dynamic methods, implicitly calling `super` is not possible.
|
|
98
|
+
# Since there is a possibility of delegation to `define_method`,
|
|
99
|
+
# `super` used within the block is always allowed.
|
|
100
|
+
break if node.any_block_type? && !block_sends_to_super?(super_node, node)
|
|
101
|
+
|
|
102
|
+
break node if node.any_def_type?
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
107
|
+
def arguments_identical?(def_node, super_node, def_args, super_args)
|
|
108
|
+
return false if argument_list_size_differs?(def_args, super_args, super_node)
|
|
109
|
+
|
|
110
|
+
def_args.zip(super_args).each do |def_arg, super_arg|
|
|
111
|
+
next if positional_arg_same?(def_arg, super_arg)
|
|
112
|
+
next if positional_rest_arg_same(def_arg, super_arg)
|
|
113
|
+
next if keyword_arg_same?(def_arg, super_arg)
|
|
114
|
+
next if keyword_rest_arg_same?(def_arg, super_arg)
|
|
115
|
+
next if block_arg_same?(def_node, super_node, def_arg, super_arg)
|
|
116
|
+
next if forward_arg_same?(def_arg, super_arg)
|
|
117
|
+
|
|
118
|
+
return false
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
true
|
|
122
|
+
end
|
|
123
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
124
|
+
|
|
125
|
+
def argument_list_size_differs?(def_args, super_args, super_node)
|
|
126
|
+
# If the def node has a block argument and the super node has an explicit block,
|
|
127
|
+
# the number of arguments is the same, so ignore the def node block arg.
|
|
128
|
+
def_args_size = def_args.size
|
|
129
|
+
def_args_size -= 1 if def_args.any?(&:blockarg_type?) && block_sends_to_super?(super_node)
|
|
130
|
+
|
|
131
|
+
def_args_size != super_args.size
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def block_sends_to_super?(super_node, parent_node = super_node.parent)
|
|
135
|
+
# Checks if the send node of a block is the given super node,
|
|
136
|
+
# or a method chain containing it.
|
|
137
|
+
return false unless parent_node
|
|
138
|
+
return false unless parent_node.any_block_type?
|
|
139
|
+
|
|
140
|
+
parent_node.send_node.each_node(:super).any?(super_node)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def positional_arg_same?(def_arg, super_arg)
|
|
144
|
+
return false unless def_arg.type?(:arg, :optarg)
|
|
145
|
+
return false unless super_arg.lvar_type?
|
|
146
|
+
|
|
147
|
+
def_arg.name == super_arg.children.first
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def positional_rest_arg_same(def_arg, super_arg)
|
|
151
|
+
return false unless def_arg.restarg_type?
|
|
152
|
+
# anonymous forwarding
|
|
153
|
+
return true if def_arg.name.nil? && super_arg.forwarded_restarg_type?
|
|
154
|
+
return false unless super_arg.splat_type?
|
|
155
|
+
return false unless (lvar_node = super_arg.children.first).lvar_type?
|
|
156
|
+
|
|
157
|
+
def_arg.name == lvar_node.children.first
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def keyword_arg_same?(def_arg, super_arg)
|
|
161
|
+
return false unless def_arg.type?(:kwarg, :kwoptarg)
|
|
162
|
+
return false unless (pair_node = super_arg).pair_type?
|
|
163
|
+
return false unless (sym_node = pair_node.key).sym_type?
|
|
164
|
+
return false unless (lvar_node = pair_node.value).lvar_type?
|
|
165
|
+
return false unless sym_node.source == lvar_node.source
|
|
166
|
+
|
|
167
|
+
def_arg.name == sym_node.value
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def keyword_rest_arg_same?(def_arg, super_arg)
|
|
171
|
+
return false unless def_arg.kwrestarg_type?
|
|
172
|
+
# anonymous forwarding
|
|
173
|
+
return true if def_arg.name.nil? && super_arg.forwarded_kwrestarg_type?
|
|
174
|
+
return false unless super_arg.kwsplat_type?
|
|
175
|
+
return false unless (lvar_node = super_arg.children.first).lvar_type?
|
|
176
|
+
|
|
177
|
+
def_arg.name == lvar_node.children.first
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
def block_arg_same?(def_node, super_node, def_arg, super_arg)
|
|
181
|
+
return false unless def_arg.blockarg_type?
|
|
182
|
+
return true if block_sends_to_super?(super_node)
|
|
183
|
+
return false unless super_arg.block_pass_type?
|
|
184
|
+
|
|
185
|
+
# anonymous forwarding
|
|
186
|
+
return true if (block_pass_child = super_arg.children.first).nil? && def_arg.name.nil?
|
|
187
|
+
|
|
188
|
+
block_arg_name = block_pass_child.children.first
|
|
189
|
+
def_arg.name == block_arg_name && !block_reassigned?(def_node, block_arg_name)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Reassigning the block argument will still pass along the original block to super
|
|
193
|
+
# https://bugs.ruby-lang.org/issues/20505
|
|
194
|
+
def block_reassigned?(def_node, block_arg_name)
|
|
195
|
+
def_node.each_node(*ASSIGN_TYPES).any? do |assign_node|
|
|
196
|
+
# TODO: Since `Symbol#name` is supported from Ruby 3.0, the inheritance check for
|
|
197
|
+
# `AST::Node` can be removed when requiring Ruby 3.0+.
|
|
198
|
+
lhs = assign_node.node_parts[0]
|
|
199
|
+
next if lhs.is_a?(AST::Node) && !lhs.respond_to?(:name)
|
|
200
|
+
|
|
201
|
+
assign_node.name == block_arg_name
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def forward_arg_same?(def_arg, super_arg)
|
|
206
|
+
def_arg.forward_arg_type? && super_arg.forwarded_args_type?
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def preprocess_super_args(super_args)
|
|
210
|
+
super_args.flat_map do |node|
|
|
211
|
+
if node.hash_type? && !node.braces?
|
|
212
|
+
node.children
|
|
213
|
+
else
|
|
214
|
+
node
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|