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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for redundant line continuation.
|
|
7
7
|
#
|
|
8
8
|
# This cop marks a line continuation as redundant if removing the backslash
|
|
9
9
|
# does not result in a syntax error.
|
|
@@ -69,16 +69,24 @@ module RuboCop
|
|
|
69
69
|
extend AutoCorrector
|
|
70
70
|
|
|
71
71
|
MSG = 'Redundant line continuation.'
|
|
72
|
+
LINE_CONTINUATION = '\\'
|
|
73
|
+
LINE_CONTINUATION_PATTERN = /(\\\n)/.freeze
|
|
72
74
|
ALLOWED_STRING_TOKENS = %i[tSTRING tSTRING_CONTENT].freeze
|
|
73
75
|
ARGUMENT_TYPES = %i[
|
|
74
|
-
kFALSE kNIL kSELF kTRUE
|
|
75
|
-
|
|
76
|
+
kDEF kDEFINED kFALSE kNIL kSELF kTRUE tAMPER tBANG tCARET tCHARACTER tCOLON3 tCONSTANT
|
|
77
|
+
tCVAR tDOT2 tDOT3 tFLOAT tGVAR tIDENTIFIER tINTEGER tIVAR tLAMBDA tLBRACK tLCURLY
|
|
78
|
+
tLPAREN_ARG tPIPE tQSYMBOLS_BEG tQWORDS_BEG tREGEXP_BEG tSTAR tSTRING tSTRING_BEG tSYMBEG
|
|
79
|
+
tSYMBOL tSYMBOLS_BEG tTILDE tUMINUS tUNARY_NUM tUPLUS tWORDS_BEG tXSTRING_BEG
|
|
76
80
|
].freeze
|
|
81
|
+
ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
|
|
82
|
+
tIDENTIFIER kBREAK kNEXT kRETURN kSUPER kYIELD
|
|
83
|
+
].freeze
|
|
84
|
+
ARITHMETIC_OPERATOR_TOKENS = %i[tDIVIDE tDSTAR tMINUS tPERCENT tPLUS tSTAR2].freeze
|
|
77
85
|
|
|
78
86
|
def on_new_investigation
|
|
79
87
|
return unless processed_source.ast
|
|
80
88
|
|
|
81
|
-
each_match_range(processed_source.ast.source_range,
|
|
89
|
+
each_match_range(processed_source.ast.source_range, LINE_CONTINUATION_PATTERN) do |range|
|
|
82
90
|
next if require_line_continuation?(range)
|
|
83
91
|
next unless redundant_line_continuation?(range)
|
|
84
92
|
|
|
@@ -86,19 +94,27 @@ module RuboCop
|
|
|
86
94
|
corrector.remove_leading(range, 1)
|
|
87
95
|
end
|
|
88
96
|
end
|
|
97
|
+
|
|
98
|
+
inspect_end_of_ruby_code_line_continuation
|
|
89
99
|
end
|
|
90
100
|
|
|
91
101
|
private
|
|
92
102
|
|
|
93
103
|
def require_line_continuation?(range)
|
|
94
|
-
!
|
|
104
|
+
!ends_with_uncommented_backslash?(range) ||
|
|
95
105
|
string_concatenation?(range.source_line) ||
|
|
96
|
-
start_with_arithmetic_operator?(
|
|
97
|
-
inside_string_literal_or_method_with_argument?(range)
|
|
106
|
+
start_with_arithmetic_operator?(range) ||
|
|
107
|
+
inside_string_literal_or_method_with_argument?(range) ||
|
|
108
|
+
leading_dot_method_chain_with_blank_line?(range)
|
|
98
109
|
end
|
|
99
110
|
|
|
100
|
-
def
|
|
101
|
-
|
|
111
|
+
def ends_with_uncommented_backslash?(range)
|
|
112
|
+
# A line continuation always needs to be the last character on the line, which
|
|
113
|
+
# means that it is impossible to have a comment following a continuation.
|
|
114
|
+
# Therefore, if the line contains a comment, it cannot end with a continuation.
|
|
115
|
+
return false if processed_source.line_with_comment?(range.line)
|
|
116
|
+
|
|
117
|
+
range.source_line.end_with?(LINE_CONTINUATION)
|
|
102
118
|
end
|
|
103
119
|
|
|
104
120
|
def string_concatenation?(source_line)
|
|
@@ -106,17 +122,48 @@ module RuboCop
|
|
|
106
122
|
end
|
|
107
123
|
|
|
108
124
|
def inside_string_literal_or_method_with_argument?(range)
|
|
125
|
+
line_range = range_by_whole_lines(range)
|
|
126
|
+
|
|
109
127
|
processed_source.tokens.each_cons(2).any? do |token, next_token|
|
|
110
|
-
|
|
128
|
+
next if token.line == next_token.line
|
|
129
|
+
|
|
130
|
+
inside_string_literal?(range, token) ||
|
|
131
|
+
method_with_argument?(line_range, token, next_token)
|
|
111
132
|
end
|
|
112
133
|
end
|
|
113
134
|
|
|
135
|
+
def leading_dot_method_chain_with_blank_line?(range)
|
|
136
|
+
return false unless range.source_line.strip.start_with?('.', '&.')
|
|
137
|
+
|
|
138
|
+
processed_source[range.line].strip.empty?
|
|
139
|
+
end
|
|
140
|
+
|
|
114
141
|
def redundant_line_continuation?(range)
|
|
115
|
-
return true unless (node = find_node_for_line(range.
|
|
142
|
+
return true unless (node = find_node_for_line(range.last_line))
|
|
116
143
|
return false if argument_newline?(node)
|
|
117
144
|
|
|
118
|
-
source
|
|
119
|
-
|
|
145
|
+
# Check if source is still valid without the continuation
|
|
146
|
+
source = processed_source.raw_source.dup
|
|
147
|
+
source[range.begin_pos, range.length] = "\n"
|
|
148
|
+
parse(source).valid_syntax?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def inspect_end_of_ruby_code_line_continuation
|
|
152
|
+
last_line = processed_source.lines[processed_source.ast.last_line - 1]
|
|
153
|
+
return unless code_ends_with_continuation?(last_line)
|
|
154
|
+
|
|
155
|
+
last_column = last_line.length
|
|
156
|
+
line_continuation_range = range_between(last_column - 1, last_column)
|
|
157
|
+
|
|
158
|
+
add_offense(line_continuation_range) do |corrector|
|
|
159
|
+
corrector.remove_trailing(line_continuation_range, 1)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def code_ends_with_continuation?(last_line)
|
|
164
|
+
return false if processed_source.line_with_comment?(processed_source.ast.last_line)
|
|
165
|
+
|
|
166
|
+
last_line.end_with?(LINE_CONTINUATION)
|
|
120
167
|
end
|
|
121
168
|
|
|
122
169
|
def inside_string_literal?(range, token)
|
|
@@ -127,11 +174,16 @@ module RuboCop
|
|
|
127
174
|
#
|
|
128
175
|
# do_something \
|
|
129
176
|
# argument
|
|
130
|
-
def method_with_argument?(current_token, next_token)
|
|
131
|
-
|
|
177
|
+
def method_with_argument?(line_range, current_token, next_token)
|
|
178
|
+
return false unless ARGUMENT_TAKING_FLOW_TOKEN_TYPES.include?(current_token.type)
|
|
179
|
+
return false unless current_token.pos.overlaps?(line_range)
|
|
180
|
+
|
|
181
|
+
ARGUMENT_TYPES.include?(next_token.type)
|
|
132
182
|
end
|
|
133
183
|
|
|
134
184
|
def argument_newline?(node)
|
|
185
|
+
return false if node.parenthesized_call?
|
|
186
|
+
|
|
135
187
|
node = node.children.first if node.root? && node.begin_type?
|
|
136
188
|
|
|
137
189
|
if argument_is_method?(node)
|
|
@@ -143,9 +195,9 @@ module RuboCop
|
|
|
143
195
|
end
|
|
144
196
|
end
|
|
145
197
|
|
|
146
|
-
def find_node_for_line(
|
|
198
|
+
def find_node_for_line(last_line)
|
|
147
199
|
processed_source.ast.each_node do |node|
|
|
148
|
-
return node if same_line?(node,
|
|
200
|
+
return node if same_line?(node, last_line)
|
|
149
201
|
end
|
|
150
202
|
end
|
|
151
203
|
|
|
@@ -174,8 +226,9 @@ module RuboCop
|
|
|
174
226
|
node.call_type? && !node.arguments.empty?
|
|
175
227
|
end
|
|
176
228
|
|
|
177
|
-
def start_with_arithmetic_operator?(
|
|
178
|
-
|
|
229
|
+
def start_with_arithmetic_operator?(range)
|
|
230
|
+
line_range = processed_source.buffer.line_range(range.line + 1)
|
|
231
|
+
ARITHMETIC_OPERATOR_TOKENS.include?(processed_source.first_token_of(line_range).type)
|
|
179
232
|
end
|
|
180
233
|
end
|
|
181
234
|
end
|
|
@@ -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
|
|