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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
#
|
|
6
|
+
# Checks for redundant line continuation.
|
|
7
7
|
#
|
|
8
8
|
# This cop marks a line continuation as redundant if removing the backslash
|
|
9
9
|
# does not result in a syntax error.
|
|
@@ -69,17 +69,24 @@ module RuboCop
|
|
|
69
69
|
extend AutoCorrector
|
|
70
70
|
|
|
71
71
|
MSG = 'Redundant line continuation.'
|
|
72
|
+
LINE_CONTINUATION = '\\'
|
|
73
|
+
LINE_CONTINUATION_PATTERN = /(\\\n)/.freeze
|
|
72
74
|
ALLOWED_STRING_TOKENS = %i[tSTRING tSTRING_CONTENT].freeze
|
|
73
75
|
ARGUMENT_TYPES = %i[
|
|
74
|
-
kFALSE kNIL kSELF kTRUE
|
|
75
|
-
|
|
76
|
+
kDEF kDEFINED kFALSE kNIL kSELF kTRUE tAMPER tBANG tCARET tCHARACTER tCOLON3 tCONSTANT
|
|
77
|
+
tCVAR tDOT2 tDOT3 tFLOAT tGVAR tIDENTIFIER tINTEGER tIVAR tLAMBDA tLBRACK tLCURLY
|
|
78
|
+
tLPAREN_ARG tPIPE tQSYMBOLS_BEG tQWORDS_BEG tREGEXP_BEG tSTAR tSTRING tSTRING_BEG tSYMBEG
|
|
79
|
+
tSYMBOL tSYMBOLS_BEG tTILDE tUMINUS tUNARY_NUM tUPLUS tWORDS_BEG tXSTRING_BEG
|
|
76
80
|
].freeze
|
|
77
|
-
ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
|
|
81
|
+
ARGUMENT_TAKING_FLOW_TOKEN_TYPES = %i[
|
|
82
|
+
tIDENTIFIER kBREAK kNEXT kRETURN kSUPER kYIELD
|
|
83
|
+
].freeze
|
|
84
|
+
ARITHMETIC_OPERATOR_TOKENS = %i[tDIVIDE tDSTAR tMINUS tPERCENT tPLUS tSTAR2].freeze
|
|
78
85
|
|
|
79
86
|
def on_new_investigation
|
|
80
87
|
return unless processed_source.ast
|
|
81
88
|
|
|
82
|
-
each_match_range(processed_source.ast.source_range,
|
|
89
|
+
each_match_range(processed_source.ast.source_range, LINE_CONTINUATION_PATTERN) do |range|
|
|
83
90
|
next if require_line_continuation?(range)
|
|
84
91
|
next unless redundant_line_continuation?(range)
|
|
85
92
|
|
|
@@ -87,20 +94,27 @@ module RuboCop
|
|
|
87
94
|
corrector.remove_leading(range, 1)
|
|
88
95
|
end
|
|
89
96
|
end
|
|
97
|
+
|
|
98
|
+
inspect_end_of_ruby_code_line_continuation
|
|
90
99
|
end
|
|
91
100
|
|
|
92
101
|
private
|
|
93
102
|
|
|
94
103
|
def require_line_continuation?(range)
|
|
95
|
-
!
|
|
104
|
+
!ends_with_uncommented_backslash?(range) ||
|
|
96
105
|
string_concatenation?(range.source_line) ||
|
|
97
|
-
start_with_arithmetic_operator?(
|
|
106
|
+
start_with_arithmetic_operator?(range) ||
|
|
98
107
|
inside_string_literal_or_method_with_argument?(range) ||
|
|
99
108
|
leading_dot_method_chain_with_blank_line?(range)
|
|
100
109
|
end
|
|
101
110
|
|
|
102
|
-
def
|
|
103
|
-
|
|
111
|
+
def ends_with_uncommented_backslash?(range)
|
|
112
|
+
# A line continuation always needs to be the last character on the line, which
|
|
113
|
+
# means that it is impossible to have a comment following a continuation.
|
|
114
|
+
# Therefore, if the line contains a comment, it cannot end with a continuation.
|
|
115
|
+
return false if processed_source.line_with_comment?(range.line)
|
|
116
|
+
|
|
117
|
+
range.source_line.end_with?(LINE_CONTINUATION)
|
|
104
118
|
end
|
|
105
119
|
|
|
106
120
|
def string_concatenation?(source_line)
|
|
@@ -108,10 +122,13 @@ module RuboCop
|
|
|
108
122
|
end
|
|
109
123
|
|
|
110
124
|
def inside_string_literal_or_method_with_argument?(range)
|
|
125
|
+
line_range = range_by_whole_lines(range)
|
|
126
|
+
|
|
111
127
|
processed_source.tokens.each_cons(2).any? do |token, next_token|
|
|
112
128
|
next if token.line == next_token.line
|
|
113
129
|
|
|
114
|
-
inside_string_literal?(range, token) ||
|
|
130
|
+
inside_string_literal?(range, token) ||
|
|
131
|
+
method_with_argument?(line_range, token, next_token)
|
|
115
132
|
end
|
|
116
133
|
end
|
|
117
134
|
|
|
@@ -125,8 +142,28 @@ module RuboCop
|
|
|
125
142
|
return true unless (node = find_node_for_line(range.last_line))
|
|
126
143
|
return false if argument_newline?(node)
|
|
127
144
|
|
|
128
|
-
source
|
|
129
|
-
|
|
145
|
+
# Check if source is still valid without the continuation
|
|
146
|
+
source = processed_source.raw_source.dup
|
|
147
|
+
source[range.begin_pos, range.length] = "\n"
|
|
148
|
+
parse(source).valid_syntax?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def inspect_end_of_ruby_code_line_continuation
|
|
152
|
+
last_line = processed_source.lines[processed_source.ast.last_line - 1]
|
|
153
|
+
return unless code_ends_with_continuation?(last_line)
|
|
154
|
+
|
|
155
|
+
last_column = last_line.length
|
|
156
|
+
line_continuation_range = range_between(last_column - 1, last_column)
|
|
157
|
+
|
|
158
|
+
add_offense(line_continuation_range) do |corrector|
|
|
159
|
+
corrector.remove_trailing(line_continuation_range, 1)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def code_ends_with_continuation?(last_line)
|
|
164
|
+
return false if processed_source.line_with_comment?(processed_source.ast.last_line)
|
|
165
|
+
|
|
166
|
+
last_line.end_with?(LINE_CONTINUATION)
|
|
130
167
|
end
|
|
131
168
|
|
|
132
169
|
def inside_string_literal?(range, token)
|
|
@@ -137,15 +174,14 @@ module RuboCop
|
|
|
137
174
|
#
|
|
138
175
|
# do_something \
|
|
139
176
|
# argument
|
|
140
|
-
def method_with_argument?(current_token, next_token)
|
|
177
|
+
def method_with_argument?(line_range, current_token, next_token)
|
|
141
178
|
return false unless ARGUMENT_TAKING_FLOW_TOKEN_TYPES.include?(current_token.type)
|
|
179
|
+
return false unless current_token.pos.overlaps?(line_range)
|
|
142
180
|
|
|
143
181
|
ARGUMENT_TYPES.include?(next_token.type)
|
|
144
182
|
end
|
|
145
183
|
|
|
146
|
-
# rubocop:disable Metrics/AbcSize
|
|
147
184
|
def argument_newline?(node)
|
|
148
|
-
node = node.to_a.last if node.assignment?
|
|
149
185
|
return false if node.parenthesized_call?
|
|
150
186
|
|
|
151
187
|
node = node.children.first if node.root? && node.begin_type?
|
|
@@ -158,11 +194,10 @@ module RuboCop
|
|
|
158
194
|
node.loc.selector.line != node.first_argument.loc.line
|
|
159
195
|
end
|
|
160
196
|
end
|
|
161
|
-
# rubocop:enable Metrics/AbcSize
|
|
162
197
|
|
|
163
198
|
def find_node_for_line(last_line)
|
|
164
199
|
processed_source.ast.each_node do |node|
|
|
165
|
-
return node if
|
|
200
|
+
return node if same_line?(node, last_line)
|
|
166
201
|
end
|
|
167
202
|
end
|
|
168
203
|
|
|
@@ -191,8 +226,9 @@ module RuboCop
|
|
|
191
226
|
node.call_type? && !node.arguments.empty?
|
|
192
227
|
end
|
|
193
228
|
|
|
194
|
-
def start_with_arithmetic_operator?(
|
|
195
|
-
|
|
229
|
+
def start_with_arithmetic_operator?(range)
|
|
230
|
+
line_range = processed_source.buffer.line_range(range.line + 1)
|
|
231
|
+
ARITHMETIC_OPERATOR_TOKENS.include?(processed_source.first_token_of(line_range).type)
|
|
196
232
|
end
|
|
197
233
|
end
|
|
198
234
|
end
|
|
@@ -13,17 +13,16 @@ module RuboCop
|
|
|
13
13
|
# # good
|
|
14
14
|
# x if y.z.nil?
|
|
15
15
|
#
|
|
16
|
-
class RedundantParentheses < Base
|
|
16
|
+
class RedundantParentheses < Base # rubocop:disable Metrics/ClassLength
|
|
17
17
|
include Parentheses
|
|
18
18
|
extend AutoCorrector
|
|
19
19
|
|
|
20
|
-
ALLOWED_NODE_TYPES = %i[
|
|
20
|
+
ALLOWED_NODE_TYPES = %i[or send splat kwsplat].freeze
|
|
21
21
|
|
|
22
22
|
# @!method square_brackets?(node)
|
|
23
|
-
def_node_matcher :square_brackets?,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def_node_matcher :method_node_and_args, '$(call _recv _msg $...)'
|
|
23
|
+
def_node_matcher :square_brackets?, <<~PATTERN
|
|
24
|
+
(send `{(send _recv _msg) str array hash const #variable?} :[] ...)
|
|
25
|
+
PATTERN
|
|
27
26
|
|
|
28
27
|
# @!method rescue?(node)
|
|
29
28
|
def_node_matcher :rescue?, '{^resbody ^^resbody}'
|
|
@@ -31,9 +30,6 @@ module RuboCop
|
|
|
31
30
|
# @!method allowed_pin_operator?(node)
|
|
32
31
|
def_node_matcher :allowed_pin_operator?, '^(pin (begin !{lvar ivar cvar gvar}))'
|
|
33
32
|
|
|
34
|
-
# @!method arg_in_call_with_block?(node)
|
|
35
|
-
def_node_matcher :arg_in_call_with_block?, '^^(block (send _ _ equal?(%0) ...) ...)'
|
|
36
|
-
|
|
37
33
|
def on_begin(node)
|
|
38
34
|
return if !parentheses?(node) || parens_allowed?(node) || ignore_syntax?(node)
|
|
39
35
|
|
|
@@ -42,10 +38,15 @@ module RuboCop
|
|
|
42
38
|
|
|
43
39
|
private
|
|
44
40
|
|
|
41
|
+
def variable?(node)
|
|
42
|
+
node.respond_to?(:variable?) && node.variable?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
45
|
def parens_allowed?(node)
|
|
46
46
|
empty_parentheses?(node) ||
|
|
47
47
|
first_arg_begins_with_hash_literal?(node) ||
|
|
48
48
|
rescue?(node) ||
|
|
49
|
+
in_pattern_matching_in_method_argument?(node) ||
|
|
49
50
|
allowed_pin_operator?(node) ||
|
|
50
51
|
allowed_expression?(node)
|
|
51
52
|
end
|
|
@@ -53,13 +54,12 @@ module RuboCop
|
|
|
53
54
|
def ignore_syntax?(node)
|
|
54
55
|
return false unless (parent = node.parent)
|
|
55
56
|
|
|
56
|
-
parent.
|
|
57
|
+
parent.type?(:while_post, :until_post, :match_with_lvasgn) ||
|
|
57
58
|
like_method_argument_parentheses?(parent) || multiline_control_flow_statements?(node)
|
|
58
59
|
end
|
|
59
60
|
|
|
60
61
|
def allowed_expression?(node)
|
|
61
62
|
allowed_ancestor?(node) ||
|
|
62
|
-
allowed_method_call?(node) ||
|
|
63
63
|
allowed_multiple_expression?(node) ||
|
|
64
64
|
allowed_ternary?(node) ||
|
|
65
65
|
node.parent&.range_type?
|
|
@@ -70,18 +70,13 @@ module RuboCop
|
|
|
70
70
|
keyword_ancestor?(node) && parens_required?(node)
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
def allowed_method_call?(node)
|
|
74
|
-
# Don't flag `method (arg) { }`
|
|
75
|
-
arg_in_call_with_block?(node) && !parentheses?(node.parent)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
73
|
def allowed_multiple_expression?(node)
|
|
79
74
|
return false if node.children.one?
|
|
80
75
|
|
|
81
76
|
ancestor = node.ancestors.first
|
|
82
77
|
return false unless ancestor
|
|
83
78
|
|
|
84
|
-
!ancestor.
|
|
79
|
+
!ancestor.type?(:begin, :any_def, :any_block)
|
|
85
80
|
end
|
|
86
81
|
|
|
87
82
|
def allowed_ternary?(node)
|
|
@@ -98,17 +93,17 @@ module RuboCop
|
|
|
98
93
|
end
|
|
99
94
|
|
|
100
95
|
def like_method_argument_parentheses?(node)
|
|
101
|
-
return false
|
|
96
|
+
return false unless node.type?(:send, :super, :yield)
|
|
102
97
|
|
|
103
98
|
node.arguments.one? && !node.parenthesized? &&
|
|
104
|
-
!node.
|
|
99
|
+
!node.operator_method? && node.first_argument.begin_type?
|
|
105
100
|
end
|
|
106
101
|
|
|
107
102
|
def multiline_control_flow_statements?(node)
|
|
108
103
|
return false unless (parent = node.parent)
|
|
109
104
|
return false if parent.single_line?
|
|
110
105
|
|
|
111
|
-
parent.
|
|
106
|
+
parent.type?(:return, :next, :break)
|
|
112
107
|
end
|
|
113
108
|
|
|
114
109
|
def empty_parentheses?(node)
|
|
@@ -125,6 +120,13 @@ module RuboCop
|
|
|
125
120
|
hash_literal && first_argument?(node) && !parentheses?(hash_literal) && !parenthesized
|
|
126
121
|
end
|
|
127
122
|
|
|
123
|
+
def in_pattern_matching_in_method_argument?(begin_node)
|
|
124
|
+
return false unless begin_node.parent&.call_type?
|
|
125
|
+
return false unless (node = begin_node.children.first)
|
|
126
|
+
|
|
127
|
+
target_ruby_version <= 2.7 ? node.match_pattern_type? : node.match_pattern_p_type?
|
|
128
|
+
end
|
|
129
|
+
|
|
128
130
|
def method_chain_begins_with_hash_literal(node)
|
|
129
131
|
return if node.nil?
|
|
130
132
|
return node if node.hash_type?
|
|
@@ -137,29 +139,42 @@ module RuboCop
|
|
|
137
139
|
node = begin_node.children.first
|
|
138
140
|
|
|
139
141
|
if (message = find_offense_message(begin_node, node))
|
|
142
|
+
if node.range_type? && !argument_of_parenthesized_method_call?(begin_node, node)
|
|
143
|
+
begin_node = begin_node.parent
|
|
144
|
+
end
|
|
145
|
+
|
|
140
146
|
return offense(begin_node, message)
|
|
141
147
|
end
|
|
142
148
|
|
|
143
|
-
check_send(begin_node, node) if node
|
|
149
|
+
check_send(begin_node, node) if call_node?(node)
|
|
144
150
|
end
|
|
145
151
|
|
|
146
152
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
|
147
153
|
def find_offense_message(begin_node, node)
|
|
148
154
|
return 'a keyword' if keyword_with_redundant_parentheses?(node)
|
|
149
|
-
return 'a literal' if disallowed_literal?(begin_node, node)
|
|
155
|
+
return 'a literal' if node.literal? && disallowed_literal?(begin_node, node)
|
|
150
156
|
return 'a variable' if node.variable?
|
|
151
157
|
return 'a constant' if node.const_type?
|
|
158
|
+
if node.assignment? && (begin_node.parent.nil? || begin_node.parent.begin_type?)
|
|
159
|
+
return 'an assignment'
|
|
160
|
+
end
|
|
152
161
|
if node.lambda_or_proc? && (node.braces? || node.send_node.lambda_literal?)
|
|
153
162
|
return 'an expression'
|
|
154
163
|
end
|
|
164
|
+
if disallowed_one_line_pattern_matching?(begin_node, node)
|
|
165
|
+
return 'a one-line pattern matching'
|
|
166
|
+
end
|
|
155
167
|
return 'an interpolated expression' if interpolation?(begin_node)
|
|
168
|
+
return 'a method argument' if argument_of_parenthesized_method_call?(begin_node, node)
|
|
169
|
+
return 'a one-line rescue' if oneline_rescue_parentheses_required?(begin_node, node)
|
|
156
170
|
|
|
157
171
|
return if begin_node.chained?
|
|
158
172
|
|
|
159
|
-
if node.
|
|
173
|
+
if node.operator_keyword?
|
|
160
174
|
return if node.semantic_operator? && begin_node.parent
|
|
161
175
|
return if node.multiline? && allow_in_multiline_conditions?
|
|
162
176
|
return if ALLOWED_NODE_TYPES.include?(begin_node.parent&.type)
|
|
177
|
+
return if !node.and_type? && begin_node.parent&.and_type?
|
|
163
178
|
return if begin_node.parent&.if_type? && begin_node.parent.ternary?
|
|
164
179
|
|
|
165
180
|
'a logical expression'
|
|
@@ -174,18 +189,46 @@ module RuboCop
|
|
|
174
189
|
# @!method interpolation?(node)
|
|
175
190
|
def_node_matcher :interpolation?, '[^begin ^^dstr]'
|
|
176
191
|
|
|
192
|
+
def argument_of_parenthesized_method_call?(begin_node, node)
|
|
193
|
+
if node.basic_conditional? || node.rescue_type? || method_call_parentheses_required?(node)
|
|
194
|
+
return false
|
|
195
|
+
end
|
|
196
|
+
return false unless (parent = begin_node.parent)
|
|
197
|
+
|
|
198
|
+
parent.call_type? && parent.parenthesized? && parent.receiver != begin_node
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def oneline_rescue_parentheses_required?(begin_node, node)
|
|
202
|
+
return false unless node.rescue_type?
|
|
203
|
+
return false unless (parent = begin_node.parent)
|
|
204
|
+
return false if parent.if_type? && parent.ternary?
|
|
205
|
+
return false if parent.conditional? && parent.condition == begin_node
|
|
206
|
+
|
|
207
|
+
!parent.type?(:call, :array, :pair)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def method_call_parentheses_required?(node)
|
|
211
|
+
return false unless node.call_type?
|
|
212
|
+
|
|
213
|
+
(node.receiver.nil? || node.loc.dot) && node.arguments.any?
|
|
214
|
+
end
|
|
215
|
+
|
|
177
216
|
def allow_in_multiline_conditions?
|
|
178
|
-
|
|
179
|
-
|
|
217
|
+
!!config.for_enabled_cop('Style/ParenthesesAroundCondition')['AllowInMultilineConditions']
|
|
218
|
+
end
|
|
180
219
|
|
|
181
|
-
|
|
220
|
+
def call_node?(node)
|
|
221
|
+
node.call_type? || (node.any_block_type? && node.braces? && !node.lambda_or_proc?)
|
|
182
222
|
end
|
|
183
223
|
|
|
184
224
|
def check_send(begin_node, node)
|
|
225
|
+
node = node.send_node if node.any_block_type?
|
|
226
|
+
|
|
185
227
|
return check_unary(begin_node, node) if node.unary_operation?
|
|
186
228
|
|
|
187
|
-
return unless method_call_with_redundant_parentheses?(node)
|
|
188
|
-
return if call_chain_starts_with_int?(begin_node, node)
|
|
229
|
+
return unless method_call_with_redundant_parentheses?(begin_node, node)
|
|
230
|
+
return if call_chain_starts_with_int?(begin_node, node) ||
|
|
231
|
+
do_end_block_in_method_chain?(begin_node, node)
|
|
189
232
|
|
|
190
233
|
offense(begin_node, 'a method call')
|
|
191
234
|
end
|
|
@@ -194,8 +237,7 @@ module RuboCop
|
|
|
194
237
|
return if begin_node.chained?
|
|
195
238
|
|
|
196
239
|
node = node.children.first while suspect_unary?(node)
|
|
197
|
-
|
|
198
|
-
return if node.send_type? && !method_call_with_redundant_parentheses?(node)
|
|
240
|
+
return unless method_call_with_redundant_parentheses?(begin_node, node)
|
|
199
241
|
|
|
200
242
|
offense(begin_node, 'a unary operation')
|
|
201
243
|
end
|
|
@@ -215,7 +257,22 @@ module RuboCop
|
|
|
215
257
|
end
|
|
216
258
|
|
|
217
259
|
def disallowed_literal?(begin_node, node)
|
|
218
|
-
|
|
260
|
+
if node.range_type?
|
|
261
|
+
return false unless (parent = begin_node.parent)
|
|
262
|
+
|
|
263
|
+
parent.begin_type? && parent.children.one?
|
|
264
|
+
else
|
|
265
|
+
!raised_to_power_negative_numeric?(begin_node, node)
|
|
266
|
+
end
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def disallowed_one_line_pattern_matching?(begin_node, node)
|
|
270
|
+
if (parent = begin_node.parent)
|
|
271
|
+
return false if parent.any_def_type? && parent.endless?
|
|
272
|
+
return false if parent.assignment?
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
node.any_match_pattern_type? && node.each_ancestor.none?(&:operator_keyword?)
|
|
219
276
|
end
|
|
220
277
|
|
|
221
278
|
def raised_to_power_negative_numeric?(begin_node, node)
|
|
@@ -242,17 +299,23 @@ module RuboCop
|
|
|
242
299
|
end
|
|
243
300
|
end
|
|
244
301
|
|
|
245
|
-
def method_call_with_redundant_parentheses?(node)
|
|
246
|
-
return false unless node.
|
|
302
|
+
def method_call_with_redundant_parentheses?(begin_node, node)
|
|
303
|
+
return false unless node.type?(:call, :super, :yield, :defined?)
|
|
247
304
|
return false if node.prefix_not?
|
|
305
|
+
return true if singular_parenthesized_parent?(begin_node)
|
|
248
306
|
|
|
249
|
-
|
|
307
|
+
node.arguments.empty? || parentheses?(node) || square_brackets?(node)
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def singular_parenthesized_parent?(begin_node)
|
|
311
|
+
return true unless begin_node.parent
|
|
312
|
+
return false if begin_node.parent.type?(:splat, :kwsplat)
|
|
250
313
|
|
|
251
|
-
|
|
314
|
+
parentheses?(begin_node) && begin_node.parent.children.one?
|
|
252
315
|
end
|
|
253
316
|
|
|
254
317
|
def only_begin_arg?(args)
|
|
255
|
-
args.one? && args.first
|
|
318
|
+
args.one? && args.first&.begin_type?
|
|
256
319
|
end
|
|
257
320
|
|
|
258
321
|
def first_argument?(node)
|
|
@@ -285,6 +348,12 @@ module RuboCop
|
|
|
285
348
|
recv&.int_type? && (parent = begin_node.parent) &&
|
|
286
349
|
parent.send_type? && (parent.method?(:-@) || parent.method?(:+@))
|
|
287
350
|
end
|
|
351
|
+
|
|
352
|
+
def do_end_block_in_method_chain?(begin_node, node)
|
|
353
|
+
return false unless (block = node.each_descendant(:any_block).first)
|
|
354
|
+
|
|
355
|
+
block.keywords? && begin_node.each_ancestor(:call).any?
|
|
356
|
+
end
|
|
288
357
|
end
|
|
289
358
|
end
|
|
290
359
|
end
|
|
@@ -66,10 +66,17 @@ module RuboCop
|
|
|
66
66
|
DETERMINISTIC_REGEX.match?(regexp_node.source)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
|
+
# rubocop:disable Metrics/MethodLength
|
|
69
70
|
def preferred_argument(regexp_node)
|
|
70
71
|
new_argument = replacement(regexp_node)
|
|
71
72
|
|
|
72
73
|
if new_argument.include?('"')
|
|
74
|
+
new_argument.gsub!("'", "\\\\'")
|
|
75
|
+
new_argument.gsub!('\"', '"')
|
|
76
|
+
quote = "'"
|
|
77
|
+
elsif new_argument.include?("\\'")
|
|
78
|
+
quote = "'"
|
|
79
|
+
elsif new_argument.include?('\'')
|
|
73
80
|
new_argument.gsub!("'", "\\\\'")
|
|
74
81
|
quote = "'"
|
|
75
82
|
elsif new_argument.include?('\\')
|
|
@@ -80,6 +87,7 @@ module RuboCop
|
|
|
80
87
|
|
|
81
88
|
"#{quote}#{new_argument}#{quote}"
|
|
82
89
|
end
|
|
90
|
+
# rubocop:enable Metrics/MethodLength
|
|
83
91
|
|
|
84
92
|
def replacement(regexp_node)
|
|
85
93
|
regexp_content = regexp_node.content
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module RuboCop
|
|
4
4
|
module Cop
|
|
5
5
|
module Style
|
|
6
|
-
# Checks for redundant escapes inside Regexp literals.
|
|
6
|
+
# Checks for redundant escapes inside `Regexp` literals.
|
|
7
7
|
#
|
|
8
8
|
# @example
|
|
9
9
|
# # bad
|
|
@@ -41,6 +41,7 @@ module RuboCop
|
|
|
41
41
|
ALLOWED_ALWAYS_ESCAPES = " \n[]^\\#".chars.freeze
|
|
42
42
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES = '-'.chars.freeze
|
|
43
43
|
ALLOWED_OUTSIDE_CHAR_CLASS_METACHAR_ESCAPES = '.*+?{}()|$'.chars.freeze
|
|
44
|
+
INTERPOLATION_SIGILS = %w[@ $].freeze
|
|
44
45
|
|
|
45
46
|
def on_regexp(node)
|
|
46
47
|
each_escape(node) do |char, index, within_character_class|
|
|
@@ -64,6 +65,7 @@ module RuboCop
|
|
|
64
65
|
# different versions of Ruby so that e.g. /\i/ != /i/
|
|
65
66
|
return true if /[[:alnum:]]/.match?(char)
|
|
66
67
|
return true if ALLOWED_ALWAYS_ESCAPES.include?(char) || delimiter?(node, char)
|
|
68
|
+
return true if requires_escape_to_avoid_interpolation?(node.source[index], char)
|
|
67
69
|
|
|
68
70
|
if within_character_class
|
|
69
71
|
ALLOWED_WITHIN_CHAR_CLASS_METACHAR_ESCAPES.include?(char) &&
|
|
@@ -95,6 +97,12 @@ module RuboCop
|
|
|
95
97
|
delimiters.include?(char)
|
|
96
98
|
end
|
|
97
99
|
|
|
100
|
+
def requires_escape_to_avoid_interpolation?(char_before_escape, escaped_char)
|
|
101
|
+
# Preserve escapes after '#' that would otherwise trigger interpolation:
|
|
102
|
+
# '#@ivar', '#@@cvar', and '#$gvar'.
|
|
103
|
+
char_before_escape == '#' && INTERPOLATION_SIGILS.include?(escaped_char)
|
|
104
|
+
end
|
|
105
|
+
|
|
98
106
|
def each_escape(node)
|
|
99
107
|
node.parsed_tree&.traverse&.reduce(0) do |char_class_depth, (event, expr)|
|
|
100
108
|
yield(expr.text[1], expr.ts, !char_class_depth.zero?) if expr.type == :escape
|
|
@@ -61,9 +61,9 @@ module RuboCop
|
|
|
61
61
|
RESTRICT_ON_SEND = %i[define_method define_singleton_method lambda].freeze
|
|
62
62
|
|
|
63
63
|
def on_send(node)
|
|
64
|
-
return unless
|
|
64
|
+
return unless node.block_literal?
|
|
65
65
|
|
|
66
|
-
check_branch(parent.body)
|
|
66
|
+
check_branch(node.parent.body)
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
def on_def(node)
|
|
@@ -66,14 +66,15 @@ module RuboCop
|
|
|
66
66
|
# Assignment of self.x
|
|
67
67
|
|
|
68
68
|
def on_or_asgn(node)
|
|
69
|
-
lhs
|
|
70
|
-
|
|
69
|
+
allow_self(node.lhs)
|
|
70
|
+
|
|
71
|
+
lhs_name = node.lhs.lvasgn_type? ? node.lhs.name : node.lhs
|
|
72
|
+
add_lhs_to_local_variables_scopes(node.rhs, lhs_name)
|
|
71
73
|
end
|
|
72
74
|
alias on_and_asgn on_or_asgn
|
|
73
75
|
|
|
74
76
|
def on_op_asgn(node)
|
|
75
|
-
lhs
|
|
76
|
-
allow_self(lhs)
|
|
77
|
+
allow_self(node.lhs)
|
|
77
78
|
end
|
|
78
79
|
|
|
79
80
|
# Using self.x to distinguish from local variable x
|
|
@@ -92,13 +93,11 @@ module RuboCop
|
|
|
92
93
|
end
|
|
93
94
|
|
|
94
95
|
def on_masgn(node)
|
|
95
|
-
|
|
96
|
-
add_masgn_lhs_variables(rhs, lhs)
|
|
96
|
+
add_masgn_lhs_variables(node.rhs, node.lhs)
|
|
97
97
|
end
|
|
98
98
|
|
|
99
99
|
def on_lvasgn(node)
|
|
100
|
-
|
|
101
|
-
add_lhs_to_local_variables_scopes(rhs, lhs)
|
|
100
|
+
add_lhs_to_local_variables_scopes(node.rhs, node.lhs)
|
|
102
101
|
end
|
|
103
102
|
|
|
104
103
|
def on_in_pattern(node)
|
|
@@ -122,17 +121,16 @@ module RuboCop
|
|
|
122
121
|
end
|
|
123
122
|
|
|
124
123
|
alias on_numblock on_block
|
|
124
|
+
alias on_itblock on_block
|
|
125
125
|
|
|
126
126
|
def on_if(node)
|
|
127
127
|
# Allow conditional nodes to use `self` in the condition if that variable
|
|
128
128
|
# name is used in an `lvasgn` or `masgn` within the `if`.
|
|
129
|
-
node.
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
elsif child_node.masgn_type?
|
|
135
|
-
add_masgn_lhs_variables(node.condition, lhs)
|
|
129
|
+
node.each_descendant(:lvasgn, :masgn) do |descendant_node|
|
|
130
|
+
if descendant_node.lvasgn_type?
|
|
131
|
+
add_lhs_to_local_variables_scopes(node.condition, descendant_node.lhs)
|
|
132
|
+
else
|
|
133
|
+
add_masgn_lhs_variables(node.condition, descendant_node.lhs)
|
|
136
134
|
end
|
|
137
135
|
end
|
|
138
136
|
end
|
|
@@ -181,9 +179,8 @@ module RuboCop
|
|
|
181
179
|
def on_argument(node)
|
|
182
180
|
if node.mlhs_type?
|
|
183
181
|
on_args(node)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
@local_variables_scopes[node] << name
|
|
182
|
+
elsif node.respond_to?(:name)
|
|
183
|
+
@local_variables_scopes[node] << node.name
|
|
187
184
|
end
|
|
188
185
|
end
|
|
189
186
|
|