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
|
@@ -8,11 +8,42 @@ module RuboCop
|
|
|
8
8
|
# This cop identifies places where `do_something(*args, &block)`
|
|
9
9
|
# can be replaced by `do_something(...)`.
|
|
10
10
|
#
|
|
11
|
+
# In Ruby 3.1, anonymous block forwarding has been added.
|
|
12
|
+
#
|
|
13
|
+
# This cop identifies places where `do_something(&block)` can be replaced
|
|
14
|
+
# by `do_something(&)`; if desired, this functionality can be disabled
|
|
15
|
+
# by setting `UseAnonymousForwarding: false`.
|
|
16
|
+
#
|
|
11
17
|
# In Ruby 3.2, anonymous args/kwargs forwarding has been added.
|
|
12
18
|
#
|
|
13
|
-
# This cop also identifies places where
|
|
14
|
-
# replaced by
|
|
15
|
-
# by setting UseAnonymousForwarding: false
|
|
19
|
+
# This cop also identifies places where `+use_args(*args)+`/`+use_kwargs(**kwargs)+` can be
|
|
20
|
+
# replaced by `+use_args(*)+`/`+use_kwargs(**)+`; if desired, this functionality can be
|
|
21
|
+
# disabled by setting `UseAnonymousForwarding: false`.
|
|
22
|
+
#
|
|
23
|
+
# And this cop has `RedundantRestArgumentNames`, `RedundantKeywordRestArgumentNames`,
|
|
24
|
+
# and `RedundantBlockArgumentNames` options. This configuration is a list of redundant names
|
|
25
|
+
# that are sufficient for anonymizing meaningless naming.
|
|
26
|
+
#
|
|
27
|
+
# Meaningless names that are commonly used can be anonymized by default:
|
|
28
|
+
# e.g., `+*args+`, `+**options+`, `&block`, and so on.
|
|
29
|
+
#
|
|
30
|
+
# Names not on this list are likely to be meaningful and are allowed by default.
|
|
31
|
+
#
|
|
32
|
+
# This cop handles not only method forwarding but also forwarding to `super`.
|
|
33
|
+
#
|
|
34
|
+
# [NOTE]
|
|
35
|
+
# ====
|
|
36
|
+
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
|
37
|
+
# no offense will be registered until Ruby 3.4:
|
|
38
|
+
#
|
|
39
|
+
# [source,ruby]
|
|
40
|
+
# ----
|
|
41
|
+
# def foo(&block)
|
|
42
|
+
# # Using an anonymous block would be a syntax error on Ruby 3.3.0
|
|
43
|
+
# block_method { bar(&block) }
|
|
44
|
+
# end
|
|
45
|
+
# ----
|
|
46
|
+
# ====
|
|
16
47
|
#
|
|
17
48
|
# @example
|
|
18
49
|
# # bad
|
|
@@ -32,22 +63,25 @@ module RuboCop
|
|
|
32
63
|
#
|
|
33
64
|
# @example UseAnonymousForwarding: true (default, only relevant for Ruby >= 3.2)
|
|
34
65
|
# # bad
|
|
35
|
-
# def foo(*args, **kwargs)
|
|
66
|
+
# def foo(*args, **kwargs, &block)
|
|
36
67
|
# args_only(*args)
|
|
37
68
|
# kwargs_only(**kwargs)
|
|
69
|
+
# block_only(&block)
|
|
38
70
|
# end
|
|
39
71
|
#
|
|
40
72
|
# # good
|
|
41
|
-
# def foo(*,
|
|
73
|
+
# def foo(*, **, &)
|
|
42
74
|
# args_only(*)
|
|
43
75
|
# kwargs_only(**)
|
|
76
|
+
# block_only(&)
|
|
44
77
|
# end
|
|
45
78
|
#
|
|
46
79
|
# @example UseAnonymousForwarding: false (only relevant for Ruby >= 3.2)
|
|
47
80
|
# # good
|
|
48
|
-
# def foo(*args, **kwargs)
|
|
81
|
+
# def foo(*args, **kwargs, &block)
|
|
49
82
|
# args_only(*args)
|
|
50
83
|
# kwargs_only(**kwargs)
|
|
84
|
+
# block_only(&block)
|
|
51
85
|
# end
|
|
52
86
|
#
|
|
53
87
|
# @example AllowOnlyRestArgument: true (default, only relevant for Ruby < 3.2)
|
|
@@ -72,6 +106,38 @@ module RuboCop
|
|
|
72
106
|
# bar(**kwargs)
|
|
73
107
|
# end
|
|
74
108
|
#
|
|
109
|
+
# @example RedundantRestArgumentNames: ['args', 'arguments'] (default)
|
|
110
|
+
# # bad
|
|
111
|
+
# def foo(*args)
|
|
112
|
+
# bar(*args)
|
|
113
|
+
# end
|
|
114
|
+
#
|
|
115
|
+
# # good
|
|
116
|
+
# def foo(*)
|
|
117
|
+
# bar(*)
|
|
118
|
+
# end
|
|
119
|
+
#
|
|
120
|
+
# @example RedundantKeywordRestArgumentNames: ['kwargs', 'options', 'opts'] (default)
|
|
121
|
+
# # bad
|
|
122
|
+
# def foo(**kwargs)
|
|
123
|
+
# bar(**kwargs)
|
|
124
|
+
# end
|
|
125
|
+
#
|
|
126
|
+
# # good
|
|
127
|
+
# def foo(**)
|
|
128
|
+
# bar(**)
|
|
129
|
+
# end
|
|
130
|
+
#
|
|
131
|
+
# @example RedundantBlockArgumentNames: ['blk', 'block', 'proc'] (default)
|
|
132
|
+
# # bad - But it is good with `EnforcedStyle: explicit` set for `Naming/BlockForwarding`.
|
|
133
|
+
# def foo(&block)
|
|
134
|
+
# bar(&block)
|
|
135
|
+
# end
|
|
136
|
+
#
|
|
137
|
+
# # good
|
|
138
|
+
# def foo(&)
|
|
139
|
+
# bar(&)
|
|
140
|
+
# end
|
|
75
141
|
class ArgumentsForwarding < Base
|
|
76
142
|
include RangeHelp
|
|
77
143
|
extend AutoCorrector
|
|
@@ -80,22 +146,25 @@ module RuboCop
|
|
|
80
146
|
minimum_target_ruby_version 2.7
|
|
81
147
|
|
|
82
148
|
FORWARDING_LVAR_TYPES = %i[splat kwsplat block_pass].freeze
|
|
83
|
-
ADDITIONAL_ARG_TYPES = %i[lvar arg].freeze
|
|
84
149
|
|
|
85
150
|
FORWARDING_MSG = 'Use shorthand syntax `...` for arguments forwarding.'
|
|
86
151
|
ARGS_MSG = 'Use anonymous positional arguments forwarding (`*`).'
|
|
87
152
|
KWARGS_MSG = 'Use anonymous keyword arguments forwarding (`**`).'
|
|
153
|
+
BLOCK_MSG = 'Use anonymous block arguments forwarding (`&`).'
|
|
154
|
+
|
|
155
|
+
def self.autocorrect_incompatible_with
|
|
156
|
+
[Naming::BlockForwarding]
|
|
157
|
+
end
|
|
88
158
|
|
|
89
159
|
def on_def(node)
|
|
90
160
|
return unless node.body
|
|
91
161
|
|
|
92
|
-
|
|
162
|
+
restarg, kwrestarg, blockarg = extract_forwardable_args(node.arguments)
|
|
163
|
+
forwardable_args = redundant_forwardable_named_args(restarg, kwrestarg, blockarg)
|
|
164
|
+
send_nodes = node.each_descendant(:call, :super, :yield).to_a
|
|
93
165
|
|
|
94
166
|
send_classifications = classify_send_nodes(
|
|
95
|
-
node,
|
|
96
|
-
node.each_descendant(:send).to_a,
|
|
97
|
-
non_splat_or_block_pass_lvar_references(node.body),
|
|
98
|
-
forwardable_args
|
|
167
|
+
node, send_nodes, non_splat_or_block_pass_lvar_references(node.body), forwardable_args
|
|
99
168
|
)
|
|
100
169
|
|
|
101
170
|
return if send_classifications.empty?
|
|
@@ -115,36 +184,73 @@ module RuboCop
|
|
|
115
184
|
[args.find(&:restarg_type?), args.find(&:kwrestarg_type?), args.find(&:blockarg_type?)]
|
|
116
185
|
end
|
|
117
186
|
|
|
187
|
+
def redundant_forwardable_named_args(restarg, kwrestarg, blockarg)
|
|
188
|
+
restarg_node = redundant_named_arg(restarg, 'RedundantRestArgumentNames', '*')
|
|
189
|
+
kwrestarg_node = redundant_named_arg(kwrestarg, 'RedundantKeywordRestArgumentNames', '**')
|
|
190
|
+
blockarg_node = redundant_named_arg(blockarg, 'RedundantBlockArgumentNames', '&')
|
|
191
|
+
|
|
192
|
+
[restarg_node, kwrestarg_node, blockarg_node]
|
|
193
|
+
end
|
|
194
|
+
|
|
118
195
|
def only_forwards_all?(send_classifications)
|
|
119
|
-
|
|
196
|
+
all_classifications = %i[all all_anonymous].freeze
|
|
197
|
+
send_classifications.all? { |_, c, _, _| all_classifications.include?(c) }
|
|
120
198
|
end
|
|
121
199
|
|
|
200
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
122
201
|
def add_forward_all_offenses(node, send_classifications, forwardable_args)
|
|
123
|
-
|
|
124
|
-
|
|
202
|
+
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
|
203
|
+
registered_block_arg_offense = false
|
|
204
|
+
|
|
205
|
+
send_classifications.each do |send_node, c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
|
206
|
+
if !forward_rest && !forward_kwrest && c != :all_anonymous
|
|
207
|
+
if allow_anonymous_forwarding_in_block?(forward_block_arg)
|
|
208
|
+
register_forward_block_arg_offense(!forward_rest, node.arguments, block_arg)
|
|
209
|
+
register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
|
|
210
|
+
end
|
|
211
|
+
registered_block_arg_offense = true
|
|
212
|
+
break
|
|
213
|
+
else
|
|
214
|
+
first_arg = forward_rest || forward_kwrest || forward_all_first_argument(send_node)
|
|
215
|
+
register_forward_all_offense(send_node, send_node, first_arg)
|
|
216
|
+
end
|
|
125
217
|
end
|
|
126
218
|
|
|
127
|
-
|
|
128
|
-
|
|
219
|
+
return if registered_block_arg_offense
|
|
220
|
+
|
|
221
|
+
register_forward_all_offense(node, node.arguments, rest_arg || kwrest_arg)
|
|
129
222
|
end
|
|
223
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
130
224
|
|
|
225
|
+
def forward_all_first_argument(node)
|
|
226
|
+
node.arguments.reverse_each.find(&:forwarded_restarg_type?)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
131
230
|
def add_post_ruby_32_offenses(def_node, send_classifications, forwardable_args)
|
|
132
231
|
return unless use_anonymous_forwarding?
|
|
232
|
+
return unless all_forwarding_offenses_correctable?(send_classifications)
|
|
133
233
|
|
|
134
|
-
rest_arg, kwrest_arg,
|
|
234
|
+
rest_arg, kwrest_arg, block_arg = *forwardable_args
|
|
135
235
|
|
|
136
|
-
send_classifications.each do |send_node, _c, forward_rest, forward_kwrest|
|
|
137
|
-
if forward_rest
|
|
236
|
+
send_classifications.each do |send_node, _c, forward_rest, forward_kwrest, forward_block_arg| # rubocop:disable Layout/LineLength
|
|
237
|
+
if allow_anonymous_forwarding_in_block?(forward_rest)
|
|
138
238
|
register_forward_args_offense(def_node.arguments, rest_arg)
|
|
139
239
|
register_forward_args_offense(send_node, forward_rest)
|
|
140
240
|
end
|
|
141
241
|
|
|
142
|
-
if forward_kwrest
|
|
242
|
+
if allow_anonymous_forwarding_in_block?(forward_kwrest)
|
|
143
243
|
register_forward_kwargs_offense(!forward_rest, def_node.arguments, kwrest_arg)
|
|
144
244
|
register_forward_kwargs_offense(!forward_rest, send_node, forward_kwrest)
|
|
145
245
|
end
|
|
246
|
+
|
|
247
|
+
if allow_anonymous_forwarding_in_block?(forward_block_arg)
|
|
248
|
+
register_forward_block_arg_offense(!forward_rest, def_node.arguments, block_arg)
|
|
249
|
+
register_forward_block_arg_offense(!forward_rest, send_node, forward_block_arg)
|
|
250
|
+
end
|
|
146
251
|
end
|
|
147
252
|
end
|
|
253
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
148
254
|
|
|
149
255
|
def non_splat_or_block_pass_lvar_references(body)
|
|
150
256
|
body.each_descendant(:lvar, :lvasgn).filter_map do |lvar|
|
|
@@ -173,10 +279,7 @@ module RuboCop
|
|
|
173
279
|
|
|
174
280
|
def classification_and_forwards(def_node, send_node, referenced_lvars, forwardable_args)
|
|
175
281
|
classifier = SendNodeClassifier.new(
|
|
176
|
-
def_node,
|
|
177
|
-
send_node,
|
|
178
|
-
referenced_lvars,
|
|
179
|
-
forwardable_args,
|
|
282
|
+
def_node, send_node, referenced_lvars, forwardable_args,
|
|
180
283
|
target_ruby_version: target_ruby_version,
|
|
181
284
|
allow_only_rest_arguments: allow_only_rest_arguments?
|
|
182
285
|
)
|
|
@@ -185,7 +288,43 @@ module RuboCop
|
|
|
185
288
|
|
|
186
289
|
return unless classification
|
|
187
290
|
|
|
188
|
-
[
|
|
291
|
+
[
|
|
292
|
+
classification,
|
|
293
|
+
classifier.forwarded_rest_arg,
|
|
294
|
+
classifier.forwarded_kwrest_arg,
|
|
295
|
+
classifier.forwarded_block_arg
|
|
296
|
+
]
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def redundant_named_arg(arg, config_name, keyword)
|
|
300
|
+
return nil unless arg
|
|
301
|
+
|
|
302
|
+
redundant_arg_names = cop_config.fetch(config_name, []).map do |redundant_arg_name|
|
|
303
|
+
"#{keyword}#{redundant_arg_name}"
|
|
304
|
+
end << keyword
|
|
305
|
+
|
|
306
|
+
redundant_arg_names.include?(arg.source) ? arg : nil
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
# Checks if forwarding is uses both in blocks and outside of blocks.
|
|
310
|
+
# On Ruby 3.3.0, anonymous block forwarding in blocks can be is a syntax
|
|
311
|
+
# error, so we only want to register an offense if we can change all occurrences.
|
|
312
|
+
def all_forwarding_offenses_correctable?(send_classifications)
|
|
313
|
+
return true if target_ruby_version >= 3.4
|
|
314
|
+
|
|
315
|
+
send_classifications.none? do |send_node, *|
|
|
316
|
+
send_node.each_ancestor(:any_block).any?
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
|
|
321
|
+
# was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
|
|
322
|
+
# We disallow this also for earlier Ruby versions so that code is forwards compatible.
|
|
323
|
+
def allow_anonymous_forwarding_in_block?(node)
|
|
324
|
+
return false unless node
|
|
325
|
+
return true if target_ruby_version >= 3.4
|
|
326
|
+
|
|
327
|
+
node.each_ancestor(:any_block).none?
|
|
189
328
|
end
|
|
190
329
|
|
|
191
330
|
def register_forward_args_offense(def_arguments_or_send, rest_arg_or_splat)
|
|
@@ -204,6 +343,17 @@ module RuboCop
|
|
|
204
343
|
end
|
|
205
344
|
end
|
|
206
345
|
|
|
346
|
+
def register_forward_block_arg_offense(add_parens, def_arguments_or_send, block_arg)
|
|
347
|
+
return if target_ruby_version <= 3.0 ||
|
|
348
|
+
block_arg.nil? || block_arg.source == '&' || explicit_block_name?
|
|
349
|
+
|
|
350
|
+
add_offense(block_arg, message: BLOCK_MSG) do |corrector|
|
|
351
|
+
add_parens_if_missing(def_arguments_or_send, corrector) if add_parens
|
|
352
|
+
|
|
353
|
+
corrector.replace(block_arg, '&')
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
|
|
207
357
|
def register_forward_all_offense(def_or_send, send_or_arguments, rest_or_splat)
|
|
208
358
|
arg_range = arguments_range(def_or_send, rest_or_splat)
|
|
209
359
|
|
|
@@ -215,11 +365,7 @@ module RuboCop
|
|
|
215
365
|
end
|
|
216
366
|
|
|
217
367
|
def arguments_range(node, first_node)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
start_node = first_node || arguments.first
|
|
221
|
-
|
|
222
|
-
range_between(start_node.source_range.begin_pos, arguments.last.source_range.end_pos)
|
|
368
|
+
first_node.source_range.begin.join(node.last_argument.source_range.end)
|
|
223
369
|
end
|
|
224
370
|
|
|
225
371
|
def allow_only_rest_arguments?
|
|
@@ -232,6 +378,7 @@ module RuboCop
|
|
|
232
378
|
|
|
233
379
|
def add_parens_if_missing(node, corrector)
|
|
234
380
|
return if parentheses?(node)
|
|
381
|
+
return if node.send_type? && node.method?(:[])
|
|
235
382
|
|
|
236
383
|
add_parentheses(node, corrector)
|
|
237
384
|
end
|
|
@@ -249,6 +396,23 @@ module RuboCop
|
|
|
249
396
|
# @!method forwarded_block_arg?(node, block_name)
|
|
250
397
|
def_node_matcher :forwarded_block_arg?, '(block_pass {(lvar %1) nil?})'
|
|
251
398
|
|
|
399
|
+
# @!method def_all_anonymous_args?(node)
|
|
400
|
+
def_node_matcher :def_all_anonymous_args?, <<~PATTERN
|
|
401
|
+
(
|
|
402
|
+
def _
|
|
403
|
+
(args ... (restarg) (kwrestarg) (blockarg nil?))
|
|
404
|
+
_
|
|
405
|
+
)
|
|
406
|
+
PATTERN
|
|
407
|
+
|
|
408
|
+
# @!method send_all_anonymous_args?(node)
|
|
409
|
+
def_node_matcher :send_all_anonymous_args?, <<~PATTERN
|
|
410
|
+
(
|
|
411
|
+
send _ _
|
|
412
|
+
... (forwarded_restarg) (hash (forwarded_kwrestarg)) (block_pass nil?)
|
|
413
|
+
)
|
|
414
|
+
PATTERN
|
|
415
|
+
|
|
252
416
|
def initialize(def_node, send_node, referenced_lvars, forwardable_args, **config)
|
|
253
417
|
@def_node = def_node
|
|
254
418
|
@send_node = send_node
|
|
@@ -278,9 +442,11 @@ module RuboCop
|
|
|
278
442
|
end
|
|
279
443
|
|
|
280
444
|
def classification
|
|
281
|
-
return nil unless forwarded_rest_arg || forwarded_kwrest_arg
|
|
445
|
+
return nil unless forwarded_rest_arg || forwarded_kwrest_arg || forwarded_block_arg
|
|
282
446
|
|
|
283
|
-
if
|
|
447
|
+
if ruby_32_only_anonymous_forwarding?
|
|
448
|
+
:all_anonymous
|
|
449
|
+
elsif can_forward_all?
|
|
284
450
|
:all
|
|
285
451
|
else
|
|
286
452
|
:rest_or_kwrest
|
|
@@ -289,16 +455,31 @@ module RuboCop
|
|
|
289
455
|
|
|
290
456
|
private
|
|
291
457
|
|
|
458
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
292
459
|
def can_forward_all?
|
|
293
460
|
return false if any_arg_referenced?
|
|
294
|
-
return false if
|
|
461
|
+
return false if ruby_30_or_lower_optarg?
|
|
462
|
+
return false if ruby_32_or_higher_missing_rest_or_kwest?
|
|
295
463
|
return false unless offensive_block_forwarding?
|
|
296
464
|
return false if additional_kwargs_or_forwarded_kwargs?
|
|
297
465
|
|
|
298
466
|
no_additional_args? || (target_ruby_version >= 3.0 && no_post_splat_args?)
|
|
299
467
|
end
|
|
468
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
469
|
+
|
|
470
|
+
# def foo(a = 41, ...) is a syntax error in 3.0.
|
|
471
|
+
def ruby_30_or_lower_optarg?
|
|
472
|
+
target_ruby_version <= 3.0 && @def_node.arguments.any?(&:optarg_type?)
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
def ruby_32_only_anonymous_forwarding?
|
|
476
|
+
# A block argument and an anonymous block argument are never passed together.
|
|
477
|
+
return false if @send_node.each_ancestor(:any_block).any?
|
|
300
478
|
|
|
301
|
-
|
|
479
|
+
def_all_anonymous_args?(@def_node) && send_all_anonymous_args?(@send_node)
|
|
480
|
+
end
|
|
481
|
+
|
|
482
|
+
def ruby_32_or_higher_missing_rest_or_kwest?
|
|
302
483
|
target_ruby_version >= 3.2 && !forwarded_rest_and_kwrest_args
|
|
303
484
|
end
|
|
304
485
|
|
|
@@ -346,7 +527,7 @@ module RuboCop
|
|
|
346
527
|
end
|
|
347
528
|
|
|
348
529
|
def additional_kwargs?
|
|
349
|
-
@def_node.arguments.any? { |a| a.
|
|
530
|
+
@def_node.arguments.any? { |a| a.type?(:kwarg, :kwoptarg) }
|
|
350
531
|
end
|
|
351
532
|
|
|
352
533
|
def forward_additional_kwargs?
|
|
@@ -362,9 +543,20 @@ module RuboCop
|
|
|
362
543
|
def no_additional_args?
|
|
363
544
|
forwardable_count = [@rest_arg, @kwrest_arg, @block_arg].compact.size
|
|
364
545
|
|
|
546
|
+
return false if missing_rest_arg_or_kwrest_arg?
|
|
547
|
+
|
|
365
548
|
@def_node.arguments.size == forwardable_count &&
|
|
366
549
|
@send_node.arguments.size == forwardable_count
|
|
367
550
|
end
|
|
551
|
+
|
|
552
|
+
def missing_rest_arg_or_kwrest_arg?
|
|
553
|
+
(@rest_arg_name && !forwarded_rest_arg) ||
|
|
554
|
+
(@kwrest_arg_name && !forwarded_kwrest_arg)
|
|
555
|
+
end
|
|
556
|
+
end
|
|
557
|
+
|
|
558
|
+
def explicit_block_name?
|
|
559
|
+
config.for_enabled_cop('Naming/BlockForwarding')['EnforcedStyle'] == 'explicit'
|
|
368
560
|
end
|
|
369
561
|
end
|
|
370
562
|
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Identifies usages of `arr[0]` and `arr[-1]` and suggests to change
|
|
7
|
+
# them to use `arr.first` and `arr.last` instead.
|
|
8
|
+
#
|
|
9
|
+
# The cop is disabled by default due to safety concerns.
|
|
10
|
+
#
|
|
11
|
+
# @safety
|
|
12
|
+
# This cop is unsafe because `[0]` or `[-1]` can be called on a Hash,
|
|
13
|
+
# which returns a value for `0` or `-1` key, but changing these to use
|
|
14
|
+
# `.first` or `.last` will return first/last tuple instead. Also, String
|
|
15
|
+
# does not implement `first`/`last` methods.
|
|
16
|
+
#
|
|
17
|
+
# @example
|
|
18
|
+
# # bad
|
|
19
|
+
# arr[0]
|
|
20
|
+
# arr[-1]
|
|
21
|
+
#
|
|
22
|
+
# # good
|
|
23
|
+
# arr.first
|
|
24
|
+
# arr.last
|
|
25
|
+
# arr[0] = 2
|
|
26
|
+
# arr[0][-2]
|
|
27
|
+
#
|
|
28
|
+
class ArrayFirstLast < Base
|
|
29
|
+
extend AutoCorrector
|
|
30
|
+
|
|
31
|
+
MSG = 'Use `%<preferred>s`.'
|
|
32
|
+
RESTRICT_ON_SEND = %i[[]].freeze
|
|
33
|
+
|
|
34
|
+
# rubocop:disable Metrics/AbcSize
|
|
35
|
+
def on_send(node)
|
|
36
|
+
return unless node.arguments.size == 1 && node.first_argument.int_type?
|
|
37
|
+
|
|
38
|
+
value = node.first_argument.value
|
|
39
|
+
return unless [0, -1].include?(value)
|
|
40
|
+
|
|
41
|
+
node = innermost_braces_node(node)
|
|
42
|
+
return if node.parent && brace_method?(node.parent)
|
|
43
|
+
|
|
44
|
+
preferred = (value.zero? ? 'first' : 'last')
|
|
45
|
+
offense_range = find_offense_range(node)
|
|
46
|
+
|
|
47
|
+
add_offense(offense_range, message: format(MSG, preferred: preferred)) do |corrector|
|
|
48
|
+
corrector.replace(offense_range, preferred_value(node, preferred))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
# rubocop:enable Metrics/AbcSize
|
|
52
|
+
alias on_csend on_send
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
def preferred_value(node, value)
|
|
57
|
+
value = ".#{value}" unless node.loc.dot
|
|
58
|
+
value
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def find_offense_range(node)
|
|
62
|
+
if node.loc.dot
|
|
63
|
+
node.loc.selector.join(node.source_range.end)
|
|
64
|
+
else
|
|
65
|
+
node.loc.selector
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def innermost_braces_node(node)
|
|
70
|
+
node = node.receiver while node.receiver.send_type? && node.receiver.method?(:[])
|
|
71
|
+
node
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def brace_method?(node)
|
|
75
|
+
node.send_type? && (node.method?(:[]) || node.method?(:[]=))
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|