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
|
@@ -17,9 +17,14 @@ module RuboCop
|
|
|
17
17
|
# `foo&.bar` can start returning `nil` as well as what the method
|
|
18
18
|
# returns.
|
|
19
19
|
#
|
|
20
|
-
# The default for `MaxChainLength` is `2
|
|
20
|
+
# The default for `MaxChainLength` is `2`.
|
|
21
21
|
# We have limited the cop to not register an offense for method chains
|
|
22
|
-
# that exceed this option
|
|
22
|
+
# that exceed this option's value.
|
|
23
|
+
#
|
|
24
|
+
# NOTE: This cop will recognize offenses but not autocorrect code when the
|
|
25
|
+
# right hand side (RHS) of the `&&` statement is an `||` statement
|
|
26
|
+
# (eg. `foo && (foo.bar? || foo.baz?)`). It can be corrected
|
|
27
|
+
# manually by removing the `foo &&` and adding `&.` to each `foo` on the RHS.
|
|
23
28
|
#
|
|
24
29
|
# @safety
|
|
25
30
|
# Autocorrection is unsafe because if a value is `false`, the resulting
|
|
@@ -81,7 +86,11 @@ module RuboCop
|
|
|
81
86
|
# foo.baz = bar if foo
|
|
82
87
|
# foo.baz + bar if foo
|
|
83
88
|
# foo.bar > 2 if foo
|
|
84
|
-
|
|
89
|
+
#
|
|
90
|
+
# foo ? foo[index] : nil # Ignored `foo&.[](index)` due to unclear readability benefit.
|
|
91
|
+
# foo ? foo[idx] = v : nil # Ignored `foo&.[]=(idx, v)` due to unclear readability benefit.
|
|
92
|
+
# foo ? foo * 42 : nil # Ignored `foo&.*(42)` due to unclear readability benefit.
|
|
93
|
+
class SafeNavigation < Base # rubocop:disable Metrics/ClassLength
|
|
85
94
|
include NilMethods
|
|
86
95
|
include RangeHelp
|
|
87
96
|
extend AutoCorrector
|
|
@@ -121,56 +130,151 @@ module RuboCop
|
|
|
121
130
|
}
|
|
122
131
|
PATTERN
|
|
123
132
|
|
|
133
|
+
# @!method and_with_rhs_or?(node)
|
|
134
|
+
def_node_matcher :and_with_rhs_or?, '(and _ {or (begin or)})'
|
|
135
|
+
|
|
124
136
|
# @!method not_nil_check?(node)
|
|
125
137
|
def_node_matcher :not_nil_check?, '(send (send $_ :nil?) :!)'
|
|
126
138
|
|
|
139
|
+
# @!method and_inside_begin?(node)
|
|
140
|
+
def_node_matcher :and_inside_begin?, '`(begin and ...)'
|
|
141
|
+
|
|
142
|
+
# @!method strip_begin(node)
|
|
143
|
+
def_node_matcher :strip_begin, '{ (begin $!begin) $!(begin) }'
|
|
144
|
+
|
|
145
|
+
# rubocop:disable Metrics/AbcSize
|
|
127
146
|
def on_if(node)
|
|
128
147
|
return if allowed_if_condition?(node)
|
|
129
148
|
|
|
130
|
-
|
|
131
|
-
|
|
149
|
+
checked_variable, receiver, method_chain, _method = extract_parts_from_if(node)
|
|
150
|
+
return unless offending_node?(node, checked_variable, method_chain, receiver)
|
|
151
|
+
|
|
152
|
+
body = extract_if_body(node)
|
|
153
|
+
method_call = receiver.parent
|
|
154
|
+
return if dotless_operator_call?(method_call) || method_call.double_colon?
|
|
132
155
|
|
|
133
|
-
|
|
134
|
-
|
|
156
|
+
removal_ranges = [begin_range(node, body), end_range(node, body)]
|
|
157
|
+
|
|
158
|
+
report_offense(node, method_chain, method_call, *removal_ranges) do |corrector|
|
|
159
|
+
corrector.replace(receiver, checked_variable.source) if checked_variable.csend_type?
|
|
160
|
+
corrector.insert_before(method_call.loc.dot, '&') unless method_call.safe_navigation?
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
# rubocop:enable Metrics/AbcSize
|
|
164
|
+
|
|
165
|
+
def on_and(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
166
|
+
collect_and_clauses(node).each do |(lhs, lhs_operator_range), (rhs, _rhs_operator_range)|
|
|
167
|
+
lhs_not_nil_check = not_nil_check?(lhs)
|
|
168
|
+
lhs_receiver = lhs_not_nil_check || lhs
|
|
169
|
+
rhs_receiver = find_matching_receiver_invocation(strip_begin(rhs), lhs_receiver)
|
|
170
|
+
|
|
171
|
+
next if !cop_config['ConvertCodeThatCanStartToReturnNil'] && lhs_not_nil_check
|
|
172
|
+
next unless offending_node?(node, lhs_receiver, rhs, rhs_receiver)
|
|
173
|
+
|
|
174
|
+
# Since we are evaluating every clause in potentially a complex chain of `and` nodes,
|
|
175
|
+
# we need to ensure that there isn't an object check happening
|
|
176
|
+
lhs_method_chain = find_method_chain(lhs_receiver)
|
|
177
|
+
next unless lhs_method_chain == lhs_receiver || lhs_not_nil_check
|
|
178
|
+
|
|
179
|
+
report_offense(
|
|
180
|
+
node,
|
|
181
|
+
rhs, rhs_receiver,
|
|
182
|
+
range_with_surrounding_space(range: lhs.source_range, side: :right),
|
|
183
|
+
range_with_surrounding_space(range: lhs_operator_range, side: :right),
|
|
184
|
+
offense_range: range_between(lhs.source_range.begin_pos, rhs.source_range.end_pos)
|
|
185
|
+
) do |corrector|
|
|
186
|
+
corrector.replace(rhs_receiver, lhs_receiver.source)
|
|
187
|
+
end
|
|
188
|
+
ignore_node(node)
|
|
189
|
+
end
|
|
135
190
|
end
|
|
136
191
|
|
|
137
192
|
private
|
|
138
193
|
|
|
139
|
-
def
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
194
|
+
def report_offense(node, rhs, rhs_receiver, *removal_ranges, offense_range: node)
|
|
195
|
+
add_offense(offense_range) do |corrector|
|
|
196
|
+
next if ignored_node?(node)
|
|
197
|
+
|
|
198
|
+
# If the RHS is an `or` we cannot safely autocorrect because in order to remove
|
|
199
|
+
# the non-nil check we need to add safe-navs to all clauses where the receiver is used
|
|
200
|
+
next if and_with_rhs_or?(node)
|
|
201
|
+
|
|
202
|
+
removal_ranges.each { |range| corrector.remove(range) }
|
|
203
|
+
yield corrector if block_given?
|
|
146
204
|
|
|
147
|
-
|
|
205
|
+
handle_comments(corrector, node, rhs)
|
|
206
|
+
|
|
207
|
+
add_safe_nav_to_all_methods_in_chain(corrector, rhs_receiver, rhs)
|
|
208
|
+
end
|
|
148
209
|
end
|
|
149
210
|
|
|
150
|
-
def
|
|
151
|
-
node
|
|
211
|
+
def find_method_chain(node)
|
|
212
|
+
return node unless node&.parent&.call_type?
|
|
213
|
+
|
|
214
|
+
find_method_chain(node.parent)
|
|
152
215
|
end
|
|
153
216
|
|
|
154
|
-
def
|
|
155
|
-
|
|
156
|
-
|
|
217
|
+
def collect_and_clauses(node)
|
|
218
|
+
# Collect the lhs, operator and rhs of all `and` nodes
|
|
219
|
+
# `and` nodes can be nested and can contain `begin` nodes
|
|
220
|
+
# This gives us a source-ordered list of clauses that is then used to look
|
|
221
|
+
# for matching receivers as well as operator locations for offense and corrections
|
|
222
|
+
node.each_descendant(:and)
|
|
223
|
+
.inject(and_parts(node)) { |nodes, and_node| concat_nodes(nodes, and_node) }
|
|
224
|
+
.sort_by { |a| a.is_a?(RuboCop::AST::Node) ? a.source_range.begin_pos : a.begin_pos }
|
|
225
|
+
.each_slice(2)
|
|
226
|
+
.each_cons(2)
|
|
227
|
+
end
|
|
157
228
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
corrector.insert_before(method_call.loc.dot, '&') unless method_call.safe_navigation?
|
|
161
|
-
handle_comments(corrector, node, method_call)
|
|
229
|
+
def concat_nodes(nodes, and_node)
|
|
230
|
+
return nodes if and_node.each_ancestor(:block).any?
|
|
162
231
|
|
|
163
|
-
|
|
232
|
+
nodes.concat(and_parts(and_node))
|
|
164
233
|
end
|
|
165
234
|
|
|
166
|
-
def
|
|
167
|
-
|
|
235
|
+
def and_parts(node)
|
|
236
|
+
parts = [node.loc.operator]
|
|
237
|
+
parts << node.rhs unless and_inside_begin?(node.rhs)
|
|
238
|
+
parts << node.lhs unless node.lhs.and_type? || and_inside_begin?(node.lhs)
|
|
239
|
+
parts
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def offending_node?(node, lhs_receiver, rhs, rhs_receiver) # rubocop:disable Metrics/CyclomaticComplexity
|
|
243
|
+
return false if !matching_nodes?(lhs_receiver, rhs_receiver) || rhs_receiver.nil?
|
|
244
|
+
return false if use_var_only_in_unless_modifier?(node, lhs_receiver)
|
|
245
|
+
return false if chain_length(rhs, rhs_receiver) > max_chain_length
|
|
246
|
+
return false if unsafe_method_used?(node, rhs, rhs_receiver.parent)
|
|
247
|
+
return false if rhs.send_type? && rhs.method?(:empty?)
|
|
248
|
+
|
|
249
|
+
true
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def use_var_only_in_unless_modifier?(node, variable)
|
|
253
|
+
node.if_type? && node.unless? && !method_called?(variable)
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def extract_if_body(node)
|
|
257
|
+
if node.ternary?
|
|
168
258
|
node.branches.find { |branch| !branch.nil_type? }
|
|
169
259
|
else
|
|
170
260
|
node.node_parts[1]
|
|
171
261
|
end
|
|
172
262
|
end
|
|
173
263
|
|
|
264
|
+
def dotless_operator_call?(method_call)
|
|
265
|
+
return true if dotless_operator_method?(method_call)
|
|
266
|
+
|
|
267
|
+
method_call = method_call.parent while method_call.parent.send_type?
|
|
268
|
+
|
|
269
|
+
dotless_operator_method?(method_call)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def dotless_operator_method?(method_call)
|
|
273
|
+
return false if method_call.loc.dot
|
|
274
|
+
|
|
275
|
+
method_call.method?(:[]) || method_call.method?(:[]=) || method_call.operator_method?
|
|
276
|
+
end
|
|
277
|
+
|
|
174
278
|
def handle_comments(corrector, node, method_call)
|
|
175
279
|
comments = comments(node)
|
|
176
280
|
return if comments.empty?
|
|
@@ -201,20 +305,6 @@ module RuboCop
|
|
|
201
305
|
node.else? || node.elsif?
|
|
202
306
|
end
|
|
203
307
|
|
|
204
|
-
def method_call(node)
|
|
205
|
-
_checked_variable, matching_receiver, = extract_parts(node)
|
|
206
|
-
matching_receiver.parent
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
def extract_parts(node)
|
|
210
|
-
case node.type
|
|
211
|
-
when :if
|
|
212
|
-
extract_parts_from_if(node)
|
|
213
|
-
when :and
|
|
214
|
-
extract_parts_from_and(node)
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
|
|
218
308
|
def extract_parts_from_if(node)
|
|
219
309
|
variable, receiver =
|
|
220
310
|
if node.ternary?
|
|
@@ -230,16 +320,6 @@ module RuboCop
|
|
|
230
320
|
[checked_variable, matching_receiver, receiver, method]
|
|
231
321
|
end
|
|
232
322
|
|
|
233
|
-
def extract_parts_from_and(node)
|
|
234
|
-
checked_variable, rhs = *node
|
|
235
|
-
if cop_config['ConvertCodeThatCanStartToReturnNil']
|
|
236
|
-
checked_variable = not_nil_check?(checked_variable) || checked_variable
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
checked_variable, matching_receiver, method = extract_common_parts(rhs, checked_variable)
|
|
240
|
-
[checked_variable, matching_receiver, rhs, method]
|
|
241
|
-
end
|
|
242
|
-
|
|
243
323
|
def extract_common_parts(method_chain, checked_variable)
|
|
244
324
|
matching_receiver = find_matching_receiver_invocation(method_chain, checked_variable)
|
|
245
325
|
|
|
@@ -249,38 +329,59 @@ module RuboCop
|
|
|
249
329
|
end
|
|
250
330
|
|
|
251
331
|
def find_matching_receiver_invocation(method_chain, checked_variable)
|
|
252
|
-
return nil unless method_chain
|
|
332
|
+
return nil unless method_chain.respond_to?(:receiver)
|
|
253
333
|
|
|
254
334
|
receiver = method_chain.receiver
|
|
255
335
|
|
|
256
|
-
return receiver if receiver
|
|
336
|
+
return receiver if matching_nodes?(receiver, checked_variable)
|
|
257
337
|
|
|
258
338
|
find_matching_receiver_invocation(receiver, checked_variable)
|
|
259
339
|
end
|
|
260
340
|
|
|
341
|
+
def matching_nodes?(left, right)
|
|
342
|
+
left == right || matching_call_nodes?(left, right)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def matching_call_nodes?(left, right)
|
|
346
|
+
return false unless left && right.respond_to?(:call_type?)
|
|
347
|
+
return false unless left.call_type? && right.call_type?
|
|
348
|
+
|
|
349
|
+
# Compare receiver and method name, but ignore the difference between
|
|
350
|
+
# safe navigation method call (`&.`) and dot method call (`.`).
|
|
351
|
+
left_receiver, left_method, *left_args = left.children
|
|
352
|
+
right_receiver, right_method, *right_args = right.children
|
|
353
|
+
|
|
354
|
+
left_method == right_method &&
|
|
355
|
+
matching_nodes?(left_receiver, right_receiver) &&
|
|
356
|
+
left_args == right_args
|
|
357
|
+
end
|
|
358
|
+
|
|
261
359
|
def chain_length(method_chain, method)
|
|
262
|
-
method.each_ancestor(:
|
|
360
|
+
method.each_ancestor(:call).inject(0) do |total, ancestor|
|
|
263
361
|
break total + 1 if ancestor == method_chain
|
|
264
362
|
|
|
265
363
|
total + 1
|
|
266
364
|
end
|
|
267
365
|
end
|
|
268
366
|
|
|
269
|
-
def unsafe_method_used?(method_chain, method)
|
|
270
|
-
return true if unsafe_method?(method)
|
|
367
|
+
def unsafe_method_used?(node, method_chain, method)
|
|
368
|
+
return true if unsafe_method?(node, method)
|
|
271
369
|
|
|
272
370
|
method.each_ancestor(:send).any? do |ancestor|
|
|
273
|
-
break true unless config.
|
|
371
|
+
break true unless config.cop_enabled?('Lint/SafeNavigationChain')
|
|
274
372
|
|
|
275
|
-
break true if unsafe_method?(ancestor)
|
|
373
|
+
break true if unsafe_method?(node, ancestor)
|
|
276
374
|
break true if nil_methods.include?(ancestor.method_name)
|
|
277
375
|
break false if ancestor == method_chain
|
|
278
376
|
end
|
|
279
377
|
end
|
|
280
378
|
|
|
281
|
-
def unsafe_method?(send_node)
|
|
282
|
-
negated?(send_node)
|
|
283
|
-
|
|
379
|
+
def unsafe_method?(node, send_node)
|
|
380
|
+
return true if negated?(send_node)
|
|
381
|
+
|
|
382
|
+
return false if node.respond_to?(:ternary?) && node.ternary?
|
|
383
|
+
|
|
384
|
+
send_node.assignment? ||
|
|
284
385
|
(!send_node.dot? && !send_node.safe_navigation?)
|
|
285
386
|
end
|
|
286
387
|
|
|
@@ -309,7 +410,7 @@ module RuboCop
|
|
|
309
410
|
method_chain)
|
|
310
411
|
start_method.each_ancestor do |ancestor|
|
|
311
412
|
break unless %i[send block].include?(ancestor.type)
|
|
312
|
-
next
|
|
413
|
+
next if !ancestor.send_type? || ancestor.operator_method?
|
|
313
414
|
|
|
314
415
|
corrector.insert_before(ancestor.loc.dot, '&')
|
|
315
416
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# Enforces safe navigation chains length to not exceed the configured maximum.
|
|
7
|
+
# The longer the chain is, the harder it becomes to track what on it could be
|
|
8
|
+
# returning `nil`.
|
|
9
|
+
#
|
|
10
|
+
# There is a potential interplay with `Style/SafeNavigation` - if both are enabled
|
|
11
|
+
# and their settings are "incompatible", one of the cops will complain about what
|
|
12
|
+
# the other proposes.
|
|
13
|
+
#
|
|
14
|
+
# E.g. if `Style/SafeNavigation` is configured with `MaxChainLength: 2` (default)
|
|
15
|
+
# and this cop is configured with `Max: 1`, then for `foo.bar.baz if foo` the former
|
|
16
|
+
# will suggest `foo&.bar&.baz`, which is an offense for the latter.
|
|
17
|
+
#
|
|
18
|
+
# @example Max: 2 (default)
|
|
19
|
+
# # bad
|
|
20
|
+
# user&.address&.zip&.upcase
|
|
21
|
+
#
|
|
22
|
+
# # good
|
|
23
|
+
# user&.address&.zip
|
|
24
|
+
# user.address.zip if user
|
|
25
|
+
#
|
|
26
|
+
class SafeNavigationChainLength < Base
|
|
27
|
+
MSG = 'Avoid safe navigation chains longer than %<max>d calls.'
|
|
28
|
+
|
|
29
|
+
def on_csend(node)
|
|
30
|
+
safe_navigation_chains = safe_navigation_chains(node)
|
|
31
|
+
return if safe_navigation_chains.size < max
|
|
32
|
+
|
|
33
|
+
add_offense(safe_navigation_chains.last, message: format(MSG, max: max))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
private
|
|
37
|
+
|
|
38
|
+
def safe_navigation_chains(node)
|
|
39
|
+
node.each_ancestor.with_object([]) do |parent, chains|
|
|
40
|
+
break chains unless parent.csend_type?
|
|
41
|
+
|
|
42
|
+
chains << parent
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def max
|
|
47
|
+
cop_config['Max'] || 2
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
|
35
35
|
|
|
36
36
|
# @!method sample_candidate?(node)
|
|
37
37
|
def_node_matcher :sample_candidate?, <<~PATTERN
|
|
38
|
-
(
|
|
38
|
+
(call $(call _ :shuffle $...) ${:#{RESTRICT_ON_SEND.join(' :')}} $...)
|
|
39
39
|
PATTERN
|
|
40
40
|
|
|
41
41
|
def on_send(node)
|
|
@@ -52,6 +52,7 @@ module RuboCop
|
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
|
+
alias on_csend on_send
|
|
55
56
|
|
|
56
57
|
private
|
|
57
58
|
|
|
@@ -109,9 +110,7 @@ module RuboCop
|
|
|
109
110
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
110
111
|
|
|
111
112
|
def source_range(shuffle_node, node)
|
|
112
|
-
|
|
113
|
-
shuffle_node.loc.selector.begin_pos,
|
|
114
|
-
node.source_range.end_pos)
|
|
113
|
+
shuffle_node.loc.selector.join(node.source_range.end)
|
|
115
114
|
end
|
|
116
115
|
|
|
117
116
|
def message(shuffle_arg, method, method_args, range)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Looks for places where
|
|
6
|
+
# Looks for places where a subset of an Enumerable (array,
|
|
7
7
|
# range, set, etc.; see note below) is calculated based on a `Regexp`
|
|
8
8
|
# match, and suggests `grep` or `grep_v` instead.
|
|
9
9
|
#
|
|
@@ -27,7 +27,7 @@ module RuboCop
|
|
|
27
27
|
# so the correction may not be actually equivalent.
|
|
28
28
|
#
|
|
29
29
|
# @example
|
|
30
|
-
# # bad (select or find_all)
|
|
30
|
+
# # bad (select, filter, or find_all)
|
|
31
31
|
# array.select { |x| x.match? /regexp/ }
|
|
32
32
|
# array.select { |x| /regexp/.match?(x) }
|
|
33
33
|
# array.select { |x| x =~ /regexp/ }
|
|
@@ -47,16 +47,19 @@ module RuboCop
|
|
|
47
47
|
include RangeHelp
|
|
48
48
|
|
|
49
49
|
MSG = 'Prefer `%<replacement>s` to `%<original_method>s` with a regexp match.'
|
|
50
|
-
RESTRICT_ON_SEND = %i[select find_all reject].freeze
|
|
51
|
-
REPLACEMENTS = { select: 'grep', find_all: 'grep', reject: 'grep_v' }.freeze
|
|
52
|
-
OPPOSITE_REPLACEMENTS = {
|
|
50
|
+
RESTRICT_ON_SEND = %i[select filter find_all reject].freeze
|
|
51
|
+
REPLACEMENTS = { select: 'grep', filter: 'grep', find_all: 'grep', reject: 'grep_v' }.freeze
|
|
52
|
+
OPPOSITE_REPLACEMENTS = {
|
|
53
|
+
select: 'grep_v', filter: 'grep_v', find_all: 'grep_v', reject: 'grep'
|
|
54
|
+
}.freeze
|
|
53
55
|
REGEXP_METHODS = %i[match? =~ !~].to_set.freeze
|
|
54
56
|
|
|
55
57
|
# @!method regexp_match?(node)
|
|
56
58
|
def_node_matcher :regexp_match?, <<~PATTERN
|
|
57
59
|
{
|
|
58
|
-
(block
|
|
59
|
-
(numblock
|
|
60
|
+
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
61
|
+
(numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
62
|
+
(itblock call $_ ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
60
63
|
}
|
|
61
64
|
PATTERN
|
|
62
65
|
|
|
@@ -64,9 +67,9 @@ module RuboCop
|
|
|
64
67
|
# @!method creates_hash?(node)
|
|
65
68
|
def_node_matcher :creates_hash?, <<~PATTERN
|
|
66
69
|
{
|
|
67
|
-
(
|
|
68
|
-
(block (
|
|
69
|
-
(
|
|
70
|
+
(call (const _ :Hash) {:new :[]} ...)
|
|
71
|
+
(block (call (const _ :Hash) :new ...) ...)
|
|
72
|
+
(call _ { :to_h :to_hash } ...)
|
|
70
73
|
}
|
|
71
74
|
PATTERN
|
|
72
75
|
|
|
@@ -84,8 +87,9 @@ module RuboCop
|
|
|
84
87
|
}
|
|
85
88
|
PATTERN
|
|
86
89
|
|
|
87
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
90
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
88
91
|
def on_send(node)
|
|
92
|
+
return if target_ruby_version < 2.6 && node.method?(:filter)
|
|
89
93
|
return unless (block_node = node.block_node)
|
|
90
94
|
return if block_node.body&.begin_type?
|
|
91
95
|
return if receiver_allowed?(block_node.receiver)
|
|
@@ -99,7 +103,8 @@ module RuboCop
|
|
|
99
103
|
|
|
100
104
|
register_offense(node, block_node, regexp, replacement)
|
|
101
105
|
end
|
|
102
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
106
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
107
|
+
alias on_csend on_send
|
|
103
108
|
|
|
104
109
|
private
|
|
105
110
|
|
|
@@ -133,6 +138,7 @@ module RuboCop
|
|
|
133
138
|
return unless (block_arg_name, regexp_method_send_node = regexp_match?(block_node))
|
|
134
139
|
|
|
135
140
|
block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
|
|
141
|
+
|
|
136
142
|
return unless calls_lvar?(regexp_method_send_node, block_arg_name)
|
|
137
143
|
|
|
138
144
|
regexp_method_send_node
|
|
@@ -146,7 +152,8 @@ module RuboCop
|
|
|
146
152
|
return node.child_nodes.first if node.match_with_lvasgn_type?
|
|
147
153
|
|
|
148
154
|
if node.receiver.lvar_type? &&
|
|
149
|
-
(block.
|
|
155
|
+
(block.type?(:numblock, :itblock) ||
|
|
156
|
+
node.receiver.source == block.first_argument.source)
|
|
150
157
|
node.first_argument
|
|
151
158
|
elsif node.first_argument.lvar_type?
|
|
152
159
|
node.receiver
|
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
|
16
16
|
extend AutoCorrector
|
|
17
17
|
|
|
18
18
|
MSG = 'Use self-assignment shorthand `%<method>s=`.'
|
|
19
|
-
OPS = %i[+ - * ** / | &].freeze
|
|
19
|
+
OPS = %i[+ - * ** / % ^ << >> | &].freeze
|
|
20
20
|
|
|
21
21
|
def self.autocorrect_incompatible_with
|
|
22
22
|
[Layout::SpaceAroundOperators]
|
|
@@ -37,33 +37,29 @@ module RuboCop
|
|
|
37
37
|
private
|
|
38
38
|
|
|
39
39
|
def check(node, var_type)
|
|
40
|
-
|
|
41
|
-
return unless rhs
|
|
40
|
+
return unless (rhs = node.expression)
|
|
42
41
|
|
|
43
|
-
if rhs.send_type?
|
|
44
|
-
check_send_node(node, rhs,
|
|
42
|
+
if rhs.send_type? && rhs.arguments.one?
|
|
43
|
+
check_send_node(node, rhs, node.name, var_type)
|
|
45
44
|
elsif rhs.operator_keyword?
|
|
46
|
-
check_boolean_node(node, rhs,
|
|
45
|
+
check_boolean_node(node, rhs, node.name, var_type)
|
|
47
46
|
end
|
|
48
47
|
end
|
|
49
48
|
|
|
50
49
|
def check_send_node(node, rhs, var_name, var_type)
|
|
51
|
-
|
|
52
|
-
return unless OPS.include?(method_name)
|
|
50
|
+
return unless OPS.include?(rhs.method_name)
|
|
53
51
|
|
|
54
52
|
target_node = s(var_type, var_name)
|
|
55
|
-
return unless receiver == target_node
|
|
53
|
+
return unless rhs.receiver == target_node
|
|
56
54
|
|
|
57
|
-
add_offense(node, message: format(MSG, method: method_name)) do |corrector|
|
|
55
|
+
add_offense(node, message: format(MSG, method: rhs.method_name)) do |corrector|
|
|
58
56
|
autocorrect(corrector, node)
|
|
59
57
|
end
|
|
60
58
|
end
|
|
61
59
|
|
|
62
60
|
def check_boolean_node(node, rhs, var_name, var_type)
|
|
63
|
-
first_operand, _second_operand = *rhs
|
|
64
|
-
|
|
65
61
|
target_node = s(var_type, var_name)
|
|
66
|
-
return unless
|
|
62
|
+
return unless rhs.lhs == target_node
|
|
67
63
|
|
|
68
64
|
operator = rhs.loc.operator.source
|
|
69
65
|
add_offense(node, message: format(MSG, method: operator)) do |corrector|
|
|
@@ -72,7 +68,7 @@ module RuboCop
|
|
|
72
68
|
end
|
|
73
69
|
|
|
74
70
|
def autocorrect(corrector, node)
|
|
75
|
-
|
|
71
|
+
rhs = node.expression
|
|
76
72
|
|
|
77
73
|
if rhs.send_type?
|
|
78
74
|
autocorrect_send_node(corrector, node, rhs)
|
|
@@ -82,13 +78,11 @@ module RuboCop
|
|
|
82
78
|
end
|
|
83
79
|
|
|
84
80
|
def autocorrect_send_node(corrector, node, rhs)
|
|
85
|
-
|
|
86
|
-
apply_autocorrect(corrector, node, rhs, method_name.to_s, args)
|
|
81
|
+
apply_autocorrect(corrector, node, rhs, rhs.method_name, rhs.first_argument)
|
|
87
82
|
end
|
|
88
83
|
|
|
89
84
|
def autocorrect_boolean_node(corrector, node, rhs)
|
|
90
|
-
|
|
91
|
-
apply_autocorrect(corrector, node, rhs, rhs.loc.operator.source, second_operand)
|
|
85
|
+
apply_autocorrect(corrector, node, rhs, rhs.loc.operator.source, rhs.rhs)
|
|
92
86
|
end
|
|
93
87
|
|
|
94
88
|
def apply_autocorrect(corrector, node, rhs, operator, new_rhs)
|
|
@@ -80,6 +80,7 @@ module RuboCop
|
|
|
80
80
|
processed_source.tokens.group_by(&:line)
|
|
81
81
|
end
|
|
82
82
|
|
|
83
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
83
84
|
def semicolon_position(tokens)
|
|
84
85
|
if tokens.last.semicolon?
|
|
85
86
|
-1
|
|
@@ -90,10 +91,13 @@ module RuboCop
|
|
|
90
91
|
elsif exist_semicolon_after_left_curly_brace?(tokens) ||
|
|
91
92
|
exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
|
92
93
|
2
|
|
94
|
+
elsif exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
|
95
|
+
3
|
|
93
96
|
elsif exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
|
94
97
|
-4
|
|
95
98
|
end
|
|
96
99
|
end
|
|
100
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
97
101
|
|
|
98
102
|
def exist_semicolon_before_right_curly_brace?(tokens)
|
|
99
103
|
tokens[-2]&.right_curly_brace? && tokens[-3]&.semicolon?
|
|
@@ -103,6 +107,10 @@ module RuboCop
|
|
|
103
107
|
tokens[1]&.left_curly_brace? && tokens[2]&.semicolon?
|
|
104
108
|
end
|
|
105
109
|
|
|
110
|
+
def exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
|
111
|
+
tokens[2]&.type == :tLAMBEG && tokens[3]&.semicolon?
|
|
112
|
+
end
|
|
113
|
+
|
|
106
114
|
def exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
|
107
115
|
tokens[-3]&.type == :tSTRING_DEND && tokens[-4]&.semicolon?
|
|
108
116
|
end
|
|
@@ -111,6 +119,7 @@ module RuboCop
|
|
|
111
119
|
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
|
112
120
|
end
|
|
113
121
|
|
|
122
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
114
123
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
|
115
124
|
range = source_range(processed_source.buffer, line, column)
|
|
116
125
|
|
|
@@ -122,18 +131,23 @@ module RuboCop
|
|
|
122
131
|
# without parentheses.
|
|
123
132
|
# See: https://github.com/rubocop/rubocop/issues/10791
|
|
124
133
|
if token_before_semicolon&.regexp_dots?
|
|
125
|
-
|
|
126
|
-
|
|
134
|
+
node = find_node(range_nodes, token_before_semicolon)
|
|
135
|
+
elsif token_before_semicolon&.type == :tLABEL
|
|
136
|
+
node = find_node(value_omission_pair_nodes, token_before_semicolon).parent
|
|
137
|
+
space = node.parent.loc.selector.end.join(node.source_range.begin)
|
|
138
|
+
corrector.remove(space)
|
|
127
139
|
end
|
|
128
140
|
|
|
141
|
+
corrector.wrap(node, '(', ')') if node
|
|
129
142
|
corrector.remove(range)
|
|
130
143
|
end
|
|
131
144
|
end
|
|
132
145
|
end
|
|
146
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
133
147
|
|
|
134
148
|
def expressions_per_line(exprs)
|
|
135
149
|
# create a map matching lines to the number of expressions on them
|
|
136
|
-
exprs_lines = exprs.map(&:
|
|
150
|
+
exprs_lines = exprs.map(&:last_line)
|
|
137
151
|
exprs_lines.group_by(&:itself)
|
|
138
152
|
end
|
|
139
153
|
|
|
@@ -145,9 +159,9 @@ module RuboCop
|
|
|
145
159
|
end
|
|
146
160
|
end
|
|
147
161
|
|
|
148
|
-
def
|
|
149
|
-
|
|
150
|
-
|
|
162
|
+
def find_node(nodes, token_before_semicolon)
|
|
163
|
+
nodes.detect do |node|
|
|
164
|
+
node.source_range.overlaps?(token_before_semicolon.pos)
|
|
151
165
|
end
|
|
152
166
|
end
|
|
153
167
|
|
|
@@ -156,7 +170,16 @@ module RuboCop
|
|
|
156
170
|
|
|
157
171
|
ast = processed_source.ast
|
|
158
172
|
@range_nodes = ast.range_type? ? [ast] : []
|
|
159
|
-
@range_nodes.concat(ast.each_descendant(:
|
|
173
|
+
@range_nodes.concat(ast.each_descendant(:range).to_a)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def value_omission_pair_nodes
|
|
177
|
+
if instance_variable_defined?(:@value_omission_pair_nodes)
|
|
178
|
+
return @value_omission_pair_nodes
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
ast = processed_source.ast
|
|
182
|
+
@value_omission_pair_nodes = ast.each_descendant(:pair).to_a.select(&:value_omission?)
|
|
160
183
|
end
|
|
161
184
|
end
|
|
162
185
|
end
|