rubocop 1.57.1 → 1.81.7
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 +49 -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 +10 -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 -10
- 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 +17 -8
- 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 +187 -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 +16 -20
- 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 +23 -5
- 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 +33 -9
- 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 +79 -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,56 @@ module RuboCop
|
|
|
108
104
|
end
|
|
109
105
|
|
|
110
106
|
def autocorrect_outer_condition_basic(corrector, node, if_branch)
|
|
111
|
-
|
|
107
|
+
correct_node(corrector, node)
|
|
112
108
|
|
|
113
|
-
outer_condition = node.condition
|
|
114
|
-
correct_outer_condition(corrector, outer_condition)
|
|
115
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def correct_from_unless_to_if(corrector, node, is_modify_form: false)
|
|
131
|
-
corrector.replace(node.loc.keyword, 'if')
|
|
132
|
-
|
|
133
|
-
insert_bang(corrector, node, is_modify_form)
|
|
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)
|
|
134
121
|
end
|
|
135
122
|
|
|
136
|
-
def correct_for_guard_condition_style(corrector,
|
|
137
|
-
condition
|
|
138
|
-
corrector.insert_after(outer_condition, "#{and_operator}#{replace_condition(condition)}")
|
|
123
|
+
def correct_for_guard_condition_style(corrector, node, if_branch)
|
|
124
|
+
corrector.insert_after(node.condition, " && #{chainable_condition(if_branch)}")
|
|
139
125
|
|
|
140
|
-
range = range_between(
|
|
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
|
-
|
|
132
|
+
# rubocop:disable Metrics/AbcSize
|
|
133
|
+
def correct_for_basic_condition_style(corrector, node, if_branch)
|
|
146
134
|
range = range_between(
|
|
147
135
|
node.condition.source_range.end_pos, if_branch.condition.source_range.begin_pos
|
|
148
136
|
)
|
|
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
|
|
137
|
+
corrector.replace(range, ' && ')
|
|
154
138
|
|
|
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)
|
|
139
|
+
corrector.replace(if_branch.condition, chainable_condition(if_branch))
|
|
161
140
|
|
|
162
|
-
|
|
141
|
+
end_range = if same_line?(node.loc.end, node.if_branch.loc.end)
|
|
142
|
+
node.loc.end
|
|
143
|
+
else
|
|
144
|
+
range_by_whole_lines(node.loc.end, include_final_newline: true)
|
|
145
|
+
end
|
|
146
|
+
corrector.remove(end_range)
|
|
163
147
|
end
|
|
148
|
+
# rubocop:enable Metrics/AbcSize
|
|
149
|
+
|
|
150
|
+
def autocorrect_outer_condition_modify_form(corrector, node, if_branch)
|
|
151
|
+
correct_node(corrector, if_branch)
|
|
164
152
|
|
|
165
|
-
|
|
166
|
-
condition = if_branch.condition
|
|
167
|
-
corrector.insert_before(condition,
|
|
168
|
-
"#{'!' if node.unless?}#{replace_condition(node.condition)} && ")
|
|
153
|
+
corrector.insert_before(if_branch.condition, "#{chainable_condition(node)} && ")
|
|
169
154
|
|
|
170
|
-
|
|
171
|
-
corrector.remove(range_with_surrounding_space(
|
|
172
|
-
corrector.replace(if_branch.loc.keyword, 'if')
|
|
155
|
+
range = range_between(node.loc.keyword.begin_pos, node.condition.source_range.end_pos)
|
|
156
|
+
corrector.remove(range_with_surrounding_space(range, newlines: false))
|
|
173
157
|
end
|
|
174
158
|
|
|
175
159
|
def correct_for_comment(corrector, node, if_branch)
|
|
@@ -181,71 +165,79 @@ module RuboCop
|
|
|
181
165
|
corrector.insert_before(node.loc.keyword, comment_text) unless comments.empty?
|
|
182
166
|
end
|
|
183
167
|
|
|
184
|
-
def
|
|
185
|
-
|
|
168
|
+
def chainable_condition(node)
|
|
169
|
+
wrapped_condition = add_parentheses_if_needed(node.condition)
|
|
186
170
|
|
|
187
|
-
|
|
188
|
-
begin_pos = condition.first_argument.source_range.begin_pos
|
|
189
|
-
return if end_pos > begin_pos
|
|
171
|
+
return wrapped_condition if node.if?
|
|
190
172
|
|
|
191
|
-
|
|
192
|
-
corrector.remove(range)
|
|
193
|
-
corrector.insert_after(range, '(')
|
|
194
|
-
corrector.insert_after(condition.last_argument, ')')
|
|
173
|
+
node.condition.and_type? ? "!(#{wrapped_condition})" : "!#{wrapped_condition}"
|
|
195
174
|
end
|
|
196
175
|
|
|
197
|
-
def
|
|
198
|
-
|
|
176
|
+
def add_parentheses_if_needed(condition)
|
|
177
|
+
# Handle `send` and `block` nodes that need to be wrapped in parens
|
|
178
|
+
# FIXME: autocorrection prevents syntax errors by wrapping the entire node in parens,
|
|
179
|
+
# but wrapping the argument list would be a more ergonomic correction.
|
|
180
|
+
node_to_check = condition&.any_block_type? ? condition.send_node : condition
|
|
181
|
+
return condition.source unless add_parentheses?(node_to_check)
|
|
199
182
|
|
|
200
|
-
if (condition
|
|
201
|
-
|
|
202
|
-
corrector.wrap(node.condition, '!(', ')')
|
|
183
|
+
if parenthesize_method?(condition)
|
|
184
|
+
parenthesized_method_arguments(condition)
|
|
203
185
|
elsif condition.and_type?
|
|
204
|
-
|
|
186
|
+
parenthesized_and(condition)
|
|
205
187
|
else
|
|
206
|
-
|
|
188
|
+
"(#{condition.source})"
|
|
207
189
|
end
|
|
208
190
|
end
|
|
209
191
|
|
|
210
|
-
def
|
|
211
|
-
|
|
192
|
+
def parenthesize_method?(node)
|
|
193
|
+
node.call_type? && node.arguments.any? && !node.parenthesized? &&
|
|
194
|
+
!node.comparison_method? && !node.operator_method?
|
|
195
|
+
end
|
|
212
196
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
end
|
|
197
|
+
def add_parentheses?(node)
|
|
198
|
+
return true if node.assignment? || node.or_type?
|
|
199
|
+
return true if assignment_in_and?(node)
|
|
200
|
+
return false unless node.call_type?
|
|
201
|
+
|
|
202
|
+
(node.arguments.any? && !node.parenthesized?) || node.prefix_not?
|
|
220
203
|
end
|
|
221
204
|
|
|
222
|
-
def
|
|
223
|
-
|
|
224
|
-
|
|
205
|
+
def assignment_in_and?(node)
|
|
206
|
+
return false unless node.and_type?
|
|
207
|
+
|
|
208
|
+
node.each_descendant.any?(&:assignment?)
|
|
225
209
|
end
|
|
226
210
|
|
|
227
|
-
def
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
211
|
+
def parenthesized_method_arguments(node)
|
|
212
|
+
method_call = node.source_range.begin.join(node.loc.selector.end).source
|
|
213
|
+
arguments = node.first_argument.source_range.begin.join(node.source_range.end).source
|
|
214
|
+
|
|
215
|
+
"#{method_call}(#{arguments})"
|
|
231
216
|
end
|
|
232
217
|
|
|
233
|
-
def
|
|
234
|
-
|
|
235
|
-
|
|
218
|
+
def parenthesized_and(node)
|
|
219
|
+
# We only need to add parentheses around the last clause if it's an assignment,
|
|
220
|
+
# because other clauses will be unchanged by merging conditionals.
|
|
221
|
+
lhs = node.lhs.source
|
|
222
|
+
rhs = parenthesized_and_clause(node.rhs)
|
|
223
|
+
operator = range_with_surrounding_space(node.loc.operator, whitespace: true).source
|
|
224
|
+
|
|
225
|
+
"#{lhs}#{operator}#{rhs}"
|
|
236
226
|
end
|
|
237
227
|
|
|
238
|
-
def
|
|
239
|
-
|
|
228
|
+
def parenthesized_and_clause(node)
|
|
229
|
+
if node.and_type?
|
|
230
|
+
parenthesized_and(node)
|
|
231
|
+
elsif node.assignment?
|
|
232
|
+
"(#{node.source})"
|
|
233
|
+
else
|
|
234
|
+
node.source
|
|
235
|
+
end
|
|
240
236
|
end
|
|
241
237
|
|
|
242
238
|
def allow_modifier?
|
|
243
239
|
cop_config['AllowModifier']
|
|
244
240
|
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
241
|
end
|
|
250
242
|
end
|
|
251
243
|
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
|