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
|
@@ -13,18 +13,16 @@ module RuboCop
|
|
|
13
13
|
# # good
|
|
14
14
|
# x if y.z.nil?
|
|
15
15
|
#
|
|
16
|
-
class RedundantParentheses < Base
|
|
16
|
+
class RedundantParentheses < Base # rubocop:disable Metrics/ClassLength
|
|
17
17
|
include Parentheses
|
|
18
18
|
extend AutoCorrector
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
def_node_matcher :square_brackets?, '(send {(send _recv _msg) str array hash} :[] ...)'
|
|
22
|
-
|
|
23
|
-
# @!method range_end?(node)
|
|
24
|
-
def_node_matcher :range_end?, '^^{irange erange}'
|
|
20
|
+
ALLOWED_NODE_TYPES = %i[or send splat kwsplat].freeze
|
|
25
21
|
|
|
26
|
-
# @!method
|
|
27
|
-
def_node_matcher :
|
|
22
|
+
# @!method square_brackets?(node)
|
|
23
|
+
def_node_matcher :square_brackets?, <<~PATTERN
|
|
24
|
+
(send `{(send _recv _msg) str array hash const #variable?} :[] ...)
|
|
25
|
+
PATTERN
|
|
28
26
|
|
|
29
27
|
# @!method rescue?(node)
|
|
30
28
|
def_node_matcher :rescue?, '{^resbody ^^resbody}'
|
|
@@ -32,9 +30,6 @@ module RuboCop
|
|
|
32
30
|
# @!method allowed_pin_operator?(node)
|
|
33
31
|
def_node_matcher :allowed_pin_operator?, '^(pin (begin !{lvar ivar cvar gvar}))'
|
|
34
32
|
|
|
35
|
-
# @!method arg_in_call_with_block?(node)
|
|
36
|
-
def_node_matcher :arg_in_call_with_block?, '^^(block (send _ _ equal?(%0) ...) ...)'
|
|
37
|
-
|
|
38
33
|
def on_begin(node)
|
|
39
34
|
return if !parentheses?(node) || parens_allowed?(node) || ignore_syntax?(node)
|
|
40
35
|
|
|
@@ -43,10 +38,15 @@ module RuboCop
|
|
|
43
38
|
|
|
44
39
|
private
|
|
45
40
|
|
|
41
|
+
def variable?(node)
|
|
42
|
+
node.respond_to?(:variable?) && node.variable?
|
|
43
|
+
end
|
|
44
|
+
|
|
46
45
|
def parens_allowed?(node)
|
|
47
46
|
empty_parentheses?(node) ||
|
|
48
47
|
first_arg_begins_with_hash_literal?(node) ||
|
|
49
48
|
rescue?(node) ||
|
|
49
|
+
in_pattern_matching_in_method_argument?(node) ||
|
|
50
50
|
allowed_pin_operator?(node) ||
|
|
51
51
|
allowed_expression?(node)
|
|
52
52
|
end
|
|
@@ -54,15 +54,15 @@ module RuboCop
|
|
|
54
54
|
def ignore_syntax?(node)
|
|
55
55
|
return false unless (parent = node.parent)
|
|
56
56
|
|
|
57
|
-
parent.
|
|
58
|
-
like_method_argument_parentheses?(parent)
|
|
57
|
+
parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
|
|
58
|
+
like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
def allowed_expression?(node)
|
|
62
62
|
allowed_ancestor?(node) ||
|
|
63
|
-
allowed_method_call?(node) ||
|
|
64
63
|
allowed_multiple_expression?(node) ||
|
|
65
|
-
allowed_ternary?(node)
|
|
64
|
+
allowed_ternary?(node) ||
|
|
65
|
+
node.parent&.range_type?
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
def allowed_ancestor?(node)
|
|
@@ -70,18 +70,13 @@ module RuboCop
|
|
|
70
70
|
keyword_ancestor?(node) && parens_required?(node)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def allowed_method_call?(node)
|
|
74
|
-
# Don't flag `method (arg) { }`
|
|
75
|
-
arg_in_call_with_block?(node) && !parentheses?(node.parent)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
73
|
def allowed_multiple_expression?(node)
|
|
79
74
|
return false if node.children.one?
|
|
80
75
|
|
|
81
76
|
ancestor = node.ancestors.first
|
|
82
77
|
return false unless ancestor
|
|
83
78
|
|
|
84
|
-
!ancestor.
|
|
79
|
+
!ancestor.type?(:begin, :any_def, :any_block)
|
|
85
80
|
end
|
|
86
81
|
|
|
87
82
|
def allowed_ternary?(node)
|
|
@@ -98,10 +93,17 @@ module RuboCop
|
|
|
98
93
|
end
|
|
99
94
|
|
|
100
95
|
def like_method_argument_parentheses?(node)
|
|
101
|
-
return false
|
|
96
|
+
return false unless node.type?(:send, :super, :yield)
|
|
102
97
|
|
|
103
98
|
node.arguments.one? && !node.parenthesized? &&
|
|
104
|
-
!node.
|
|
99
|
+
!node.operator_method? && node.first_argument.begin_type?
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def multiline_control_flow_statements?(node)
|
|
103
|
+
return false unless (parent = node.parent)
|
|
104
|
+
return false if parent.single_line?
|
|
105
|
+
|
|
106
|
+
parent.type?(:return, :next, :break)
|
|
105
107
|
end
|
|
106
108
|
|
|
107
109
|
def empty_parentheses?(node)
|
|
@@ -111,55 +113,122 @@ module RuboCop
|
|
|
111
113
|
|
|
112
114
|
def first_arg_begins_with_hash_literal?(node)
|
|
113
115
|
# Don't flag `method ({key: value})` or `method ({key: value}.method)`
|
|
114
|
-
method_chain_begins_with_hash_literal
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
hash_literal = method_chain_begins_with_hash_literal(node.children.first)
|
|
117
|
+
if (root_method = node.each_ancestor(:send).to_a.last)
|
|
118
|
+
parenthesized = root_method.parenthesized_call?
|
|
119
|
+
end
|
|
120
|
+
hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
|
|
117
121
|
end
|
|
118
122
|
|
|
119
|
-
def
|
|
120
|
-
return false
|
|
121
|
-
return
|
|
122
|
-
return false unless node.send_type?
|
|
123
|
+
def in_pattern_matching_in_method_argument?(begin_node)
|
|
124
|
+
return false unless begin_node.parent&.call_type?
|
|
125
|
+
return false unless (node = begin_node.children.first)
|
|
123
126
|
|
|
124
|
-
|
|
127
|
+
target_ruby_version <= 2.7 ? node.match_pattern_type? : node.match_pattern_p_type?
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def method_chain_begins_with_hash_literal(node)
|
|
131
|
+
return if node.nil?
|
|
132
|
+
return node if node.hash_type?
|
|
133
|
+
return unless node.send_type?
|
|
134
|
+
|
|
135
|
+
method_chain_begins_with_hash_literal(node.children.first)
|
|
125
136
|
end
|
|
126
137
|
|
|
127
138
|
def check(begin_node)
|
|
128
139
|
node = begin_node.children.first
|
|
129
140
|
|
|
130
141
|
if (message = find_offense_message(begin_node, node))
|
|
142
|
+
if node.range_type? && !argument_of_parenthesized_method_call?(begin_node, node)
|
|
143
|
+
begin_node = begin_node.parent
|
|
144
|
+
end
|
|
145
|
+
|
|
131
146
|
return offense(begin_node, message)
|
|
132
147
|
end
|
|
133
148
|
|
|
134
|
-
check_send(begin_node, node) if node
|
|
149
|
+
check_send(begin_node, node) if call_node?(node)
|
|
135
150
|
end
|
|
136
151
|
|
|
137
|
-
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
152
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
138
153
|
def find_offense_message(begin_node, node)
|
|
139
154
|
return 'a keyword' if keyword_with_redundant_parentheses?(node)
|
|
140
|
-
return 'a literal' if disallowed_literal?(begin_node, node)
|
|
155
|
+
return 'a literal' if node.literal? && disallowed_literal?(begin_node, node)
|
|
141
156
|
return 'a variable' if node.variable?
|
|
142
157
|
return 'a constant' if node.const_type?
|
|
158
|
+
if node.assignment? && (begin_node.parent.nil? || begin_node.parent.begin_type?)
|
|
159
|
+
return 'an assignment'
|
|
160
|
+
end
|
|
161
|
+
if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
|
|
162
|
+
return 'an expression'
|
|
163
|
+
end
|
|
164
|
+
if disallowed_one_line_pattern_matching?(begin_node, node)
|
|
165
|
+
return 'a one-line pattern matching'
|
|
166
|
+
end
|
|
143
167
|
return 'an interpolated expression' if interpolation?(begin_node)
|
|
168
|
+
return 'a method argument' if argument_of_parenthesized_method_call?(begin_node, node)
|
|
169
|
+
return 'a one-line rescue' if oneline_rescue_parentheses_required?(begin_node, node)
|
|
144
170
|
|
|
145
|
-
return if begin_node.chained?
|
|
171
|
+
return if begin_node.chained?
|
|
172
|
+
|
|
173
|
+
if node.operator_keyword?
|
|
174
|
+
return if node.semantic_operator? && begin_node.parent
|
|
175
|
+
return if node.multiline? && allow_in_multiline_conditions?
|
|
176
|
+
return if ALLOWED_NODE_TYPES.include?(begin_node.parent&.type)
|
|
177
|
+
return if !node.and_type? && begin_node.parent&.and_type?
|
|
178
|
+
return if begin_node.parent&.if_type? && begin_node.parent.ternary?
|
|
146
179
|
|
|
147
|
-
if node.and_type? || node.or_type?
|
|
148
180
|
'a logical expression'
|
|
149
181
|
elsif node.respond_to?(:comparison_method?) && node.comparison_method?
|
|
182
|
+
return unless begin_node.parent.nil?
|
|
183
|
+
|
|
150
184
|
'a comparison expression'
|
|
151
185
|
end
|
|
152
186
|
end
|
|
153
|
-
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
187
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
154
188
|
|
|
155
189
|
# @!method interpolation?(node)
|
|
156
190
|
def_node_matcher :interpolation?, '[^begin ^^dstr]'
|
|
157
191
|
|
|
192
|
+
def argument_of_parenthesized_method_call?(begin_node, node)
|
|
193
|
+
if node.basic_conditional? || node.rescue_type? || method_call_parentheses_required?(node)
|
|
194
|
+
return false
|
|
195
|
+
end
|
|
196
|
+
return false unless (parent = begin_node.parent)
|
|
197
|
+
|
|
198
|
+
parent.call_type? && parent.parenthesized? && parent.receiver != begin_node
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def oneline_rescue_parentheses_required?(begin_node, node)
|
|
202
|
+
return false unless node.rescue_type?
|
|
203
|
+
return false unless (parent = begin_node.parent)
|
|
204
|
+
return false if parent.if_type? && parent.ternary?
|
|
205
|
+
return false if parent.conditional? && parent.condition == begin_node
|
|
206
|
+
|
|
207
|
+
!parent.type?(:call, :array, :pair)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def method_call_parentheses_required?(node)
|
|
211
|
+
return false unless node.call_type?
|
|
212
|
+
|
|
213
|
+
(node.receiver.nil? || node.loc.dot) && node.arguments.any?
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def allow_in_multiline_conditions?
|
|
217
|
+
!!config.for_enabled_cop('Style/ParenthesesAroundCondition')['AllowInMultilineConditions']
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
def call_node?(node)
|
|
221
|
+
node.call_type? || (node.any_block_type? && node.braces? && !node.lambda_or_proc?)
|
|
222
|
+
end
|
|
223
|
+
|
|
158
224
|
def check_send(begin_node, node)
|
|
225
|
+
node = node.send_node if node.any_block_type?
|
|
226
|
+
|
|
159
227
|
return check_unary(begin_node, node) if node.unary_operation?
|
|
160
228
|
|
|
161
|
-
return unless method_call_with_redundant_parentheses?(node)
|
|
162
|
-
return if call_chain_starts_with_int?(begin_node, node)
|
|
229
|
+
return unless method_call_with_redundant_parentheses?(begin_node, node)
|
|
230
|
+
return if call_chain_starts_with_int?(begin_node, node) ||
|
|
231
|
+
do_end_block_in_method_chain?(begin_node, node)
|
|
163
232
|
|
|
164
233
|
offense(begin_node, 'a method call')
|
|
165
234
|
end
|
|
@@ -168,8 +237,7 @@ module RuboCop
|
|
|
168
237
|
return if begin_node.chained?
|
|
169
238
|
|
|
170
239
|
node = node.children.first while suspect_unary?(node)
|
|
171
|
-
|
|
172
|
-
return if node.send_type? && !method_call_with_redundant_parentheses?(node)
|
|
240
|
+
return unless method_call_with_redundant_parentheses?(begin_node, node)
|
|
173
241
|
|
|
174
242
|
offense(begin_node, 'a unary operation')
|
|
175
243
|
end
|
|
@@ -189,7 +257,22 @@ module RuboCop
|
|
|
189
257
|
end
|
|
190
258
|
|
|
191
259
|
def disallowed_literal?(begin_node, node)
|
|
192
|
-
|
|
260
|
+
if node.range_type?
|
|
261
|
+
return false unless (parent = begin_node.parent)
|
|
262
|
+
|
|
263
|
+
parent.begin_type? && parent.children.one?
|
|
264
|
+
else
|
|
265
|
+
!raised_to_power_negative_numeric?(begin_node, node)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def disallowed_one_line_pattern_matching?(begin_node, node)
|
|
270
|
+
if (parent = begin_node.parent)
|
|
271
|
+
return false if parent.any_def_type? && parent.endless?
|
|
272
|
+
return false if parent.assignment?
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
node.any_match_pattern_type? && node.each_ancestor.none?(&:operator_keyword?)
|
|
193
276
|
end
|
|
194
277
|
|
|
195
278
|
def raised_to_power_negative_numeric?(begin_node, node)
|
|
@@ -216,22 +299,33 @@ module RuboCop
|
|
|
216
299
|
end
|
|
217
300
|
end
|
|
218
301
|
|
|
219
|
-
def method_call_with_redundant_parentheses?(node)
|
|
220
|
-
return false unless node.
|
|
302
|
+
def method_call_with_redundant_parentheses?(begin_node, node)
|
|
303
|
+
return false unless node.type?(:call, :super, :yield, :defined?)
|
|
221
304
|
return false if node.prefix_not?
|
|
222
|
-
return
|
|
305
|
+
return true if singular_parenthesized_parent?(begin_node)
|
|
223
306
|
|
|
224
|
-
|
|
307
|
+
node.arguments.empty? || parentheses?(node) || square_brackets?(node)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def singular_parenthesized_parent?(begin_node)
|
|
311
|
+
return true unless begin_node.parent
|
|
312
|
+
return false if begin_node.parent.type?(:splat, :kwsplat)
|
|
225
313
|
|
|
226
|
-
|
|
314
|
+
parentheses?(begin_node) && begin_node.parent.children.one?
|
|
227
315
|
end
|
|
228
316
|
|
|
229
317
|
def only_begin_arg?(args)
|
|
230
|
-
args.one? && args.first
|
|
318
|
+
args.one? && args.first&.begin_type?
|
|
231
319
|
end
|
|
232
320
|
|
|
233
321
|
def first_argument?(node)
|
|
234
|
-
first_send_argument?(node) ||
|
|
322
|
+
if first_send_argument?(node) ||
|
|
323
|
+
first_super_argument?(node) ||
|
|
324
|
+
first_yield_argument?(node)
|
|
325
|
+
return true
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
node.each_ancestor.any? { |ancestor| first_argument?(ancestor) }
|
|
235
329
|
end
|
|
236
330
|
|
|
237
331
|
# @!method first_send_argument?(node)
|
|
@@ -254,6 +348,12 @@ module RuboCop
|
|
|
254
348
|
recv&.int_type? && (parent = begin_node.parent) &&
|
|
255
349
|
parent.send_type? && (parent.method?(:-@) || parent.method?(:+@))
|
|
256
350
|
end
|
|
351
|
+
|
|
352
|
+
def do_end_block_in_method_chain?(begin_node, node)
|
|
353
|
+
return false unless (block = node.each_descendant(:any_block).first)
|
|
354
|
+
|
|
355
|
+
block.keywords? && begin_node.each_ancestor(:call).any?
|
|
356
|
+
end
|
|
257
357
|
end
|
|
258
358
|
end
|
|
259
359
|
end
|
|
@@ -53,7 +53,7 @@ module RuboCop
|
|
|
53
53
|
return if interpolated_quotes?(node) || allowed_percent_q?(node)
|
|
54
54
|
|
|
55
55
|
add_offense(node) do |corrector|
|
|
56
|
-
delimiter =
|
|
56
|
+
delimiter = /\A%Q[^"]+\z|'/.match?(node.source) ? QUOTE : SINGLE_QUOTE
|
|
57
57
|
|
|
58
58
|
corrector.replace(node.loc.begin, delimiter)
|
|
59
59
|
corrector.replace(node.loc.end, delimiter)
|
|
@@ -33,6 +33,7 @@ module RuboCop
|
|
|
33
33
|
# 'foo'.sub('f', 'x')
|
|
34
34
|
# 'foo'.sub!('f', 'x')
|
|
35
35
|
class RedundantRegexpArgument < Base
|
|
36
|
+
include StringLiteralsHelp
|
|
36
37
|
extend AutoCorrector
|
|
37
38
|
|
|
38
39
|
MSG = 'Use string `%<prefer>s` as argument instead of regexp `%<current>s`.'
|
|
@@ -65,18 +66,28 @@ module RuboCop
|
|
|
65
66
|
DETERMINISTIC_REGEX.match?(regexp_node.source)
|
|
66
67
|
end
|
|
67
68
|
|
|
69
|
+
# rubocop:disable Metrics/MethodLength
|
|
68
70
|
def preferred_argument(regexp_node)
|
|
69
71
|
new_argument = replacement(regexp_node)
|
|
70
72
|
|
|
71
73
|
if new_argument.include?('"')
|
|
72
74
|
new_argument.gsub!("'", "\\\\'")
|
|
75
|
+
new_argument.gsub!('\"', '"')
|
|
73
76
|
quote = "'"
|
|
74
|
-
|
|
77
|
+
elsif new_argument.include?("\\'")
|
|
78
|
+
quote = "'"
|
|
79
|
+
elsif new_argument.include?('\'')
|
|
80
|
+
new_argument.gsub!("'", "\\\\'")
|
|
81
|
+
quote = "'"
|
|
82
|
+
elsif new_argument.include?('\\')
|
|
75
83
|
quote = '"'
|
|
84
|
+
else
|
|
85
|
+
quote = enforce_double_quotes? ? '"' : "'"
|
|
76
86
|
end
|
|
77
87
|
|
|
78
88
|
"#{quote}#{new_argument}#{quote}"
|
|
79
89
|
end
|
|
90
|
+
# rubocop:enable Metrics/MethodLength
|
|
80
91
|
|
|
81
92
|
def replacement(regexp_node)
|
|
82
93
|
regexp_content = regexp_node.content
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for redundant escapes inside Regexp literals.
|
|
6
|
+
# Checks for redundant escapes inside `Regexp` literals.
|
|
7
7
|
#
|
|
8
8
|
# @example
|
|
9
9
|
# # bad
|
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
ALLOWED_ALWAYS_ESCAPES = " \n[]^\\#".chars.freeze
|
|
42
42
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES = '-'.chars.freeze
|
|
43
43
|
ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES = '.*+?{}()|$'.chars.freeze
|
|
44
|
+
INTERPOLATION_SIGILS = %w[@ $].freeze
|
|
44
45
|
|
|
45
46
|
def on_regexp(node)
|
|
46
47
|
each_escape(node) do |char, index, within_character_class|
|
|
@@ -64,6 +65,7 @@ module RuboCop
|
|
|
64
65
|
# different versions of Ruby so that e.g. /\i/ != /i/
|
|
65
66
|
return true if /[[:alnum:]]/.match?(char)
|
|
66
67
|
return true if ALLOWED_ALWAYS_ESCAPES.include?(char) || delimiter?(node, char)
|
|
68
|
+
return true if requires_escape_to_avoid_interpolation?(node.source[index], char)
|
|
67
69
|
|
|
68
70
|
if within_character_class
|
|
69
71
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES.include?(char) &&
|
|
@@ -95,30 +97,20 @@ module RuboCop
|
|
|
95
97
|
delimiters.include?(char)
|
|
96
98
|
end
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
def requires_escape_to_avoid_interpolation?(char_before_escape, escaped_char)
|
|
101
|
+
# Preserve escapes after '#' that would otherwise trigger interpolation:
|
|
102
|
+
# '#@ivar', '#@@cvar', and '#$gvar'.
|
|
103
|
+
char_before_escape == '#' && INTERPOLATION_SIGILS.include?(escaped_char)
|
|
104
|
+
end
|
|
102
105
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
# It's for compatibility with regexp_parser 1.8 and will never be maintained.
|
|
112
|
-
else
|
|
113
|
-
def each_escape(node)
|
|
114
|
-
node.parsed_tree&.traverse&.reduce(0) do |char_class_depth, (event, expr)|
|
|
115
|
-
yield(expr.text[1], expr.start_index, !char_class_depth.zero?) if expr.type == :escape
|
|
116
|
-
|
|
117
|
-
if expr.type == :set
|
|
118
|
-
char_class_depth + (event == :enter ? 1 : -1)
|
|
119
|
-
else
|
|
120
|
-
char_class_depth
|
|
121
|
-
end
|
|
106
|
+
def each_escape(node)
|
|
107
|
+
node.parsed_tree&.traverse&.reduce(0) do |char_class_depth, (event, expr)|
|
|
108
|
+
yield(expr.text[1], expr.ts, !char_class_depth.zero?) if expr.type == :escape
|
|
109
|
+
|
|
110
|
+
if expr.type == :set
|
|
111
|
+
char_class_depth + (event == :enter ? 1 : -1)
|
|
112
|
+
else
|
|
113
|
+
char_class_depth
|
|
122
114
|
end
|
|
123
115
|
end
|
|
124
116
|
end
|
|
@@ -58,12 +58,12 @@ module RuboCop
|
|
|
58
58
|
|
|
59
59
|
MSG = 'Redundant `return` detected.'
|
|
60
60
|
MULTI_RETURN_MSG = 'To return multiple values, use an array.'
|
|
61
|
-
RESTRICT_ON_SEND = %i[define_method define_singleton_method].freeze
|
|
61
|
+
RESTRICT_ON_SEND = %i[define_method define_singleton_method lambda].freeze
|
|
62
62
|
|
|
63
63
|
def on_send(node)
|
|
64
|
-
return unless
|
|
64
|
+
return unless node.block_literal?
|
|
65
65
|
|
|
66
|
-
check_branch(parent.body)
|
|
66
|
+
check_branch(node.parent.body)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def on_def(node)
|
|
@@ -113,6 +113,7 @@ module RuboCop
|
|
|
113
113
|
case node.type
|
|
114
114
|
when :return then check_return_node(node)
|
|
115
115
|
when :case then check_case_node(node)
|
|
116
|
+
when :case_match then check_case_match_node(node)
|
|
116
117
|
when :if then check_if_node(node)
|
|
117
118
|
when :rescue then check_rescue_node(node)
|
|
118
119
|
when :resbody then check_resbody_node(node)
|
|
@@ -140,6 +141,11 @@ module RuboCop
|
|
|
140
141
|
check_branch(node.else_branch)
|
|
141
142
|
end
|
|
142
143
|
|
|
144
|
+
def check_case_match_node(node)
|
|
145
|
+
node.in_pattern_branches.each { |in_pattern_node| check_branch(in_pattern_node.body) }
|
|
146
|
+
check_branch(node.else_branch)
|
|
147
|
+
end
|
|
148
|
+
|
|
143
149
|
def check_if_node(node)
|
|
144
150
|
return if node.ternary?
|
|
145
151
|
|
|
@@ -17,7 +17,8 @@ module RuboCop
|
|
|
17
17
|
# protected scope, you cannot send private messages this way.
|
|
18
18
|
#
|
|
19
19
|
# Note we allow uses of `self` with operators because it would be awkward
|
|
20
|
-
# otherwise.
|
|
20
|
+
# otherwise. Also allows the use of `self.it` without arguments in blocks,
|
|
21
|
+
# as in `0.times { self.it }`, following `Lint/ItWithoutArgumentsInBlock` cop.
|
|
21
22
|
#
|
|
22
23
|
# @example
|
|
23
24
|
#
|
|
@@ -65,14 +66,15 @@ module RuboCop
|
|
|
65
66
|
# Assignment of self.x
|
|
66
67
|
|
|
67
68
|
def on_or_asgn(node)
|
|
68
|
-
lhs
|
|
69
|
-
|
|
69
|
+
allow_self(node.lhs)
|
|
70
|
+
|
|
71
|
+
lhs_name = node.lhs.lvasgn_type? ? node.lhs.name : node.lhs
|
|
72
|
+
add_lhs_to_local_variables_scopes(node.rhs, lhs_name)
|
|
70
73
|
end
|
|
71
74
|
alias on_and_asgn on_or_asgn
|
|
72
75
|
|
|
73
76
|
def on_op_asgn(node)
|
|
74
|
-
lhs
|
|
75
|
-
allow_self(lhs)
|
|
77
|
+
allow_self(node.lhs)
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
# Using self.x to distinguish from local variable x
|
|
@@ -91,13 +93,11 @@ module RuboCop
|
|
|
91
93
|
end
|
|
92
94
|
|
|
93
95
|
def on_masgn(node)
|
|
94
|
-
|
|
95
|
-
add_masgn_lhs_variables(rhs, lhs)
|
|
96
|
+
add_masgn_lhs_variables(node.rhs, node.lhs)
|
|
96
97
|
end
|
|
97
98
|
|
|
98
99
|
def on_lvasgn(node)
|
|
99
|
-
|
|
100
|
-
add_lhs_to_local_variables_scopes(rhs, lhs)
|
|
100
|
+
add_lhs_to_local_variables_scopes(node.rhs, node.lhs)
|
|
101
101
|
end
|
|
102
102
|
|
|
103
103
|
def on_in_pattern(node)
|
|
@@ -107,8 +107,8 @@ module RuboCop
|
|
|
107
107
|
def on_send(node)
|
|
108
108
|
return unless node.self_receiver? && regular_method_call?(node)
|
|
109
109
|
return if node.parent&.mlhs_type?
|
|
110
|
-
|
|
111
110
|
return if allowed_send_node?(node)
|
|
111
|
+
return if it_method_in_block?(node)
|
|
112
112
|
|
|
113
113
|
add_offense(node.receiver) do |corrector|
|
|
114
114
|
corrector.remove(node.receiver)
|
|
@@ -121,17 +121,16 @@ module RuboCop
|
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
alias on_numblock on_block
|
|
124
|
+
alias on_itblock on_block
|
|
124
125
|
|
|
125
126
|
def on_if(node)
|
|
126
127
|
# Allow conditional nodes to use `self` in the condition if that variable
|
|
127
128
|
# name is used in an `lvasgn` or `masgn` within the `if`.
|
|
128
|
-
node.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
elsif child_node.masgn_type?
|
|
134
|
-
add_masgn_lhs_variables(node.condition, lhs)
|
|
129
|
+
node.each_descendant(:lvasgn, :masgn) do |descendant_node|
|
|
130
|
+
if descendant_node.lvasgn_type?
|
|
131
|
+
add_lhs_to_local_variables_scopes(node.condition, descendant_node.lhs)
|
|
132
|
+
else
|
|
133
|
+
add_masgn_lhs_variables(node.condition, descendant_node.lhs)
|
|
135
134
|
end
|
|
136
135
|
end
|
|
137
136
|
end
|
|
@@ -155,6 +154,20 @@ module RuboCop
|
|
|
155
154
|
KERNEL_METHODS.include?(node.method_name)
|
|
156
155
|
end
|
|
157
156
|
|
|
157
|
+
# Respects `Lint/ItWithoutArgumentsInBlock` cop and the following Ruby 3.3's warning:
|
|
158
|
+
#
|
|
159
|
+
# $ ruby -e '0.times { begin; it; end }'
|
|
160
|
+
# -e:1: warning: `it` calls without arguments will refer to the first block param in
|
|
161
|
+
# Ruby 3.4; use it() or self.it
|
|
162
|
+
#
|
|
163
|
+
def it_method_in_block?(node)
|
|
164
|
+
return false unless node.method?(:it)
|
|
165
|
+
return false unless (block_node = node.each_ancestor(:block).first)
|
|
166
|
+
return false unless block_node.arguments.empty_and_without_delimiters?
|
|
167
|
+
|
|
168
|
+
node.arguments.empty? && !node.block_literal?
|
|
169
|
+
end
|
|
170
|
+
|
|
158
171
|
def regular_method_call?(node)
|
|
159
172
|
!(node.operator_method? ||
|
|
160
173
|
KEYWORDS.include?(node.method_name) ||
|
|
@@ -166,9 +179,8 @@ module RuboCop
|
|
|
166
179
|
def on_argument(node)
|
|
167
180
|
if node.mlhs_type?
|
|
168
181
|
on_args(node)
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
@local_variables_scopes[node] << name
|
|
182
|
+
elsif node.respond_to?(:name)
|
|
183
|
+
@local_variables_scopes[node] << node.name
|
|
172
184
|
end
|
|
173
185
|
end
|
|
174
186
|
|