rubocop 1.67.0 → 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 +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -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 +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- 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 +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- 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/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- 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 +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- 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/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- 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_source_range.rb +3 -1
- 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 +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- 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/def_end_alignment.rb +1 -1
- 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_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- 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 +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- 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_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- 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 +158 -10
- 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 +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -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 +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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 +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- 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 +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- 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 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- 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 +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- 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 +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- 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 +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- 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_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- 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 +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.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/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- 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/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- 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 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- 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 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- 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 +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- 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 +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- 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/comments_help.rb +8 -3
- 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 +4 -3
- 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 +22 -22
- 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 +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- 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_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/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- 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 +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- 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_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- 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 +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- 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 +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- 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 +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- 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/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- 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 +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- 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 +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- 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_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- 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 +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +9 -3
- 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 +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- 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 +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- 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 +1 -0
- 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/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- 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_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- 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_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- 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 +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- 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/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- 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 +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- 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 +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- 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 +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- 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 +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -21,12 +21,8 @@ module RuboCop
|
|
|
21
21
|
# args += foo
|
|
22
22
|
# hash.merge!(other)
|
|
23
23
|
#
|
|
24
|
-
# # bad
|
|
25
|
-
# self.foo = foo.concat(ary)
|
|
26
|
-
#
|
|
27
24
|
# # good
|
|
28
25
|
# foo.concat(ary)
|
|
29
|
-
# self.foo += ary
|
|
30
26
|
#
|
|
31
27
|
class RedundantSelfAssignment < Base
|
|
32
28
|
include RangeHelp
|
|
@@ -49,19 +45,31 @@ module RuboCop
|
|
|
49
45
|
gvasgn: :gvar
|
|
50
46
|
}.freeze
|
|
51
47
|
|
|
48
|
+
# @!method redundant_self_assignment?
|
|
49
|
+
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
|
50
|
+
(call
|
|
51
|
+
%1 _
|
|
52
|
+
(call
|
|
53
|
+
(call
|
|
54
|
+
%1 %2) #method_returning_self?
|
|
55
|
+
...))
|
|
56
|
+
PATTERN
|
|
57
|
+
|
|
58
|
+
# rubocop:disable Metrics/AbcSize
|
|
52
59
|
def on_lvasgn(node)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return unless receiver
|
|
60
|
+
return unless (rhs = node.rhs)
|
|
61
|
+
return unless rhs.type?(:any_block, :call) && method_returning_self?(rhs.method_name)
|
|
62
|
+
return unless (receiver = rhs.receiver)
|
|
56
63
|
|
|
57
64
|
receiver_type = ASSIGNMENT_TYPE_TO_RECEIVER_TYPE[node.type]
|
|
58
|
-
return unless receiver.type == receiver_type && receiver.children.first == lhs
|
|
65
|
+
return unless receiver.type == receiver_type && receiver.children.first == node.lhs
|
|
59
66
|
|
|
60
|
-
message = format(MSG, method_name: method_name)
|
|
67
|
+
message = format(MSG, method_name: rhs.method_name)
|
|
61
68
|
add_offense(node.loc.operator, message: message) do |corrector|
|
|
62
69
|
corrector.replace(node, rhs.source)
|
|
63
70
|
end
|
|
64
71
|
end
|
|
72
|
+
# rubocop:enable Metrics/AbcSize
|
|
65
73
|
alias on_ivasgn on_lvasgn
|
|
66
74
|
alias on_cvasgn on_lvasgn
|
|
67
75
|
alias on_gvasgn on_lvasgn
|
|
@@ -75,6 +83,7 @@ module RuboCop
|
|
|
75
83
|
corrector.remove(correction_range(node))
|
|
76
84
|
end
|
|
77
85
|
end
|
|
86
|
+
alias on_csend on_send
|
|
78
87
|
|
|
79
88
|
private
|
|
80
89
|
|
|
@@ -82,31 +91,10 @@ module RuboCop
|
|
|
82
91
|
METHODS_RETURNING_SELF.include?(method_name)
|
|
83
92
|
end
|
|
84
93
|
|
|
85
|
-
# @!method redundant_self_assignment?(node, method_name)
|
|
86
|
-
def_node_matcher :redundant_self_assignment?, <<~PATTERN
|
|
87
|
-
(send
|
|
88
|
-
(self) _
|
|
89
|
-
(send
|
|
90
|
-
(send
|
|
91
|
-
{(self) nil?} %1) #method_returning_self?
|
|
92
|
-
...))
|
|
93
|
-
PATTERN
|
|
94
|
-
|
|
95
|
-
# @!method redundant_nonself_assignment?(node, receiver, method_name)
|
|
96
|
-
def_node_matcher :redundant_nonself_assignment?, <<~PATTERN
|
|
97
|
-
(send
|
|
98
|
-
%1 _
|
|
99
|
-
(send
|
|
100
|
-
(send
|
|
101
|
-
%1 %2) #method_returning_self?
|
|
102
|
-
...))
|
|
103
|
-
PATTERN
|
|
104
|
-
|
|
105
94
|
def redundant_assignment?(node)
|
|
106
|
-
receiver_name = node.method_name.to_s
|
|
95
|
+
receiver_name = node.method_name.to_s.delete_suffix('=').to_sym
|
|
107
96
|
|
|
108
|
-
redundant_self_assignment?(node, receiver_name)
|
|
109
|
-
redundant_nonself_assignment?(node, node.receiver, receiver_name)
|
|
97
|
+
redundant_self_assignment?(node, node.receiver, receiver_name)
|
|
110
98
|
end
|
|
111
99
|
|
|
112
100
|
def correction_range(node)
|
|
@@ -23,7 +23,6 @@ module RuboCop
|
|
|
23
23
|
# foo = bar unless condition
|
|
24
24
|
#
|
|
25
25
|
class RedundantSelfAssignmentBranch < Base
|
|
26
|
-
include RangeHelp
|
|
27
26
|
extend AutoCorrector
|
|
28
27
|
|
|
29
28
|
MSG = 'Remove the self-assignment branch.'
|
|
@@ -34,16 +33,17 @@ module RuboCop
|
|
|
34
33
|
PATTERN
|
|
35
34
|
|
|
36
35
|
def on_lvasgn(node)
|
|
37
|
-
|
|
36
|
+
expression = node.expression
|
|
37
|
+
|
|
38
38
|
return unless use_if_and_else_branch?(expression)
|
|
39
39
|
|
|
40
40
|
if_branch = expression.if_branch
|
|
41
41
|
else_branch = expression.else_branch
|
|
42
42
|
return if inconvertible_to_modifier?(if_branch, else_branch)
|
|
43
43
|
|
|
44
|
-
if self_assign?(
|
|
44
|
+
if self_assign?(node.name, if_branch)
|
|
45
45
|
register_offense(expression, if_branch, else_branch, 'unless')
|
|
46
|
-
elsif self_assign?(
|
|
46
|
+
elsif self_assign?(node.name, else_branch)
|
|
47
47
|
register_offense(expression, else_branch, if_branch, 'if')
|
|
48
48
|
end
|
|
49
49
|
end
|
|
@@ -93,9 +93,9 @@ module RuboCop
|
|
|
93
93
|
(call $(call _ $:sort_by _) ${:last :first})
|
|
94
94
|
(send $(send _ $:sort_by _) ${:[] :at :slice} {(int 0) (int -1)})
|
|
95
95
|
|
|
96
|
-
(call (
|
|
96
|
+
(call (any_block $(call _ ${:sort_by :sort}) ...) ${:last :first})
|
|
97
97
|
(call
|
|
98
|
-
(
|
|
98
|
+
(any_block $(call _ ${:sort_by :sort}) ...)
|
|
99
99
|
${:[] :at :slice} {(int 0) (int -1)}
|
|
100
100
|
)
|
|
101
101
|
}
|
|
@@ -201,7 +201,7 @@ module RuboCop
|
|
|
201
201
|
def with_logical_operator?(node)
|
|
202
202
|
return false unless (parent = node.parent)
|
|
203
203
|
|
|
204
|
-
parent.
|
|
204
|
+
parent.operator_keyword?
|
|
205
205
|
end
|
|
206
206
|
end
|
|
207
207
|
end
|
|
@@ -21,6 +21,7 @@ module RuboCop
|
|
|
21
21
|
|
|
22
22
|
MSG_BLOCK = 'Use `sort` instead of `sort_by { |%<var>s| %<var>s }`.'
|
|
23
23
|
MSG_NUMBLOCK = 'Use `sort` instead of `sort_by { _1 }`.'
|
|
24
|
+
MSG_ITBLOCK = 'Use `sort` instead of `sort_by { it }`.'
|
|
24
25
|
|
|
25
26
|
def on_block(node)
|
|
26
27
|
redundant_sort_by_block(node) do |send, var_name|
|
|
@@ -36,7 +37,17 @@ module RuboCop
|
|
|
36
37
|
redundant_sort_by_numblock(node) do |send|
|
|
37
38
|
range = sort_by_range(send, node)
|
|
38
39
|
|
|
39
|
-
add_offense(range, message:
|
|
40
|
+
add_offense(range, message: MSG_NUMBLOCK) do |corrector|
|
|
41
|
+
corrector.replace(range, 'sort')
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def on_itblock(node)
|
|
47
|
+
redundant_sort_by_itblock(node) do |send|
|
|
48
|
+
range = sort_by_range(send, node)
|
|
49
|
+
|
|
50
|
+
add_offense(range, message: MSG_ITBLOCK) do |corrector|
|
|
40
51
|
corrector.replace(range, 'sort')
|
|
41
52
|
end
|
|
42
53
|
end
|
|
@@ -54,6 +65,11 @@ module RuboCop
|
|
|
54
65
|
(numblock $(call _ :sort_by) 1 (lvar :_1))
|
|
55
66
|
PATTERN
|
|
56
67
|
|
|
68
|
+
# @!method redundant_sort_by_itblock(node)
|
|
69
|
+
def_node_matcher :redundant_sort_by_itblock, <<~PATTERN
|
|
70
|
+
(itblock $(call _ :sort_by) _ (lvar :it))
|
|
71
|
+
PATTERN
|
|
72
|
+
|
|
57
73
|
def sort_by_range(send, node)
|
|
58
74
|
range_between(send.loc.selector.begin_pos, node.loc.end.end_pos)
|
|
59
75
|
end
|
|
@@ -41,7 +41,7 @@ module RuboCop
|
|
|
41
41
|
MSG = 'Redundant escape of %<char>s inside string literal.'
|
|
42
42
|
|
|
43
43
|
def on_str(node)
|
|
44
|
-
return if node.parent&.
|
|
44
|
+
return if node.parent&.type?(:regexp, :xstr) || node.character_literal?
|
|
45
45
|
|
|
46
46
|
str_contents_range = str_contents_range(node)
|
|
47
47
|
|
|
@@ -147,7 +147,7 @@ module RuboCop
|
|
|
147
147
|
end
|
|
148
148
|
|
|
149
149
|
def heredoc?(node)
|
|
150
|
-
|
|
150
|
+
node.type?(:str, :dstr) && node.heredoc?
|
|
151
151
|
end
|
|
152
152
|
|
|
153
153
|
def delimiter?(node, char)
|
|
@@ -155,7 +155,7 @@ module RuboCop
|
|
|
155
155
|
end
|
|
156
156
|
|
|
157
157
|
def preferred_delimiters
|
|
158
|
-
config.for_cop('Style/PercentLiteralDelimiters')
|
|
158
|
+
config.for_cop('Style/PercentLiteralDelimiters')['PreferredDelimiters']['%r'].chars
|
|
159
159
|
end
|
|
160
160
|
|
|
161
161
|
def allowed_omit_parentheses_with_percent_r_literal?(node)
|
|
@@ -67,21 +67,23 @@ module RuboCop
|
|
|
67
67
|
node.parent && parentheses?(node.parent)
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
+
# rubocop:disable Metrics/AbcSize
|
|
70
71
|
def correct_rescue_block(corrector, node, parenthesized)
|
|
71
|
-
operation
|
|
72
|
-
*_, rescue_args = *rescue_modifier
|
|
72
|
+
operation = node.body
|
|
73
73
|
|
|
74
74
|
node_indentation, node_offset = indentation_and_offset(node, parenthesized)
|
|
75
75
|
|
|
76
|
+
corrector.wrap(operation, '[', ']') if operation.array_type? && !operation.bracketed?
|
|
76
77
|
corrector.remove(range_between(operation.source_range.end_pos, node.source_range.end_pos))
|
|
77
78
|
corrector.insert_before(operation, "begin\n#{node_indentation}")
|
|
78
79
|
corrector.insert_after(heredoc_end(operation) || operation, <<~RESCUE_CLAUSE.chop)
|
|
79
80
|
|
|
80
81
|
#{node_offset}rescue
|
|
81
|
-
#{node_indentation}#{
|
|
82
|
+
#{node_indentation}#{node.resbody_branches.first.body.source}
|
|
82
83
|
#{node_offset}end
|
|
83
84
|
RESCUE_CLAUSE
|
|
84
85
|
end
|
|
86
|
+
# rubocop:enable Metrics/AbcSize
|
|
85
87
|
|
|
86
88
|
def indentation_and_offset(node, parenthesized)
|
|
87
89
|
node_indentation = indentation(node)
|
|
@@ -47,7 +47,7 @@ module RuboCop
|
|
|
47
47
|
|
|
48
48
|
def on_return(node)
|
|
49
49
|
# Check Lint/NonLocalExitFromIterator first before this cop
|
|
50
|
-
node.each_ancestor(:block, :
|
|
50
|
+
node.each_ancestor(:block, :any_def) do |n|
|
|
51
51
|
break if scoped_node?(n)
|
|
52
52
|
|
|
53
53
|
send_node, args_node, _body_node = *n
|
|
@@ -83,7 +83,7 @@ module RuboCop
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
def scoped_node?(node)
|
|
86
|
-
node.
|
|
86
|
+
node.any_def_type? || node.lambda?
|
|
87
87
|
end
|
|
88
88
|
|
|
89
89
|
# @!method chained_send?(node)
|
|
@@ -21,6 +21,11 @@ module RuboCop
|
|
|
21
21
|
# We have limited the cop to not register an offense for method chains
|
|
22
22
|
# that exceed this option's value.
|
|
23
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.
|
|
28
|
+
#
|
|
24
29
|
# @safety
|
|
25
30
|
# Autocorrection is unsafe because if a value is `false`, the resulting
|
|
26
31
|
# code will have different behavior or raise an error.
|
|
@@ -81,6 +86,10 @@ module RuboCop
|
|
|
81
86
|
# foo.baz = bar if foo
|
|
82
87
|
# foo.baz + bar if foo
|
|
83
88
|
# foo.bar > 2 if foo
|
|
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.
|
|
84
93
|
class SafeNavigation < Base # rubocop:disable Metrics/ClassLength
|
|
85
94
|
include NilMethods
|
|
86
95
|
include RangeHelp
|
|
@@ -121,6 +130,9 @@ 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
|
|
|
@@ -130,6 +142,7 @@ module RuboCop
|
|
|
130
142
|
# @!method strip_begin(node)
|
|
131
143
|
def_node_matcher :strip_begin, '{ (begin $!begin) $!(begin) }'
|
|
132
144
|
|
|
145
|
+
# rubocop:disable Metrics/AbcSize
|
|
133
146
|
def on_if(node)
|
|
134
147
|
return if allowed_if_condition?(node)
|
|
135
148
|
|
|
@@ -138,13 +151,16 @@ module RuboCop
|
|
|
138
151
|
|
|
139
152
|
body = extract_if_body(node)
|
|
140
153
|
method_call = receiver.parent
|
|
154
|
+
return if dotless_operator_call?(method_call) || method_call.double_colon?
|
|
141
155
|
|
|
142
156
|
removal_ranges = [begin_range(node, body), end_range(node, body)]
|
|
143
157
|
|
|
144
158
|
report_offense(node, method_chain, method_call, *removal_ranges) do |corrector|
|
|
159
|
+
corrector.replace(receiver, checked_variable.source) if checked_variable.csend_type?
|
|
145
160
|
corrector.insert_before(method_call.loc.dot, '&') unless method_call.safe_navigation?
|
|
146
161
|
end
|
|
147
162
|
end
|
|
163
|
+
# rubocop:enable Metrics/AbcSize
|
|
148
164
|
|
|
149
165
|
def on_and(node) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
|
150
166
|
collect_and_clauses(node).each do |(lhs, lhs_operator_range), (rhs, _rhs_operator_range)|
|
|
@@ -166,12 +182,23 @@ module RuboCop
|
|
|
166
182
|
range_with_surrounding_space(range: lhs.source_range, side: :right),
|
|
167
183
|
range_with_surrounding_space(range: lhs_operator_range, side: :right),
|
|
168
184
|
offense_range: range_between(lhs.source_range.begin_pos, rhs.source_range.end_pos)
|
|
169
|
-
)
|
|
185
|
+
) do |corrector|
|
|
186
|
+
corrector.replace(rhs_receiver, lhs_receiver.source)
|
|
187
|
+
end
|
|
188
|
+
ignore_node(node)
|
|
170
189
|
end
|
|
171
190
|
end
|
|
172
191
|
|
|
192
|
+
private
|
|
193
|
+
|
|
173
194
|
def report_offense(node, rhs, rhs_receiver, *removal_ranges, offense_range: node)
|
|
174
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
|
+
|
|
175
202
|
removal_ranges.each { |range| corrector.remove(range) }
|
|
176
203
|
yield corrector if block_given?
|
|
177
204
|
|
|
@@ -181,8 +208,6 @@ module RuboCop
|
|
|
181
208
|
end
|
|
182
209
|
end
|
|
183
210
|
|
|
184
|
-
private
|
|
185
|
-
|
|
186
211
|
def find_method_chain(node)
|
|
187
212
|
return node unless node&.parent&.call_type?
|
|
188
213
|
|
|
@@ -215,10 +240,10 @@ module RuboCop
|
|
|
215
240
|
end
|
|
216
241
|
|
|
217
242
|
def offending_node?(node, lhs_receiver, rhs, rhs_receiver) # rubocop:disable Metrics/CyclomaticComplexity
|
|
218
|
-
return false if lhs_receiver
|
|
243
|
+
return false if !matching_nodes?(lhs_receiver, rhs_receiver) || rhs_receiver.nil?
|
|
219
244
|
return false if use_var_only_in_unless_modifier?(node, lhs_receiver)
|
|
220
245
|
return false if chain_length(rhs, rhs_receiver) > max_chain_length
|
|
221
|
-
return false if unsafe_method_used?(rhs, rhs_receiver.parent)
|
|
246
|
+
return false if unsafe_method_used?(node, rhs, rhs_receiver.parent)
|
|
222
247
|
return false if rhs.send_type? && rhs.method?(:empty?)
|
|
223
248
|
|
|
224
249
|
true
|
|
@@ -236,6 +261,20 @@ module RuboCop
|
|
|
236
261
|
end
|
|
237
262
|
end
|
|
238
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
|
+
|
|
239
278
|
def handle_comments(corrector, node, method_call)
|
|
240
279
|
comments = comments(node)
|
|
241
280
|
return if comments.empty?
|
|
@@ -294,34 +333,55 @@ module RuboCop
|
|
|
294
333
|
|
|
295
334
|
receiver = method_chain.receiver
|
|
296
335
|
|
|
297
|
-
return receiver if receiver
|
|
336
|
+
return receiver if matching_nodes?(receiver, checked_variable)
|
|
298
337
|
|
|
299
338
|
find_matching_receiver_invocation(receiver, checked_variable)
|
|
300
339
|
end
|
|
301
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
|
+
|
|
302
359
|
def chain_length(method_chain, method)
|
|
303
|
-
method.each_ancestor(:
|
|
360
|
+
method.each_ancestor(:call).inject(0) do |total, ancestor|
|
|
304
361
|
break total + 1 if ancestor == method_chain
|
|
305
362
|
|
|
306
363
|
total + 1
|
|
307
364
|
end
|
|
308
365
|
end
|
|
309
366
|
|
|
310
|
-
def unsafe_method_used?(method_chain, method)
|
|
311
|
-
return true if unsafe_method?(method)
|
|
367
|
+
def unsafe_method_used?(node, method_chain, method)
|
|
368
|
+
return true if unsafe_method?(node, method)
|
|
312
369
|
|
|
313
370
|
method.each_ancestor(:send).any? do |ancestor|
|
|
314
|
-
break true unless config.
|
|
371
|
+
break true unless config.cop_enabled?('Lint/SafeNavigationChain')
|
|
315
372
|
|
|
316
|
-
break true if unsafe_method?(ancestor)
|
|
373
|
+
break true if unsafe_method?(node, ancestor)
|
|
317
374
|
break true if nil_methods.include?(ancestor.method_name)
|
|
318
375
|
break false if ancestor == method_chain
|
|
319
376
|
end
|
|
320
377
|
end
|
|
321
378
|
|
|
322
|
-
def unsafe_method?(send_node)
|
|
323
|
-
negated?(send_node)
|
|
324
|
-
|
|
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? ||
|
|
325
385
|
(!send_node.dot? && !send_node.safe_navigation?)
|
|
326
386
|
end
|
|
327
387
|
|
|
@@ -350,8 +410,7 @@ module RuboCop
|
|
|
350
410
|
method_chain)
|
|
351
411
|
start_method.each_ancestor do |ancestor|
|
|
352
412
|
break unless %i[send block].include?(ancestor.type)
|
|
353
|
-
next
|
|
354
|
-
next if ancestor.safe_navigation?
|
|
413
|
+
next if !ancestor.send_type? || ancestor.operator_method?
|
|
355
414
|
|
|
356
415
|
corrector.insert_before(ancestor.loc.dot, '&')
|
|
357
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
|
|
@@ -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
|
#
|
|
@@ -59,6 +59,7 @@ module RuboCop
|
|
|
59
59
|
{
|
|
60
60
|
(block call (args (arg $_)) ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
61
61
|
(numblock call $1 ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
62
|
+
(itblock call $_ ${(send _ %REGEXP_METHODS _) match-with-lvasgn})
|
|
62
63
|
}
|
|
63
64
|
PATTERN
|
|
64
65
|
|
|
@@ -137,6 +138,7 @@ module RuboCop
|
|
|
137
138
|
return unless (block_arg_name, regexp_method_send_node = regexp_match?(block_node))
|
|
138
139
|
|
|
139
140
|
block_arg_name = :"_#{block_arg_name}" if block_node.numblock_type?
|
|
141
|
+
|
|
140
142
|
return unless calls_lvar?(regexp_method_send_node, block_arg_name)
|
|
141
143
|
|
|
142
144
|
regexp_method_send_node
|
|
@@ -150,7 +152,8 @@ module RuboCop
|
|
|
150
152
|
return node.child_nodes.first if node.match_with_lvasgn_type?
|
|
151
153
|
|
|
152
154
|
if node.receiver.lvar_type? &&
|
|
153
|
-
(block.
|
|
155
|
+
(block.type?(:numblock, :itblock) ||
|
|
156
|
+
node.receiver.source == block.first_argument.source)
|
|
154
157
|
node.first_argument
|
|
155
158
|
elsif node.first_argument.lvar_type?
|
|
156
159
|
node.receiver
|
|
@@ -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)
|
|
@@ -119,6 +119,7 @@ module RuboCop
|
|
|
119
119
|
tokens[1]&.type == :tSTRING_DBEG && tokens[2]&.semicolon?
|
|
120
120
|
end
|
|
121
121
|
|
|
122
|
+
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
|
122
123
|
def register_semicolon(line, column, after_expression, token_before_semicolon = nil)
|
|
123
124
|
range = source_range(processed_source.buffer, line, column)
|
|
124
125
|
|
|
@@ -130,14 +131,19 @@ module RuboCop
|
|
|
130
131
|
# without parentheses.
|
|
131
132
|
# See: https://github.com/rubocop/rubocop/issues/10791
|
|
132
133
|
if token_before_semicolon&.regexp_dots?
|
|
133
|
-
|
|
134
|
-
|
|
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)
|
|
135
139
|
end
|
|
136
140
|
|
|
141
|
+
corrector.wrap(node, '(', ')') if node
|
|
137
142
|
corrector.remove(range)
|
|
138
143
|
end
|
|
139
144
|
end
|
|
140
145
|
end
|
|
146
|
+
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
141
147
|
|
|
142
148
|
def expressions_per_line(exprs)
|
|
143
149
|
# create a map matching lines to the number of expressions on them
|
|
@@ -153,9 +159,9 @@ module RuboCop
|
|
|
153
159
|
end
|
|
154
160
|
end
|
|
155
161
|
|
|
156
|
-
def
|
|
157
|
-
|
|
158
|
-
|
|
162
|
+
def find_node(nodes, token_before_semicolon)
|
|
163
|
+
nodes.detect do |node|
|
|
164
|
+
node.source_range.overlaps?(token_before_semicolon.pos)
|
|
159
165
|
end
|
|
160
166
|
end
|
|
161
167
|
|
|
@@ -164,7 +170,16 @@ module RuboCop
|
|
|
164
170
|
|
|
165
171
|
ast = processed_source.ast
|
|
166
172
|
@range_nodes = ast.range_type? ? [ast] : []
|
|
167
|
-
@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?)
|
|
168
183
|
end
|
|
169
184
|
end
|
|
170
185
|
end
|