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
|
@@ -29,9 +29,10 @@ module RuboCop
|
|
|
29
29
|
def on_hash(node)
|
|
30
30
|
return if node.pairs.empty? || node.pairs.any?(&:hash_rocket?)
|
|
31
31
|
return unless (parent = node.parent)
|
|
32
|
-
return
|
|
32
|
+
return unless parent.type?(:call, :kwsplat)
|
|
33
|
+
return unless mergeable?(parent)
|
|
33
34
|
return unless (kwsplat = node.each_ancestor(:kwsplat).first)
|
|
34
|
-
return if allowed_double_splat_receiver?(kwsplat)
|
|
35
|
+
return if !node.braces? || allowed_double_splat_receiver?(kwsplat)
|
|
35
36
|
|
|
36
37
|
add_offense(kwsplat) do |corrector|
|
|
37
38
|
autocorrect(corrector, node, kwsplat)
|
|
@@ -42,9 +43,11 @@ module RuboCop
|
|
|
42
43
|
private
|
|
43
44
|
|
|
44
45
|
def allowed_double_splat_receiver?(kwsplat)
|
|
45
|
-
|
|
46
|
+
first_child = kwsplat.children.first
|
|
47
|
+
return true if first_child.any_block_type?
|
|
48
|
+
return false unless first_child.call_type?
|
|
46
49
|
|
|
47
|
-
root_receiver = root_receiver(
|
|
50
|
+
root_receiver = root_receiver(first_child)
|
|
48
51
|
|
|
49
52
|
!root_receiver&.hash_type?
|
|
50
53
|
end
|
|
@@ -70,8 +73,8 @@ module RuboCop
|
|
|
70
73
|
end
|
|
71
74
|
|
|
72
75
|
def select_merge_method_nodes(kwsplat)
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
kwsplat.each_descendant(:call).select do |node|
|
|
77
|
+
mergeable?(node)
|
|
75
78
|
end
|
|
76
79
|
end
|
|
77
80
|
|
|
@@ -86,7 +89,7 @@ module RuboCop
|
|
|
86
89
|
def autocorrect_merge_methods(corrector, merge_methods, kwsplat)
|
|
87
90
|
range = range_of_merge_methods(merge_methods)
|
|
88
91
|
|
|
89
|
-
new_kwsplat_arguments =
|
|
92
|
+
new_kwsplat_arguments = kwsplat.each_descendant(:call).map do |descendant|
|
|
90
93
|
convert_to_new_arguments(descendant)
|
|
91
94
|
end
|
|
92
95
|
new_source = new_kwsplat_arguments.compact.reverse.unshift('').join(', ')
|
|
@@ -101,12 +104,8 @@ module RuboCop
|
|
|
101
104
|
begin_merge_method.loc.dot.begin.join(end_merge_method.source_range.end)
|
|
102
105
|
end
|
|
103
106
|
|
|
104
|
-
def extract_send_methods(kwsplat)
|
|
105
|
-
kwsplat.each_descendant(:send, :csend)
|
|
106
|
-
end
|
|
107
|
-
|
|
108
107
|
def convert_to_new_arguments(node)
|
|
109
|
-
return unless
|
|
108
|
+
return unless mergeable?(node)
|
|
110
109
|
|
|
111
110
|
node.arguments.map do |arg|
|
|
112
111
|
if arg.hash_type?
|
|
@@ -117,8 +116,12 @@ module RuboCop
|
|
|
117
116
|
end
|
|
118
117
|
end
|
|
119
118
|
|
|
120
|
-
def
|
|
121
|
-
|
|
119
|
+
def mergeable?(node)
|
|
120
|
+
return true unless node.call_type?
|
|
121
|
+
return false unless MERGE_METHODS.include?(node.method_name)
|
|
122
|
+
return true unless (parent = node.parent)
|
|
123
|
+
|
|
124
|
+
mergeable?(parent)
|
|
122
125
|
end
|
|
123
126
|
end
|
|
124
127
|
end
|
|
@@ -56,6 +56,7 @@ module RuboCop
|
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
|
+
alias on_csend on_send
|
|
59
60
|
|
|
60
61
|
private
|
|
61
62
|
|
|
@@ -64,7 +65,7 @@ module RuboCop
|
|
|
64
65
|
return if node.last_argument&.block_pass_type?
|
|
65
66
|
|
|
66
67
|
if node.method?(:each) && !node.parent&.block_type?
|
|
67
|
-
ancestor_node = node.each_ancestor(:
|
|
68
|
+
ancestor_node = node.each_ancestor(:call).detect do |ancestor|
|
|
68
69
|
ancestor.receiver == node &&
|
|
69
70
|
(RESTRICT_ON_SEND.include?(ancestor.method_name) || ancestor.method?(:reverse_each))
|
|
70
71
|
end
|
|
@@ -83,10 +84,12 @@ module RuboCop
|
|
|
83
84
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
84
85
|
|
|
85
86
|
def range(node)
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
return node.selector unless node.method?(:each)
|
|
88
|
+
|
|
89
|
+
if node.parent&.call_type?
|
|
90
|
+
node.selector.join(node.parent.loc.dot)
|
|
88
91
|
else
|
|
89
|
-
node.loc.selector
|
|
92
|
+
node.loc.dot.join(node.selector)
|
|
90
93
|
end
|
|
91
94
|
end
|
|
92
95
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for RuntimeError as the argument of raise
|
|
6
|
+
# Checks for `RuntimeError` as the argument of `raise`/`fail`.
|
|
7
7
|
#
|
|
8
8
|
# @example
|
|
9
9
|
# # bad
|
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def string_message?(message)
|
|
54
|
-
message.
|
|
54
|
+
message.any_str_type?
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
def fix_compact(node)
|
|
@@ -47,9 +47,9 @@ module RuboCop
|
|
|
47
47
|
# @!method redundant_fetch_block_candidate?(node)
|
|
48
48
|
def_node_matcher :redundant_fetch_block_candidate?, <<~PATTERN
|
|
49
49
|
(block
|
|
50
|
-
$(
|
|
50
|
+
$(call _ :fetch _)
|
|
51
51
|
(args)
|
|
52
|
-
${nil?
|
|
52
|
+
${nil? basic_literal? const_type?})
|
|
53
53
|
PATTERN
|
|
54
54
|
|
|
55
55
|
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
|
|
@@ -61,24 +61,16 @@ module RuboCop
|
|
|
61
61
|
bad = build_bad_method(send, body)
|
|
62
62
|
|
|
63
63
|
add_offense(range, message: format(MSG, good: good, bad: bad)) do |corrector|
|
|
64
|
-
|
|
64
|
+
_, _, key = send.children
|
|
65
65
|
default_value = body ? body.source : 'nil'
|
|
66
66
|
|
|
67
|
-
corrector.replace(
|
|
67
|
+
corrector.replace(range, "fetch(#{key.source}, #{default_value})")
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
private
|
|
73
73
|
|
|
74
|
-
def basic_literal?(node)
|
|
75
|
-
node&.basic_literal?
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def const_type?(node)
|
|
79
|
-
node&.const_type?
|
|
80
|
-
end
|
|
81
|
-
|
|
82
74
|
def should_not_check?(send, body)
|
|
83
75
|
(body&.const_type? && !check_for_constant?) ||
|
|
84
76
|
(body&.str_type? && !check_for_string?) ||
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Checks for the presence of superfluous `.rb` extension in
|
|
7
7
|
# the filename provided to `require` and `require_relative`.
|
|
8
8
|
#
|
|
9
|
-
#
|
|
9
|
+
# NOTE: If the extension is omitted, Ruby tries adding '.rb', '.so',
|
|
10
10
|
# and so on to the name until found. If the file named cannot be found,
|
|
11
11
|
# a `LoadError` will be raised.
|
|
12
12
|
# There is an edge case where `foo.so` file is loaded instead of a `LoadError`
|
|
@@ -60,10 +60,10 @@ module RuboCop
|
|
|
60
60
|
|
|
61
61
|
# @!method select_predicate?(node)
|
|
62
62
|
def_node_matcher :select_predicate?, <<~PATTERN
|
|
63
|
-
(
|
|
63
|
+
(call
|
|
64
64
|
{
|
|
65
|
-
(block $(
|
|
66
|
-
$(
|
|
65
|
+
(block $(call _ {:select :filter :find_all}) ...)
|
|
66
|
+
$(call _ {:select :filter :find_all} block_pass_type?)
|
|
67
67
|
}
|
|
68
68
|
${:#{RESTRICT_ON_SEND.join(' :')}})
|
|
69
69
|
PATTERN
|
|
@@ -79,7 +79,7 @@ module RuboCop
|
|
|
79
79
|
private_constant :REPLACEMENT_METHODS
|
|
80
80
|
|
|
81
81
|
def on_send(node)
|
|
82
|
-
return if node.arguments? || node.
|
|
82
|
+
return if node.arguments? || node.block_literal?
|
|
83
83
|
|
|
84
84
|
select_predicate?(node) do |select_node, filter_method|
|
|
85
85
|
return if RAILS_METHODS.include?(filter_method) && !active_support_extensions_enabled?
|
|
@@ -87,6 +87,7 @@ module RuboCop
|
|
|
87
87
|
register_offense(select_node, node)
|
|
88
88
|
end
|
|
89
89
|
end
|
|
90
|
+
alias on_csend on_send
|
|
90
91
|
|
|
91
92
|
private
|
|
92
93
|
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Checks for calls to `Kernel#format` or `Kernel#sprintf` that are redundant.
|
|
7
|
+
#
|
|
8
|
+
# Calling `format` with only a single string or constant argument is redundant,
|
|
9
|
+
# as it can be replaced by the string or constant itself.
|
|
10
|
+
#
|
|
11
|
+
# Also looks for `format` calls where the arguments are literals that can be
|
|
12
|
+
# inlined into a string easily. This applies to the `%s`, `%d`, `%i`, `%u`, and
|
|
13
|
+
# `%f` format specifiers.
|
|
14
|
+
#
|
|
15
|
+
# @safety
|
|
16
|
+
# This cop's autocorrection is unsafe because string object returned by
|
|
17
|
+
# `format` and `sprintf` are never frozen. If `format('string')` is autocorrected to
|
|
18
|
+
# `'string'`, `FrozenError` may occur when calling a destructive method like `String#<<`.
|
|
19
|
+
# Consider using `'string'.dup` instead of `format('string')`.
|
|
20
|
+
# Additionally, since the necessity of `dup` cannot be determined automatically,
|
|
21
|
+
# this autocorrection is inherently unsafe.
|
|
22
|
+
#
|
|
23
|
+
# [source,ruby]
|
|
24
|
+
# ----
|
|
25
|
+
# # frozen_string_literal: true
|
|
26
|
+
#
|
|
27
|
+
# format('template').frozen? # => false
|
|
28
|
+
# 'template'.frozen? # => true
|
|
29
|
+
# ----
|
|
30
|
+
#
|
|
31
|
+
# @example
|
|
32
|
+
#
|
|
33
|
+
# # bad
|
|
34
|
+
# format('the quick brown fox jumps over the lazy dog.')
|
|
35
|
+
# sprintf('the quick brown fox jumps over the lazy dog.')
|
|
36
|
+
#
|
|
37
|
+
# # good
|
|
38
|
+
# 'the quick brown fox jumps over the lazy dog.'
|
|
39
|
+
#
|
|
40
|
+
# # bad
|
|
41
|
+
# format(MESSAGE)
|
|
42
|
+
# sprintf(MESSAGE)
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# MESSAGE
|
|
46
|
+
#
|
|
47
|
+
# # bad
|
|
48
|
+
# format('%s %s', 'foo', 'bar')
|
|
49
|
+
# sprintf('%s %s', 'foo', 'bar')
|
|
50
|
+
#
|
|
51
|
+
# # good
|
|
52
|
+
# 'foo bar'
|
|
53
|
+
#
|
|
54
|
+
class RedundantFormat < Base
|
|
55
|
+
extend AutoCorrector
|
|
56
|
+
|
|
57
|
+
MSG = 'Use `%<prefer>s` directly instead of `%<method_name>s`.'
|
|
58
|
+
|
|
59
|
+
RESTRICT_ON_SEND = %i[format sprintf].to_set.freeze
|
|
60
|
+
ACCEPTABLE_LITERAL_TYPES = %i[str dstr sym dsym numeric boolean nil].freeze
|
|
61
|
+
|
|
62
|
+
# @!method format_without_additional_args?(node)
|
|
63
|
+
def_node_matcher :format_without_additional_args?, <<~PATTERN
|
|
64
|
+
(send {(const {nil? cbase} :Kernel) nil?} %RESTRICT_ON_SEND ${str dstr const})
|
|
65
|
+
PATTERN
|
|
66
|
+
|
|
67
|
+
# @!method rational_number?(node)
|
|
68
|
+
def_node_matcher :rational_number?, <<~PATTERN
|
|
69
|
+
{rational (send int :/ rational) (begin rational) (begin (send int :/ rational))}
|
|
70
|
+
PATTERN
|
|
71
|
+
|
|
72
|
+
# @!method complex_number?(node)
|
|
73
|
+
def_node_matcher :complex_number?, <<~PATTERN
|
|
74
|
+
{complex (send int :+ complex) (begin complex) (begin (send int :+ complex))}
|
|
75
|
+
PATTERN
|
|
76
|
+
|
|
77
|
+
# @!method find_hash_value_node(node, name)
|
|
78
|
+
def_node_search :find_hash_value_node, <<~PATTERN
|
|
79
|
+
(pair (sym %1) $_)
|
|
80
|
+
PATTERN
|
|
81
|
+
|
|
82
|
+
# @!method splatted_arguments?(node)
|
|
83
|
+
def_node_matcher :splatted_arguments?, <<~PATTERN
|
|
84
|
+
(send _ %RESTRICT_ON_SEND <{
|
|
85
|
+
splat
|
|
86
|
+
(hash <kwsplat ...>)
|
|
87
|
+
} ...>)
|
|
88
|
+
PATTERN
|
|
89
|
+
|
|
90
|
+
def on_send(node)
|
|
91
|
+
format_without_additional_args?(node) do |value|
|
|
92
|
+
replacement = escape_control_chars(value.source)
|
|
93
|
+
|
|
94
|
+
add_offense(node, message: message(node, replacement)) do |corrector|
|
|
95
|
+
corrector.replace(node, replacement)
|
|
96
|
+
end
|
|
97
|
+
return
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
detect_unnecessary_fields(node)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
private
|
|
104
|
+
|
|
105
|
+
def message(node, prefer)
|
|
106
|
+
format(MSG, prefer: prefer, method_name: node.method_name)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def detect_unnecessary_fields(node)
|
|
110
|
+
return unless node.first_argument&.str_type?
|
|
111
|
+
|
|
112
|
+
string = node.first_argument.value
|
|
113
|
+
arguments = node.arguments[1..]
|
|
114
|
+
|
|
115
|
+
return unless string && arguments.any?
|
|
116
|
+
return if splatted_arguments?(node)
|
|
117
|
+
|
|
118
|
+
register_all_fields_literal(node, string, arguments)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def register_all_fields_literal(node, string, arguments)
|
|
122
|
+
return unless all_fields_literal?(string, arguments.dup)
|
|
123
|
+
|
|
124
|
+
format_arguments = argument_values(arguments)
|
|
125
|
+
begin
|
|
126
|
+
formatted_string = format(string, *format_arguments)
|
|
127
|
+
rescue ArgumentError
|
|
128
|
+
return
|
|
129
|
+
end
|
|
130
|
+
replacement = quote(formatted_string, node)
|
|
131
|
+
|
|
132
|
+
add_offense(node, message: message(node, replacement)) do |corrector|
|
|
133
|
+
corrector.replace(node, replacement)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
138
|
+
def all_fields_literal?(string, arguments)
|
|
139
|
+
count = 0
|
|
140
|
+
sequences = RuboCop::Cop::Utils::FormatString.new(string).format_sequences
|
|
141
|
+
return false unless sequences.any?
|
|
142
|
+
|
|
143
|
+
sequences.each do |sequence|
|
|
144
|
+
next if sequence.percent?
|
|
145
|
+
next if unknown_variable_width?(sequence, arguments)
|
|
146
|
+
|
|
147
|
+
hash = arguments.detect(&:hash_type?)
|
|
148
|
+
next unless (argument = find_argument(sequence, arguments, hash))
|
|
149
|
+
next unless matching_argument?(sequence, argument)
|
|
150
|
+
next if (sequence.width || sequence.precision) && argument.dstr_type?
|
|
151
|
+
|
|
152
|
+
count += 1
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
sequences.size == count
|
|
156
|
+
end
|
|
157
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
158
|
+
|
|
159
|
+
# If the sequence has a variable (`*`) width, it cannot be autocorrected
|
|
160
|
+
# if the width is not given as a numeric literal argument
|
|
161
|
+
def unknown_variable_width?(sequence, arguments)
|
|
162
|
+
return false unless sequence.variable_width?
|
|
163
|
+
|
|
164
|
+
argument = arguments[sequence.variable_width_argument_number - 1]
|
|
165
|
+
!numeric?(argument)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# rubocop:disable Metrics/AbcSize
|
|
169
|
+
def find_argument(sequence, arguments, hash)
|
|
170
|
+
if hash && (sequence.annotated? || sequence.template?)
|
|
171
|
+
find_hash_value_node(hash, sequence.name.to_sym).first
|
|
172
|
+
elsif sequence.variable_width?
|
|
173
|
+
# If the specifier contains `*`, the argument for the width can be ignored.
|
|
174
|
+
arguments.delete_at(sequence.variable_width_argument_number - 1)
|
|
175
|
+
arguments.shift
|
|
176
|
+
elsif sequence.arg_number
|
|
177
|
+
arguments[sequence.arg_number.to_i - 1]
|
|
178
|
+
else
|
|
179
|
+
arguments.shift
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
# rubocop:enable Metrics/AbcSize
|
|
183
|
+
|
|
184
|
+
def matching_argument?(sequence, argument)
|
|
185
|
+
# Template specifiers don't give a type, any acceptable literal type is ok.
|
|
186
|
+
return argument.type?(*ACCEPTABLE_LITERAL_TYPES) if sequence.template?
|
|
187
|
+
|
|
188
|
+
# An argument matches a specifier if it can be easily converted
|
|
189
|
+
# to that type.
|
|
190
|
+
case sequence.type
|
|
191
|
+
when 's'
|
|
192
|
+
argument.type?(*ACCEPTABLE_LITERAL_TYPES)
|
|
193
|
+
when 'd', 'i', 'u'
|
|
194
|
+
integer?(argument)
|
|
195
|
+
when 'f'
|
|
196
|
+
float?(argument)
|
|
197
|
+
else
|
|
198
|
+
false
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def numeric?(argument)
|
|
203
|
+
argument.type?(:numeric, :str) ||
|
|
204
|
+
rational_number?(argument) ||
|
|
205
|
+
complex_number?(argument)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def integer?(argument)
|
|
209
|
+
numeric?(argument) && Integer(argument_value(argument), exception: false)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def float?(argument)
|
|
213
|
+
numeric?(argument) && Float(argument_value(argument), exception: false)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Add correct quotes to the formatted string, preferring retaining the existing
|
|
217
|
+
# quotes if possible.
|
|
218
|
+
def quote(string, node)
|
|
219
|
+
str_node = node.first_argument
|
|
220
|
+
start_delimiter = str_node.loc.begin.source
|
|
221
|
+
end_delimiter = str_node.loc.end.source
|
|
222
|
+
|
|
223
|
+
# If there is any interpolation, the delimiters need to be changed potentially
|
|
224
|
+
if node.each_descendant(:dstr, :dsym).any?
|
|
225
|
+
case start_delimiter
|
|
226
|
+
when "'"
|
|
227
|
+
start_delimiter = end_delimiter = '"'
|
|
228
|
+
when /\A%q(.)/
|
|
229
|
+
start_delimiter = "%Q#{Regexp.last_match[1]}"
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
"#{start_delimiter}#{escape_control_chars(string)}#{end_delimiter}"
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Escape any control characters in the string (eg. `\t` or `\n` become `\\t` or `\\n`)
|
|
237
|
+
def escape_control_chars(string)
|
|
238
|
+
string.gsub(/\p{Cc}/) { |s| s.dump[1..-2] }
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def argument_values(arguments)
|
|
242
|
+
arguments.map { |argument| argument_value(argument) }
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def argument_value(argument)
|
|
246
|
+
argument = argument.children.first if argument.begin_type?
|
|
247
|
+
|
|
248
|
+
if argument.dsym_type?
|
|
249
|
+
dsym_value(argument)
|
|
250
|
+
elsif argument.hash_type?
|
|
251
|
+
hash_value(argument)
|
|
252
|
+
elsif rational_number?(argument)
|
|
253
|
+
rational_value(argument)
|
|
254
|
+
elsif complex_number?(argument)
|
|
255
|
+
complex_value(argument)
|
|
256
|
+
elsif argument.respond_to?(:value)
|
|
257
|
+
argument.value
|
|
258
|
+
else
|
|
259
|
+
argument.source
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def dsym_value(dsym_node)
|
|
264
|
+
dsym_node.children.first.source
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
def hash_value(hash_node)
|
|
268
|
+
hash_node.each_pair.with_object({}) do |pair, hash|
|
|
269
|
+
hash[pair.key.value] = argument_value(pair.value)
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
def rational_value(rational_node)
|
|
274
|
+
rational_node.source.to_r
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
def complex_value(complex_node)
|
|
278
|
+
Complex(complex_node.source)
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for uses of `Object#freeze` on immutable objects.
|
|
7
7
|
#
|
|
8
|
-
# NOTE: Regexp and Range literals are frozen objects since Ruby 3.0.
|
|
8
|
+
# NOTE: `Regexp` and `Range` literals are frozen objects since Ruby 3.0.
|
|
9
9
|
#
|
|
10
10
|
# NOTE: From Ruby 3.0, this cop allows explicit freezing of interpolated
|
|
11
11
|
# string literals when `# frozen-string-literal: true` is used.
|
|
@@ -42,7 +42,7 @@ module RuboCop
|
|
|
42
42
|
return true if node.immutable_literal?
|
|
43
43
|
return true if frozen_string_literal?(node)
|
|
44
44
|
|
|
45
|
-
target_ruby_version >= 3.0 &&
|
|
45
|
+
target_ruby_version >= 3.0 && node.type?(:regexp, :range)
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
def strip_parenthesis(node)
|
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
|
60
60
|
(begin (send !{(str _) array} {:+ :- :* :** :/ :%} {float int}))
|
|
61
61
|
(begin (send _ {:== :=== :!= :<= :>= :< :>} _))
|
|
62
62
|
(send _ {:count :length :size} ...)
|
|
63
|
-
(
|
|
63
|
+
(any_block (send _ {:count :length :size} ...) ...)
|
|
64
64
|
}
|
|
65
65
|
PATTERN
|
|
66
66
|
end
|
|
@@ -11,6 +11,9 @@ module RuboCop
|
|
|
11
11
|
# will not register an offense, because it allows the initializer to take a different
|
|
12
12
|
# number of arguments as its superclass potentially does.
|
|
13
13
|
#
|
|
14
|
+
# NOTE: If an initializer takes any arguments and has an empty body, RuboCop
|
|
15
|
+
# assumes it to *not* be redundant. This is to prevent potential `ArgumentError`.
|
|
16
|
+
#
|
|
14
17
|
# NOTE: If an initializer argument has a default value, RuboCop assumes it
|
|
15
18
|
# to *not* be redundant.
|
|
16
19
|
#
|
|
@@ -19,8 +22,10 @@ module RuboCop
|
|
|
19
22
|
# initializer.
|
|
20
23
|
#
|
|
21
24
|
# @safety
|
|
22
|
-
# This cop is unsafe because
|
|
23
|
-
#
|
|
25
|
+
# This cop is unsafe because removing an empty initializer may alter
|
|
26
|
+
# the behavior of the code, particularly if the superclass initializer
|
|
27
|
+
# raises an exception. In such cases, the empty initializer may act as
|
|
28
|
+
# a safeguard to prevent unintended errors from propagating.
|
|
24
29
|
#
|
|
25
30
|
# @example
|
|
26
31
|
# # bad
|
|
@@ -69,6 +74,10 @@ module RuboCop
|
|
|
69
74
|
# end
|
|
70
75
|
#
|
|
71
76
|
# # good (changes the parameter requirements)
|
|
77
|
+
# def initialize(_)
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# # good (changes the parameter requirements)
|
|
72
81
|
# def initialize(*)
|
|
73
82
|
# end
|
|
74
83
|
#
|
|
@@ -111,7 +120,7 @@ module RuboCop
|
|
|
111
120
|
return if acceptable?(node)
|
|
112
121
|
|
|
113
122
|
if node.body.nil?
|
|
114
|
-
register_offense(node, MSG_EMPTY)
|
|
123
|
+
register_offense(node, MSG_EMPTY) if node.arguments.empty?
|
|
115
124
|
else
|
|
116
125
|
return if node.body.begin_type?
|
|
117
126
|
|
|
@@ -49,9 +49,10 @@ module RuboCop
|
|
|
49
49
|
def on_dstr(node)
|
|
50
50
|
return unless single_interpolation?(node)
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
embedded_node = node.children.first
|
|
53
|
+
return if use_match_pattern?(embedded_node)
|
|
54
54
|
|
|
55
|
+
add_offense(node) do |corrector|
|
|
55
56
|
if variable_interpolation?(embedded_node)
|
|
56
57
|
autocorrect_variable_interpolation(corrector, embedded_node, node)
|
|
57
58
|
elsif single_variable_interpolation?(embedded_node)
|
|
@@ -71,6 +72,14 @@ module RuboCop
|
|
|
71
72
|
!embedded_in_percent_array?(node)
|
|
72
73
|
end
|
|
73
74
|
|
|
75
|
+
def use_match_pattern?(node)
|
|
76
|
+
return false if target_ruby_version <= 2.7
|
|
77
|
+
|
|
78
|
+
node.children.any? do |child|
|
|
79
|
+
child.respond_to?(:match_pattern_type?) && child.match_pattern_type?
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
74
83
|
def single_variable_interpolation?(node)
|
|
75
84
|
return false unless node.children.one?
|
|
76
85
|
|
|
@@ -130,7 +139,7 @@ module RuboCop
|
|
|
130
139
|
end
|
|
131
140
|
|
|
132
141
|
def require_parentheses?(node)
|
|
133
|
-
node.send_type? &&
|
|
142
|
+
node.send_type? && node.arguments.any? && !node.parenthesized_call?
|
|
134
143
|
end
|
|
135
144
|
end
|
|
136
145
|
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Before Ruby 3.0, interpolated strings followed the frozen string literal
|
|
7
|
+
# magic comment which sometimes made it necessary to explicitly unfreeze them.
|
|
8
|
+
# Ruby 3.0 changed interpolated strings to always be unfrozen which makes
|
|
9
|
+
# unfreezing them redundant.
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# # bad
|
|
13
|
+
# +"#{foo} bar"
|
|
14
|
+
#
|
|
15
|
+
# # bad
|
|
16
|
+
# "#{foo} bar".dup
|
|
17
|
+
#
|
|
18
|
+
# # good
|
|
19
|
+
# "#{foo} bar"
|
|
20
|
+
#
|
|
21
|
+
class RedundantInterpolationUnfreeze < Base
|
|
22
|
+
include FrozenStringLiteral
|
|
23
|
+
extend AutoCorrector
|
|
24
|
+
extend TargetRubyVersion
|
|
25
|
+
|
|
26
|
+
MSG = "Don't unfreeze interpolated strings as they are already unfrozen."
|
|
27
|
+
|
|
28
|
+
RESTRICT_ON_SEND = %i[+@ dup].freeze
|
|
29
|
+
|
|
30
|
+
minimum_target_ruby_version 3.0
|
|
31
|
+
|
|
32
|
+
def on_send(node)
|
|
33
|
+
return if node.arguments?
|
|
34
|
+
return unless (receiver = node.receiver)
|
|
35
|
+
return unless receiver.dstr_type?
|
|
36
|
+
return if uninterpolated_string?(receiver) || uninterpolated_heredoc?(receiver)
|
|
37
|
+
|
|
38
|
+
add_offense(node.loc.selector) do |corrector|
|
|
39
|
+
corrector.remove(node.loc.selector)
|
|
40
|
+
corrector.remove(node.loc.dot) unless node.unary_operation?
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|