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
|
@@ -5,7 +5,8 @@ module RuboCop
|
|
|
5
5
|
module Lint
|
|
6
6
|
# Checks for redundant safe navigation calls.
|
|
7
7
|
# Use cases where a constant, named in camel case for classes and modules is `nil` are rare,
|
|
8
|
-
# and an offense is not detected when the receiver is a
|
|
8
|
+
# and an offense is not detected when the receiver is a constant. The detection also applies
|
|
9
|
+
# to `self`, and to literal receivers, except for `nil`.
|
|
9
10
|
#
|
|
10
11
|
# For all receivers, the `instance_of?`, `kind_of?`, `is_a?`, `eql?`, `respond_to?`,
|
|
11
12
|
# and `equal?` methods are checked by default.
|
|
@@ -19,6 +20,15 @@ module RuboCop
|
|
|
19
20
|
# In the example below, the safe navigation operator (`&.`) is unnecessary
|
|
20
21
|
# because `NilClass` has methods like `respond_to?` and `is_a?`.
|
|
21
22
|
#
|
|
23
|
+
# The `InferNonNilReceiver` option specifies whether to look into previous code
|
|
24
|
+
# paths to infer if the receiver can't be nil. This check is unsafe because the receiver
|
|
25
|
+
# can be redefined between the safe navigation call and previous regular method call.
|
|
26
|
+
# It does the inference only in the current scope, e.g. within the same method definition etc.
|
|
27
|
+
#
|
|
28
|
+
# The `AdditionalNilMethods` option specifies additional custom methods which are
|
|
29
|
+
# defined on `NilClass`. When `InferNonNilReceiver` is set, they are used to determine
|
|
30
|
+
# whether the receiver can be nil.
|
|
31
|
+
#
|
|
22
32
|
# @safety
|
|
23
33
|
# This cop is unsafe, because autocorrection can change the return type of
|
|
24
34
|
# the expression. An offending expression that previously could return `nil`
|
|
@@ -28,6 +38,23 @@ module RuboCop
|
|
|
28
38
|
# # bad
|
|
29
39
|
# CamelCaseConst&.do_something
|
|
30
40
|
#
|
|
41
|
+
# # good
|
|
42
|
+
# CamelCaseConst.do_something
|
|
43
|
+
#
|
|
44
|
+
# # bad
|
|
45
|
+
# foo.to_s&.strip
|
|
46
|
+
# foo.to_i&.zero?
|
|
47
|
+
# foo.to_f&.zero?
|
|
48
|
+
# foo.to_a&.size
|
|
49
|
+
# foo.to_h&.size
|
|
50
|
+
#
|
|
51
|
+
# # good
|
|
52
|
+
# foo.to_s.strip
|
|
53
|
+
# foo.to_i.zero?
|
|
54
|
+
# foo.to_f.zero?
|
|
55
|
+
# foo.to_a.size
|
|
56
|
+
# foo.to_h.size
|
|
57
|
+
#
|
|
31
58
|
# # bad
|
|
32
59
|
# do_something if attrs&.respond_to?(:[])
|
|
33
60
|
#
|
|
@@ -40,9 +67,6 @@ module RuboCop
|
|
|
40
67
|
# end
|
|
41
68
|
#
|
|
42
69
|
# # good
|
|
43
|
-
# CamelCaseConst.do_something
|
|
44
|
-
#
|
|
45
|
-
# # good
|
|
46
70
|
# while node.is_a?(BeginNode)
|
|
47
71
|
# node = node.parent
|
|
48
72
|
# end
|
|
@@ -50,6 +74,28 @@ module RuboCop
|
|
|
50
74
|
# # good - without `&.` this will always return `true`
|
|
51
75
|
# foo&.respond_to?(:to_a)
|
|
52
76
|
#
|
|
77
|
+
# # bad - for `nil`s conversion methods return default values for the type
|
|
78
|
+
# foo&.to_h || {}
|
|
79
|
+
# foo&.to_h { |k, v| [k, v] } || {}
|
|
80
|
+
# foo&.to_a || []
|
|
81
|
+
# foo&.to_i || 0
|
|
82
|
+
# foo&.to_f || 0.0
|
|
83
|
+
# foo&.to_s || ''
|
|
84
|
+
#
|
|
85
|
+
# # good
|
|
86
|
+
# foo.to_h
|
|
87
|
+
# foo.to_h { |k, v| [k, v] }
|
|
88
|
+
# foo.to_a
|
|
89
|
+
# foo.to_i
|
|
90
|
+
# foo.to_f
|
|
91
|
+
# foo.to_s
|
|
92
|
+
#
|
|
93
|
+
# # bad
|
|
94
|
+
# self&.foo
|
|
95
|
+
#
|
|
96
|
+
# # good
|
|
97
|
+
# self.foo
|
|
98
|
+
#
|
|
53
99
|
# @example AllowedMethods: [nil_safe_method]
|
|
54
100
|
# # bad
|
|
55
101
|
# do_something if attrs&.nil_safe_method(:[])
|
|
@@ -58,49 +104,155 @@ module RuboCop
|
|
|
58
104
|
# do_something if attrs.nil_safe_method(:[])
|
|
59
105
|
# do_something if attrs&.not_nil_safe_method(:[])
|
|
60
106
|
#
|
|
107
|
+
# @example InferNonNilReceiver: false (default)
|
|
108
|
+
# # good
|
|
109
|
+
# foo.bar
|
|
110
|
+
# foo&.baz
|
|
111
|
+
#
|
|
112
|
+
# @example InferNonNilReceiver: true
|
|
113
|
+
# # bad
|
|
114
|
+
# foo.bar
|
|
115
|
+
# foo&.baz # would raise on previous line if `foo` is nil
|
|
116
|
+
#
|
|
117
|
+
# # good
|
|
118
|
+
# foo.bar
|
|
119
|
+
# foo.baz
|
|
120
|
+
#
|
|
121
|
+
# # bad
|
|
122
|
+
# if foo.condition?
|
|
123
|
+
# foo&.bar
|
|
124
|
+
# end
|
|
125
|
+
#
|
|
126
|
+
# # good
|
|
127
|
+
# if foo.condition?
|
|
128
|
+
# foo.bar
|
|
129
|
+
# end
|
|
130
|
+
#
|
|
131
|
+
# # good (different scopes)
|
|
132
|
+
# def method1
|
|
133
|
+
# foo.bar
|
|
134
|
+
# end
|
|
135
|
+
#
|
|
136
|
+
# def method2
|
|
137
|
+
# foo&.bar
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# @example AdditionalNilMethods: [present?]
|
|
141
|
+
# # good
|
|
142
|
+
# foo.present?
|
|
143
|
+
# foo&.bar
|
|
144
|
+
#
|
|
61
145
|
class RedundantSafeNavigation < Base
|
|
62
146
|
include AllowedMethods
|
|
63
|
-
include RangeHelp
|
|
64
147
|
extend AutoCorrector
|
|
65
148
|
|
|
66
|
-
MSG = 'Redundant safe navigation detected.'
|
|
149
|
+
MSG = 'Redundant safe navigation detected, use `.` instead.'
|
|
150
|
+
MSG_LITERAL = 'Redundant safe navigation with default literal detected.'
|
|
151
|
+
MSG_NON_NIL = 'Redundant safe navigation on non-nil receiver (detected by analyzing ' \
|
|
152
|
+
'previous code/method invocations).'
|
|
67
153
|
|
|
68
154
|
NIL_SPECIFIC_METHODS = (nil.methods - Object.new.methods).to_set.freeze
|
|
69
155
|
|
|
70
156
|
SNAKE_CASE = /\A[[:digit:][:upper:]_]+\z/.freeze
|
|
71
157
|
|
|
158
|
+
GUARANTEED_INSTANCE_METHODS = %i[to_s to_i to_f to_a to_h].freeze
|
|
159
|
+
|
|
72
160
|
# @!method respond_to_nil_specific_method?(node)
|
|
73
161
|
def_node_matcher :respond_to_nil_specific_method?, <<~PATTERN
|
|
74
162
|
(csend _ :respond_to? (sym %NIL_SPECIFIC_METHODS))
|
|
75
163
|
PATTERN
|
|
76
164
|
|
|
165
|
+
# @!method conversion_with_default?(node)
|
|
166
|
+
def_node_matcher :conversion_with_default?, <<~PATTERN
|
|
167
|
+
{
|
|
168
|
+
(or $(csend _ :to_h) (hash))
|
|
169
|
+
(or (block $(csend _ :to_h) ...) (hash))
|
|
170
|
+
(or $(csend _ :to_a) (array))
|
|
171
|
+
(or $(csend _ :to_i) (int 0))
|
|
172
|
+
(or $(csend _ :to_f) (float 0.0))
|
|
173
|
+
(or $(csend _ :to_s) (str empty?))
|
|
174
|
+
}
|
|
175
|
+
PATTERN
|
|
176
|
+
|
|
77
177
|
# rubocop:disable Metrics/AbcSize
|
|
78
178
|
def on_csend(node)
|
|
79
|
-
|
|
80
|
-
|
|
179
|
+
range = node.loc.dot
|
|
180
|
+
|
|
181
|
+
if infer_non_nil_receiver?
|
|
182
|
+
checker = Lint::Utils::NilReceiverChecker.new(node.receiver, additional_nil_methods)
|
|
183
|
+
|
|
184
|
+
if checker.cant_be_nil?
|
|
185
|
+
add_offense(range, message: MSG_NON_NIL) { |corrector| corrector.replace(range, '.') }
|
|
186
|
+
return
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
unless assume_receiver_instance_exists?(node.receiver)
|
|
191
|
+
return if !guaranteed_instance?(node.receiver) && !check?(node)
|
|
81
192
|
return if respond_to_nil_specific_method?(node)
|
|
82
193
|
end
|
|
83
194
|
|
|
84
|
-
range
|
|
85
|
-
|
|
195
|
+
add_offense(range) { |corrector| corrector.replace(range, '.') }
|
|
196
|
+
end
|
|
197
|
+
# rubocop:enable Metrics/AbcSize
|
|
198
|
+
|
|
199
|
+
# rubocop:disable Metrics/AbcSize
|
|
200
|
+
def on_or(node)
|
|
201
|
+
conversion_with_default?(node) do |send_node|
|
|
202
|
+
range = send_node.loc.dot.begin.join(node.source_range.end)
|
|
203
|
+
|
|
204
|
+
add_offense(range, message: MSG_LITERAL) do |corrector|
|
|
205
|
+
corrector.replace(send_node.loc.dot, '.')
|
|
206
|
+
|
|
207
|
+
range_with_default = node.lhs.source_range.end.begin.join(node.source_range.end)
|
|
208
|
+
corrector.remove(range_with_default)
|
|
209
|
+
end
|
|
210
|
+
end
|
|
86
211
|
end
|
|
87
212
|
# rubocop:enable Metrics/AbcSize
|
|
88
213
|
|
|
89
214
|
private
|
|
90
215
|
|
|
216
|
+
def assume_receiver_instance_exists?(receiver)
|
|
217
|
+
return true if receiver.const_type? && !receiver.short_name.match?(SNAKE_CASE)
|
|
218
|
+
|
|
219
|
+
receiver.self_type? || (receiver.literal? && !receiver.nil_type?)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def guaranteed_instance?(node)
|
|
223
|
+
receiver = if node.any_block_type?
|
|
224
|
+
node.send_node
|
|
225
|
+
else
|
|
226
|
+
node
|
|
227
|
+
end
|
|
228
|
+
return false unless receiver.send_type?
|
|
229
|
+
|
|
230
|
+
GUARANTEED_INSTANCE_METHODS.include?(receiver.method_name)
|
|
231
|
+
end
|
|
232
|
+
|
|
91
233
|
def check?(node)
|
|
234
|
+
return false unless allowed_method?(node.method_name)
|
|
235
|
+
|
|
92
236
|
parent = node.parent
|
|
93
237
|
return false unless parent
|
|
94
238
|
|
|
95
239
|
condition?(parent, node) ||
|
|
96
|
-
parent.
|
|
97
|
-
parent.or_type? ||
|
|
240
|
+
parent.operator_keyword? ||
|
|
98
241
|
(parent.send_type? && parent.negation_method?)
|
|
99
242
|
end
|
|
100
243
|
|
|
101
244
|
def condition?(parent, node)
|
|
102
245
|
(parent.conditional? || parent.post_condition_loop?) && parent.condition == node
|
|
103
246
|
end
|
|
247
|
+
|
|
248
|
+
def infer_non_nil_receiver?
|
|
249
|
+
cop_config['InferNonNilReceiver']
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def additional_nil_methods
|
|
253
|
+
@additional_nil_methods ||=
|
|
254
|
+
Array(cop_config.fetch('AdditionalNilMethods', []).map(&:to_sym))
|
|
255
|
+
end
|
|
104
256
|
end
|
|
105
257
|
end
|
|
106
258
|
end
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Lint
|
|
6
|
-
# Checks for unneeded usages of splat expansion
|
|
6
|
+
# Checks for unneeded usages of splat expansion.
|
|
7
7
|
#
|
|
8
8
|
# @example
|
|
9
9
|
#
|
|
@@ -135,10 +135,10 @@ module RuboCop
|
|
|
135
135
|
grandparent.array_type? && grandparent.children.size > 1
|
|
136
136
|
end
|
|
137
137
|
|
|
138
|
+
# rubocop:disable Metrics/AbcSize
|
|
138
139
|
def replacement_range_and_content(node)
|
|
139
|
-
variable
|
|
140
|
-
|
|
141
|
-
expression = loc.expression
|
|
140
|
+
variable = node.children.first
|
|
141
|
+
expression = node.source_range
|
|
142
142
|
|
|
143
143
|
if array_new?(variable)
|
|
144
144
|
expression = node.parent.source_range if node.parent.array_type?
|
|
@@ -148,16 +148,17 @@ module RuboCop
|
|
|
148
148
|
elsif redundant_brackets?(node)
|
|
149
149
|
[expression, remove_brackets(variable)]
|
|
150
150
|
else
|
|
151
|
-
[loc.operator, '']
|
|
151
|
+
[node.loc.operator, '']
|
|
152
152
|
end
|
|
153
153
|
end
|
|
154
|
+
# rubocop:enable Metrics/AbcSize
|
|
154
155
|
|
|
155
156
|
def array_splat?(node)
|
|
156
157
|
node.children.first.array_type?
|
|
157
158
|
end
|
|
158
159
|
|
|
159
160
|
def method_argument?(node)
|
|
160
|
-
node.parent.
|
|
161
|
+
node.parent.call_type?
|
|
161
162
|
end
|
|
162
163
|
|
|
163
164
|
def part_of_an_array?(node)
|
|
@@ -171,7 +172,7 @@ module RuboCop
|
|
|
171
172
|
parent = node.parent
|
|
172
173
|
grandparent = node.parent.parent
|
|
173
174
|
|
|
174
|
-
parent.when_type? ||
|
|
175
|
+
parent.when_type? || method_argument?(node) || part_of_an_array?(node) ||
|
|
175
176
|
grandparent&.resbody_type?
|
|
176
177
|
end
|
|
177
178
|
|
|
@@ -196,7 +197,7 @@ module RuboCop
|
|
|
196
197
|
def use_percent_literal_array_argument?(node)
|
|
197
198
|
argument = node.children.first
|
|
198
199
|
|
|
199
|
-
node
|
|
200
|
+
method_argument?(node) &&
|
|
200
201
|
(argument.percent_literal?(:string) || argument.percent_literal?(:symbol))
|
|
201
202
|
end
|
|
202
203
|
|
|
@@ -9,16 +9,12 @@ module RuboCop
|
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
11
11
|
# # bad
|
|
12
|
-
#
|
|
13
12
|
# "result is #{something.to_s}"
|
|
14
13
|
# print something.to_s
|
|
15
14
|
# puts something.to_s
|
|
16
15
|
# warn something.to_s
|
|
17
16
|
#
|
|
18
|
-
# @example
|
|
19
|
-
#
|
|
20
17
|
# # good
|
|
21
|
-
#
|
|
22
18
|
# "result is #{something}"
|
|
23
19
|
# print something
|
|
24
20
|
# puts something
|
|
@@ -33,7 +29,7 @@ module RuboCop
|
|
|
33
29
|
RESTRICT_ON_SEND = %i[print puts warn].freeze
|
|
34
30
|
|
|
35
31
|
# @!method to_s_without_args?(node)
|
|
36
|
-
def_node_matcher :to_s_without_args?, '(
|
|
32
|
+
def_node_matcher :to_s_without_args?, '(call _ :to_s)'
|
|
37
33
|
|
|
38
34
|
def on_interpolation(begin_node)
|
|
39
35
|
final_node = begin_node.children.last
|
|
@@ -46,7 +42,7 @@ module RuboCop
|
|
|
46
42
|
def on_send(node)
|
|
47
43
|
return if node.receiver
|
|
48
44
|
|
|
49
|
-
node.each_child_node(:
|
|
45
|
+
node.each_child_node(:call) do |child|
|
|
50
46
|
next if !child.method?(:to_s) || child.arguments.any?
|
|
51
47
|
|
|
52
48
|
register_offense(child, "`#{node.method_name}`")
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# Checks for redundant uses of `to_s`, `to_sym`, `to_i`, `to_f`, `to_d`, `to_r`, `to_c`,
|
|
7
|
+
# `to_a`, `to_h`, and `to_set`.
|
|
8
|
+
#
|
|
9
|
+
# When one of these methods is called on an object of the same type, that object
|
|
10
|
+
# is returned, making the call unnecessary. The cop detects conversion methods called
|
|
11
|
+
# on object literals, class constructors, class `[]` methods, and the `Kernel` methods
|
|
12
|
+
# `String()`, `Integer()`, `Float()`, BigDecimal(), `Rational()`, `Complex()`, and `Array()`.
|
|
13
|
+
#
|
|
14
|
+
# Specifically, these cases are detected for each conversion method:
|
|
15
|
+
#
|
|
16
|
+
# * `to_s` when called on a string literal, interpolated string, heredoc,
|
|
17
|
+
# or with `String.new` or `String()`.
|
|
18
|
+
# * `to_sym` when called on a symbol literal or interpolated symbol.
|
|
19
|
+
# * `to_i` when called on an integer literal or with `Integer()`.
|
|
20
|
+
# * `to_f` when called on a float literal of with `Float()`.
|
|
21
|
+
# * `to_r` when called on a rational literal or with `Rational()`.
|
|
22
|
+
# * `to_c` when called on a complex literal of with `Complex()`.
|
|
23
|
+
# * `to_a` when called on an array literal, or with `Array.new`, `Array()` or `Array[]`.
|
|
24
|
+
# * `to_h` when called on a hash literal, or with `Hash.new`, `Hash()` or `Hash[]`.
|
|
25
|
+
# * `to_set` when called on `Set.new` or `Set[]`.
|
|
26
|
+
#
|
|
27
|
+
# In all cases, chaining one same `to_*` conversion methods listed above is redundant.
|
|
28
|
+
#
|
|
29
|
+
# The cop can also register an offense for chaining conversion methods on methods that are
|
|
30
|
+
# expected to return a specific type regardless of receiver (eg. `foo.inspect.to_s` and
|
|
31
|
+
# `foo.to_json.to_s`).
|
|
32
|
+
#
|
|
33
|
+
# @example
|
|
34
|
+
# # bad
|
|
35
|
+
# "text".to_s
|
|
36
|
+
# :sym.to_sym
|
|
37
|
+
# 42.to_i
|
|
38
|
+
# 8.5.to_f
|
|
39
|
+
# 12r.to_r
|
|
40
|
+
# 1i.to_c
|
|
41
|
+
# [].to_a
|
|
42
|
+
# {}.to_h
|
|
43
|
+
# Set.new.to_set
|
|
44
|
+
#
|
|
45
|
+
# # good
|
|
46
|
+
# "text"
|
|
47
|
+
# :sym
|
|
48
|
+
# 42
|
|
49
|
+
# 8.5
|
|
50
|
+
# 12r
|
|
51
|
+
# 1i
|
|
52
|
+
# []
|
|
53
|
+
# {}
|
|
54
|
+
# Set.new
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# Integer(var).to_i
|
|
58
|
+
#
|
|
59
|
+
# # good
|
|
60
|
+
# Integer(var)
|
|
61
|
+
#
|
|
62
|
+
# # good - chaining to a type constructor with exceptions suppressed
|
|
63
|
+
# # in this case, `Integer()` could return `nil`
|
|
64
|
+
# Integer(var, exception: false).to_i
|
|
65
|
+
#
|
|
66
|
+
# # bad - chaining the same conversion
|
|
67
|
+
# foo.to_s.to_s
|
|
68
|
+
#
|
|
69
|
+
# # good
|
|
70
|
+
# foo.to_s
|
|
71
|
+
#
|
|
72
|
+
# # bad - chaining a conversion to a method that is expected to return the same type
|
|
73
|
+
# foo.inspect.to_s
|
|
74
|
+
# foo.to_json.to_s
|
|
75
|
+
#
|
|
76
|
+
# # good
|
|
77
|
+
# foo.inspect
|
|
78
|
+
# foo.to_json
|
|
79
|
+
#
|
|
80
|
+
class RedundantTypeConversion < Base
|
|
81
|
+
extend AutoCorrector
|
|
82
|
+
|
|
83
|
+
MSG = 'Redundant `%<method>s` detected.'
|
|
84
|
+
|
|
85
|
+
# Maps conversion methods to the node types for the literals of that type
|
|
86
|
+
LITERAL_NODE_TYPES = {
|
|
87
|
+
to_s: %i[str dstr],
|
|
88
|
+
to_sym: %i[sym dsym],
|
|
89
|
+
to_i: %i[int],
|
|
90
|
+
to_f: %i[float],
|
|
91
|
+
to_r: %i[rational],
|
|
92
|
+
to_c: %i[complex],
|
|
93
|
+
to_a: %i[array],
|
|
94
|
+
to_h: %i[hash],
|
|
95
|
+
to_set: [] # sets don't have a literal or node type
|
|
96
|
+
}.freeze
|
|
97
|
+
|
|
98
|
+
# Maps each conversion method to the pattern matcher for that type's constructors
|
|
99
|
+
# Not every type has a constructor, for instance Symbol.
|
|
100
|
+
CONSTRUCTOR_MAPPING = {
|
|
101
|
+
to_s: 'string_constructor?',
|
|
102
|
+
to_i: 'integer_constructor?',
|
|
103
|
+
to_f: 'float_constructor?',
|
|
104
|
+
to_d: 'bigdecimal_constructor?',
|
|
105
|
+
to_r: 'rational_constructor?',
|
|
106
|
+
to_c: 'complex_constructor?',
|
|
107
|
+
to_a: 'array_constructor?',
|
|
108
|
+
to_h: 'hash_constructor?',
|
|
109
|
+
to_set: 'set_constructor?'
|
|
110
|
+
}.freeze
|
|
111
|
+
|
|
112
|
+
# Methods that already are expected to return a given type, which makes a further
|
|
113
|
+
# conversion redundant.
|
|
114
|
+
TYPED_METHODS = { to_s: %i[inspect to_json] }.freeze
|
|
115
|
+
|
|
116
|
+
CONVERSION_METHODS = Set[*LITERAL_NODE_TYPES.keys].freeze
|
|
117
|
+
RESTRICT_ON_SEND = CONVERSION_METHODS + [:to_d]
|
|
118
|
+
|
|
119
|
+
private_constant :LITERAL_NODE_TYPES, :CONSTRUCTOR_MAPPING
|
|
120
|
+
|
|
121
|
+
# @!method type_constructor?(node, type_symbol)
|
|
122
|
+
def_node_matcher :type_constructor?, <<~PATTERN
|
|
123
|
+
(send {nil? (const {cbase nil?} :Kernel)} %1 ...)
|
|
124
|
+
PATTERN
|
|
125
|
+
|
|
126
|
+
# @!method string_constructor?(node)
|
|
127
|
+
def_node_matcher :string_constructor?, <<~PATTERN
|
|
128
|
+
{
|
|
129
|
+
(send (const {cbase nil?} :String) :new ...)
|
|
130
|
+
#type_constructor?(:String)
|
|
131
|
+
}
|
|
132
|
+
PATTERN
|
|
133
|
+
|
|
134
|
+
# @!method integer_constructor?(node)
|
|
135
|
+
def_node_matcher :integer_constructor?, <<~PATTERN
|
|
136
|
+
#type_constructor?(:Integer)
|
|
137
|
+
PATTERN
|
|
138
|
+
|
|
139
|
+
# @!method float_constructor?(node)
|
|
140
|
+
def_node_matcher :float_constructor?, <<~PATTERN
|
|
141
|
+
#type_constructor?(:Float)
|
|
142
|
+
PATTERN
|
|
143
|
+
|
|
144
|
+
# @!method bigdecimal_constructor?(node)
|
|
145
|
+
def_node_matcher :bigdecimal_constructor?, <<~PATTERN
|
|
146
|
+
#type_constructor?(:BigDecimal)
|
|
147
|
+
PATTERN
|
|
148
|
+
|
|
149
|
+
# @!method rational_constructor?(node)
|
|
150
|
+
def_node_matcher :rational_constructor?, <<~PATTERN
|
|
151
|
+
#type_constructor?(:Rational)
|
|
152
|
+
PATTERN
|
|
153
|
+
|
|
154
|
+
# @!method complex_constructor?(node)
|
|
155
|
+
def_node_matcher :complex_constructor?, <<~PATTERN
|
|
156
|
+
#type_constructor?(:Complex)
|
|
157
|
+
PATTERN
|
|
158
|
+
|
|
159
|
+
# @!method array_constructor?(node)
|
|
160
|
+
def_node_matcher :array_constructor?, <<~PATTERN
|
|
161
|
+
{
|
|
162
|
+
(send (const {cbase nil?} :Array) {:new :[]} ...)
|
|
163
|
+
#type_constructor?(:Array)
|
|
164
|
+
}
|
|
165
|
+
PATTERN
|
|
166
|
+
|
|
167
|
+
# @!method hash_constructor?(node)
|
|
168
|
+
def_node_matcher :hash_constructor?, <<~PATTERN
|
|
169
|
+
{
|
|
170
|
+
(block (send (const {cbase nil?} :Hash) :new) ...)
|
|
171
|
+
(send (const {cbase nil?} :Hash) {:new :[]} ...)
|
|
172
|
+
(send {nil? (const {cbase nil?} :Kernel)} :Hash ...)
|
|
173
|
+
}
|
|
174
|
+
PATTERN
|
|
175
|
+
|
|
176
|
+
# @!method set_constructor?(node)
|
|
177
|
+
def_node_matcher :set_constructor?, <<~PATTERN
|
|
178
|
+
{
|
|
179
|
+
(send (const {cbase nil?} :Set) {:new :[]} ...)
|
|
180
|
+
}
|
|
181
|
+
PATTERN
|
|
182
|
+
|
|
183
|
+
# @!method exception_false_keyword_argument?(node)
|
|
184
|
+
def_node_matcher :exception_false_keyword_argument?, <<~PATTERN
|
|
185
|
+
(hash (pair (sym :exception) false))
|
|
186
|
+
PATTERN
|
|
187
|
+
|
|
188
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
189
|
+
def on_send(node)
|
|
190
|
+
return if node.arguments.any? || hash_or_set_with_block?(node)
|
|
191
|
+
|
|
192
|
+
receiver = find_receiver(node)
|
|
193
|
+
return unless literal_receiver?(node, receiver) ||
|
|
194
|
+
constructor?(node, receiver) ||
|
|
195
|
+
chained_conversion?(node, receiver) ||
|
|
196
|
+
chained_to_typed_method?(node, receiver)
|
|
197
|
+
|
|
198
|
+
message = format(MSG, method: node.method_name)
|
|
199
|
+
|
|
200
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
|
201
|
+
corrector.remove(node.loc.dot.join(node.loc.end || node.loc.selector))
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
205
|
+
alias on_csend on_send
|
|
206
|
+
|
|
207
|
+
private
|
|
208
|
+
|
|
209
|
+
def hash_or_set_with_block?(node)
|
|
210
|
+
return false if !node.method?(:to_h) && !node.method?(:to_set)
|
|
211
|
+
|
|
212
|
+
node.parent&.any_block_type? || node.last_argument&.block_pass_type?
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def find_receiver(node)
|
|
216
|
+
receiver = node.receiver
|
|
217
|
+
return unless receiver
|
|
218
|
+
|
|
219
|
+
while receiver.begin_type?
|
|
220
|
+
break unless receiver.children.one?
|
|
221
|
+
|
|
222
|
+
receiver = receiver.children.first
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
receiver
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def literal_receiver?(node, receiver)
|
|
229
|
+
return false unless receiver
|
|
230
|
+
|
|
231
|
+
receiver.type?(*LITERAL_NODE_TYPES[node.method_name])
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def constructor?(node, receiver)
|
|
235
|
+
matcher = CONSTRUCTOR_MAPPING[node.method_name]
|
|
236
|
+
return false unless matcher
|
|
237
|
+
|
|
238
|
+
public_send(matcher, receiver) && !constructor_suppresses_exceptions?(receiver)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def constructor_suppresses_exceptions?(receiver)
|
|
242
|
+
# If the constructor suppresses exceptions with `exception: false`, it is possible
|
|
243
|
+
# it could return `nil`, and therefore a chained conversion is not redundant.
|
|
244
|
+
receiver.arguments.any? { |arg| exception_false_keyword_argument?(arg) }
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def chained_conversion?(node, receiver)
|
|
248
|
+
return false unless receiver&.call_type?
|
|
249
|
+
|
|
250
|
+
receiver.method?(node.method_name)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def chained_to_typed_method?(node, receiver)
|
|
254
|
+
return false unless receiver&.call_type?
|
|
255
|
+
|
|
256
|
+
TYPED_METHODS.fetch(node.method_name, []).include?(receiver.method_name)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
@@ -33,7 +33,10 @@ module RuboCop
|
|
|
33
33
|
MSG_EACH_WITH_INDEX = 'Use `each` instead of `each_with_index`.'
|
|
34
34
|
MSG_WITH_INDEX = 'Remove redundant `with_index`.'
|
|
35
35
|
|
|
36
|
+
# rubocop:disable Metrics/AbcSize
|
|
36
37
|
def on_block(node)
|
|
38
|
+
return unless node.receiver
|
|
39
|
+
return if node.method?(:with_index) && !node.receiver.receiver
|
|
37
40
|
return unless (send = redundant_with_index?(node))
|
|
38
41
|
|
|
39
42
|
range = with_index_range(send)
|
|
@@ -47,8 +50,10 @@ module RuboCop
|
|
|
47
50
|
end
|
|
48
51
|
end
|
|
49
52
|
end
|
|
53
|
+
# rubocop:enable Metrics/AbcSize
|
|
50
54
|
|
|
51
55
|
alias on_numblock on_block
|
|
56
|
+
alias on_itblock on_block
|
|
52
57
|
|
|
53
58
|
private
|
|
54
59
|
|
|
@@ -56,10 +61,12 @@ module RuboCop
|
|
|
56
61
|
def_node_matcher :redundant_with_index?, <<~PATTERN
|
|
57
62
|
{
|
|
58
63
|
(block
|
|
59
|
-
$(
|
|
64
|
+
$(call _ {:each_with_index :with_index} ...)
|
|
60
65
|
(args (arg _)) ...)
|
|
61
66
|
(numblock
|
|
62
|
-
$(
|
|
67
|
+
$(call _ {:each_with_index :with_index} ...) 1 ...)
|
|
68
|
+
(itblock
|
|
69
|
+
$(call _ {:each_with_index :with_index} ...) _ ...)
|
|
63
70
|
}
|
|
64
71
|
PATTERN
|
|
65
72
|
|
|
@@ -49,6 +49,7 @@ module RuboCop
|
|
|
49
49
|
end
|
|
50
50
|
|
|
51
51
|
alias on_numblock on_block
|
|
52
|
+
alias on_itblock on_block
|
|
52
53
|
|
|
53
54
|
private
|
|
54
55
|
|
|
@@ -56,9 +57,11 @@ module RuboCop
|
|
|
56
57
|
def_node_matcher :redundant_with_object?, <<~PATTERN
|
|
57
58
|
{
|
|
58
59
|
(block
|
|
59
|
-
$(
|
|
60
|
+
$(call _ {:each_with_object :with_object} _) (args (arg _)) ...)
|
|
60
61
|
(numblock
|
|
61
|
-
$(
|
|
62
|
+
$(call _ {:each_with_object :with_object} _) 1 ...)
|
|
63
|
+
(itblock
|
|
64
|
+
$(call _ {:each_with_object :with_object} _) _ ...)
|
|
62
65
|
}
|
|
63
66
|
PATTERN
|
|
64
67
|
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Checks if `include` or `prepend` is called in `refine` block.
|
|
7
7
|
# These methods are deprecated and should be replaced with `Refinement#import_methods`.
|
|
8
8
|
#
|
|
9
|
-
# It emulates deprecation warnings in Ruby 3.1.
|
|
9
|
+
# It emulates deprecation warnings in Ruby 3.1. Functionality has been removed in Ruby 3.2.
|
|
10
10
|
#
|
|
11
11
|
# @safety
|
|
12
12
|
# This cop's autocorrection is unsafe because `include M` will affect the included class
|