rubocop 1.57.1 → 1.81.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +92 -89
- data/assets/output.css.erb +159 -0
- data/assets/output.html.erb +1 -160
- data/config/default.yml +540 -86
- data/config/internal_affairs.yml +31 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -7
- data/lib/rubocop/cached_data.rb +21 -5
- data/lib/rubocop/cli/command/auto_generate_config.rb +30 -17
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/lsp.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +2 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +28 -4
- data/lib/rubocop/comment_config.rb +3 -3
- data/lib/rubocop/config.rb +92 -22
- data/lib/rubocop/config_finder.rb +12 -2
- data/lib/rubocop/config_loader.rb +71 -58
- data/lib/rubocop/config_loader_resolver.rb +49 -17
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +56 -9
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +39 -20
- data/lib/rubocop/cop/autocorrect_logic.rb +57 -27
- data/lib/rubocop/cop/base.rb +79 -18
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/gem_version.rb +4 -5
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/cop.rb +30 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +4 -8
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +13 -16
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -0
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +6 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/documentation.rb +32 -5
- data/lib/rubocop/cop/exclude_limit.rb +1 -1
- data/lib/rubocop/cop/force.rb +12 -0
- data/lib/rubocop/cop/gemspec/add_runtime_dependency.rb +38 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/dependency_version.rb +3 -5
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +3 -4
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +39 -17
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +5 -3
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +3 -3
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +0 -4
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/empty_line_between_expect_offense_and_correction.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/example_description.rb +13 -8
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/method_name_end_with.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +19 -20
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +54 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +124 -30
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_expect_offense_arguments.rb +34 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +6 -21
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +11 -2
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +23 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +0 -5
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +6 -2
- data/lib/rubocop/cop/layout/argument_alignment.rb +3 -10
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/assignment_indentation.rb +3 -2
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +32 -13
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/condition_position.rb +0 -4
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -1
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +4 -4
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +14 -7
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +36 -21
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +12 -8
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +16 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -11
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +6 -11
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +19 -10
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +8 -0
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +3 -3
- data/lib/rubocop/cop/layout/hash_alignment.rb +10 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +13 -13
- data/lib/rubocop/cop/layout/leading_comment_space.rb +83 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +12 -3
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +177 -29
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +32 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +16 -9
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +6 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +80 -37
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +20 -10
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +8 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +3 -5
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/legacy/corrector.rb +12 -2
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +0 -2
- data/lib/rubocop/cop/lint/ambiguous_range.rb +9 -1
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +0 -2
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +7 -9
- data/lib/rubocop/cop/lint/big_decimal_new.rb +4 -7
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +11 -13
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -4
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -14
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +30 -10
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +2 -2
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -13
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -5
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +0 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +110 -32
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +87 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +0 -4
- data/lib/rubocop/cop/lint/else_layout.rb +0 -2
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +29 -58
- data/lib/rubocop/cop/lint/empty_ensure.rb +2 -12
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -5
- data/lib/rubocop/cop/lint/empty_when.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +2 -10
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +24 -23
- data/lib/rubocop/cop/lint/float_comparison.rb +58 -15
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -8
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -12
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +2 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +23 -12
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +0 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -4
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +50 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +126 -11
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +85 -0
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +49 -12
- data/lib/rubocop/cop/lint/loop.rb +6 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +17 -8
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +14 -12
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -12
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +6 -25
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -7
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +6 -8
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +9 -5
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +6 -11
- data/lib/rubocop/cop/lint/percent_string_array.rb +0 -4
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +0 -4
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/rand_one.rb +0 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +164 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +9 -8
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -6
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +9 -2
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -2
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +0 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -9
- data/lib/rubocop/cop/lint/rescue_type.rb +5 -11
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -13
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +20 -9
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +109 -41
- data/lib/rubocop/cop/lint/script_permission.rb +3 -3
- data/lib/rubocop/cop/lint/self_assignment.rb +72 -10
- data/lib/rubocop/cop/lint/shadowed_argument.rb +8 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +19 -11
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +8 -3
- data/lib/rubocop/cop/lint/syntax.rb +10 -4
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +2 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unified_integer.rb +0 -4
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +4 -3
- data/lib/rubocop/cop/lint/unreachable_code.rb +56 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +14 -8
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +25 -7
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +36 -10
- data/lib/rubocop/cop/lint/useless_assignment.rb +21 -16
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -4
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +79 -0
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -29
- data/lib/rubocop/cop/lint/useless_times.rb +2 -2
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +92 -18
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -4
- data/lib/rubocop/cop/metrics/block_length.rb +7 -5
- data/lib/rubocop/cop/metrics/block_nesting.rb +20 -8
- data/lib/rubocop/cop/metrics/class_length.rb +21 -15
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +15 -6
- data/lib/rubocop/cop/metrics/module_length.rb +7 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +8 -9
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +8 -4
- data/lib/rubocop/cop/mixin/allowed_methods.rb +7 -1
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +15 -3
- data/lib/rubocop/cop/mixin/annotation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/code_length.rb +12 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +23 -14
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -0
- data/lib/rubocop/cop/mixin/configurable_max.rb +5 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +23 -12
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +45 -35
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +34 -12
- data/lib/rubocop/cop/mixin/method_complexity.rb +17 -7
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/rescue_node.rb +4 -0
- data/lib/rubocop/cop/mixin/safe_assignment.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +11 -5
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +12 -0
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +11 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +39 -8
- data/lib/rubocop/cop/naming/constant_name.rb +7 -9
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/inclusive_language.rb +13 -5
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +13 -14
- data/lib/rubocop/cop/naming/method_name.rb +187 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/predicate_prefix.rb +204 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +14 -13
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +4 -5
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +4 -2
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +3 -2
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +172 -32
- data/lib/rubocop/cop/style/accessor_grouping.rb +43 -9
- data/lib/rubocop/cop/style/alias.rb +2 -1
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +228 -36
- data/lib/rubocop/cop/style/array_first_last.rb +80 -0
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +21 -14
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +2 -2
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +52 -21
- data/lib/rubocop/cop/style/case_like_if.rb +14 -17
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_check.rb +1 -0
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/class_vars.rb +3 -3
- data/lib/rubocop/cop/style/collection_compact.rb +25 -15
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +22 -8
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +30 -4
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +2 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +57 -40
- data/lib/rubocop/cop/style/constant_visibility.rb +16 -20
- data/lib/rubocop/cop/style/copyright.rb +31 -21
- data/lib/rubocop/cop/style/data_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/date_time.rb +5 -4
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -7
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +25 -25
- data/lib/rubocop/cop/style/documentation_method.rb +20 -0
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +11 -15
- data/lib/rubocop/cop/style/each_with_object.rb +3 -4
- data/lib/rubocop/cop/style/empty_else.rb +10 -7
- data/lib/rubocop/cop/style/empty_heredoc.rb +1 -14
- data/lib/rubocop/cop/style/empty_literal.rb +36 -23
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +23 -31
- data/lib/rubocop/cop/style/exact_regexp_match.rb +6 -5
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +19 -6
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_read.rb +2 -5
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/file_write.rb +2 -5
- data/lib/rubocop/cop/style/float_division.rb +23 -5
- data/lib/rubocop/cop/style/for.rb +3 -1
- data/lib/rubocop/cop/style/format_string.rb +9 -9
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +10 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +20 -4
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +110 -12
- data/lib/rubocop/cop/style/hash_except.rb +38 -146
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +35 -7
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +37 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +11 -15
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +8 -8
- data/lib/rubocop/cop/style/if_with_semicolon.rb +60 -6
- data/lib/rubocop/cop/style/in_pattern_then.rb +6 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +22 -18
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +48 -6
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +2 -1
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/magic_comment_format.rb +1 -1
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +82 -50
- data/lib/rubocop/cop/style/map_into_array.rb +236 -0
- data/lib/rubocop/cop/style/map_to_hash.rb +29 -10
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +52 -25
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +21 -5
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +30 -13
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -2
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +35 -5
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +10 -9
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +5 -3
- data/lib/rubocop/cop/style/multiline_when_then.rb +0 -4
- data/lib/rubocop/cop/style/multiple_comparison.rb +53 -60
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_modifier.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +2 -2
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +45 -1
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +1 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +12 -4
- data/lib/rubocop/cop/style/object_then.rb +16 -14
- data/lib/rubocop/cop/style/one_line_conditional.rb +48 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +27 -9
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +47 -45
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +8 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +2 -4
- data/lib/rubocop/cop/style/raise_args.rb +19 -14
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +29 -3
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +11 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +41 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +97 -25
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +19 -7
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +17 -14
- data/lib/rubocop/cop/style/redundant_each.rb +7 -4
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +4 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +1 -1
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +5 -4
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +46 -0
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +72 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +149 -49
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +12 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +16 -24
- data/lib/rubocop/cop/style/redundant_return.rb +9 -3
- data/lib/rubocop/cop/style/redundant_self.rb +32 -20
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +10 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +19 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -3
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/require_order.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +18 -4
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/return_nil_in_predicate_method_definition.rb +54 -12
- data/lib/rubocop/cop/style/safe_navigation.rb +163 -62
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/sample.rb +3 -4
- data/lib/rubocop/cop/style/select_by_regexp.rb +20 -13
- data/lib/rubocop/cop/style/self_assignment.rb +12 -18
- data/lib/rubocop/cop/style/semicolon.rb +33 -9
- data/lib/rubocop/cop/style/send.rb +4 -4
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +105 -0
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +16 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +18 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +105 -10
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +79 -87
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_chars.rb +1 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/strip.rb +7 -4
- data/lib/rubocop/cop/style/struct_inheritance.rb +9 -2
- data/lib/rubocop/cop/style/super_arguments.rb +221 -0
- data/lib/rubocop/cop/style/super_with_args_parentheses.rb +35 -0
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +78 -6
- data/lib/rubocop/cop/style/ternary_parentheses.rb +26 -5
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +2 -2
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unpack_first.rb +11 -14
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_do.rb +0 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +32 -24
- data/lib/rubocop/cop/team.rb +28 -4
- data/lib/rubocop/cop/util.rb +19 -6
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +43 -20
- data/lib/rubocop/cops_documentation_generator.rb +135 -58
- data/lib/rubocop/core_ext/string.rb +2 -6
- data/lib/rubocop/directive_comment.rb +54 -18
- data/lib/rubocop/ext/regexp_node.rb +17 -35
- data/lib/rubocop/ext/regexp_parser.rb +4 -21
- data/lib/rubocop/file_finder.rb +9 -4
- data/lib/rubocop/formatter/clang_style_formatter.rb +3 -7
- data/lib/rubocop/formatter/disabled_config_formatter.rb +43 -14
- data/lib/rubocop/formatter/formatter_set.rb +8 -2
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +38 -15
- data/lib/rubocop/formatter/json_formatter.rb +0 -1
- data/lib/rubocop/formatter/junit_formatter.rb +70 -23
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +13 -3
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/formatter/tap_formatter.rb +3 -7
- data/lib/rubocop/formatter.rb +1 -1
- data/lib/rubocop/lockfile.rb +58 -7
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +3 -3
- data/lib/rubocop/lsp/routes.rb +77 -40
- data/lib/rubocop/lsp/runtime.rb +20 -50
- data/lib/rubocop/lsp/server.rb +6 -4
- data/lib/rubocop/lsp/severity.rb +1 -1
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/lsp.rb +36 -0
- data/lib/rubocop/magic_comment.rb +12 -4
- data/lib/rubocop/options.rb +43 -22
- data/lib/rubocop/path_util.rb +21 -10
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +5 -2
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +29 -34
- data/lib/rubocop/rspec/cop_helper.rb +20 -2
- data/lib/rubocop/rspec/expect_offense.rb +31 -12
- data/lib/rubocop/rspec/shared_contexts.rb +112 -18
- data/lib/rubocop/rspec/support.rb +7 -2
- data/lib/rubocop/runner.rb +40 -13
- data/lib/rubocop/server/cache.rb +63 -11
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +3 -3
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/server/core.rb +5 -0
- data/lib/rubocop/server/server_command/exec.rb +0 -1
- data/lib/rubocop/target_finder.rb +93 -82
- data/lib/rubocop/target_ruby.rb +111 -81
- data/lib/rubocop/version.rb +67 -9
- data/lib/rubocop/yaml_duplication_checker.rb +20 -26
- data/lib/rubocop.rb +61 -3
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +103 -51
- data/lib/rubocop/cop/naming/predicate_name.rb +0 -134
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
- /data/lib/rubocop/formatter/{git_hub_actions_formatter.rb → github_actions_formatter.rb} +0 -0
|
@@ -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)
|
|
@@ -69,10 +69,11 @@ module RuboCop
|
|
|
69
69
|
|
|
70
70
|
def each_semicolon
|
|
71
71
|
tokens_for_lines.each do |line, tokens|
|
|
72
|
-
semicolon_pos = semicolon_position(tokens)
|
|
72
|
+
next unless (semicolon_pos = semicolon_position(tokens))
|
|
73
|
+
|
|
73
74
|
after_expr_pos = semicolon_pos == -1 ? -2 : semicolon_pos
|
|
74
75
|
|
|
75
|
-
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
76
|
+
yield line, tokens[semicolon_pos].column, tokens[after_expr_pos]
|
|
76
77
|
end
|
|
77
78
|
end
|
|
78
79
|
|
|
@@ -80,6 +81,7 @@ module RuboCop
|
|
|
80
81
|
processed_source.tokens.group_by(&:line)
|
|
81
82
|
end
|
|
82
83
|
|
|
84
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
83
85
|
def semicolon_position(tokens)
|
|
84
86
|
if tokens.last.semicolon?
|
|
85
87
|
-1
|
|
@@ -90,10 +92,13 @@ module RuboCop
|
|
|
90
92
|
elsif exist_semicolon_after_left_curly_brace?(tokens) ||
|
|
91
93
|
exist_semicolon_after_left_string_interpolation_brace?(tokens)
|
|
92
94
|
2
|
|
95
|
+
elsif exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
|
96
|
+
3
|
|
93
97
|
elsif exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
|
94
98
|
-4
|
|
95
99
|
end
|
|
96
100
|
end
|
|
101
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
97
102
|
|
|
98
103
|
def exist_semicolon_before_right_curly_brace?(tokens)
|
|
99
104
|
tokens[-2]&.right_curly_brace? && tokens[-3]&.semicolon?
|
|
@@ -103,6 +108,10 @@ module RuboCop
|
|
|
103
108
|
tokens[1]&.left_curly_brace? && tokens[2]&.semicolon?
|
|
104
109
|
end
|
|
105
110
|
|
|
111
|
+
def exist_semicolon_after_left_lambda_curly_brace?(tokens)
|
|
112
|
+
tokens[2]&.type == :tLAMBEG && tokens[3]&.semicolon?
|
|
113
|
+
end
|
|
114
|
+
|
|
106
115
|
def exist_semicolon_before_right_string_interpolation_brace?(tokens)
|
|
107
116
|
tokens[-3]&.type == :tSTRING_DEND && tokens[-4]&.semicolon?
|
|
108
117
|
end
|
|
@@ -111,6 +120,7 @@ module RuboCop
|
|
|
111
120
|
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
|
112
121
|
end
|
|
113
122
|
|
|
123
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
114
124
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
|
115
125
|
range = source_range(processed_source.buffer, line, column)
|
|
116
126
|
|
|
@@ -122,18 +132,23 @@ module RuboCop
|
|
|
122
132
|
# without parentheses.
|
|
123
133
|
# See: https://github.com/rubocop/rubocop/issues/10791
|
|
124
134
|
if token_before_semicolon&.regexp_dots?
|
|
125
|
-
|
|
126
|
-
|
|
135
|
+
node = find_node(range_nodes, token_before_semicolon)
|
|
136
|
+
elsif token_before_semicolon&.type == :tLABEL
|
|
137
|
+
node = find_node(value_omission_pair_nodes, token_before_semicolon).parent
|
|
138
|
+
space = node.parent.loc.selector.end.join(node.source_range.begin)
|
|
139
|
+
corrector.remove(space)
|
|
127
140
|
end
|
|
128
141
|
|
|
142
|
+
corrector.wrap(node, '(', ')') if node
|
|
129
143
|
corrector.remove(range)
|
|
130
144
|
end
|
|
131
145
|
end
|
|
132
146
|
end
|
|
147
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
133
148
|
|
|
134
149
|
def expressions_per_line(exprs)
|
|
135
150
|
# create a map matching lines to the number of expressions on them
|
|
136
|
-
exprs_lines = exprs.map(&:
|
|
151
|
+
exprs_lines = exprs.map(&:last_line)
|
|
137
152
|
exprs_lines.group_by(&:itself)
|
|
138
153
|
end
|
|
139
154
|
|
|
@@ -145,9 +160,9 @@ module RuboCop
|
|
|
145
160
|
end
|
|
146
161
|
end
|
|
147
162
|
|
|
148
|
-
def
|
|
149
|
-
|
|
150
|
-
|
|
163
|
+
def find_node(nodes, token_before_semicolon)
|
|
164
|
+
nodes.detect do |node|
|
|
165
|
+
node.source_range.overlaps?(token_before_semicolon.pos)
|
|
151
166
|
end
|
|
152
167
|
end
|
|
153
168
|
|
|
@@ -156,7 +171,16 @@ module RuboCop
|
|
|
156
171
|
|
|
157
172
|
ast = processed_source.ast
|
|
158
173
|
@range_nodes = ast.range_type? ? [ast] : []
|
|
159
|
-
@range_nodes.concat(ast.each_descendant(:
|
|
174
|
+
@range_nodes.concat(ast.each_descendant(:range).to_a)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def value_omission_pair_nodes
|
|
178
|
+
if instance_variable_defined?(:@value_omission_pair_nodes)
|
|
179
|
+
return @value_omission_pair_nodes
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
ast = processed_source.ast
|
|
183
|
+
@value_omission_pair_nodes = ast.each_descendant(:pair).to_a.select(&:value_omission?)
|
|
160
184
|
end
|
|
161
185
|
end
|
|
162
186
|
end
|