rubocop 1.69.2 → 1.75.1
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 +4 -4
- data/config/default.yml +154 -23
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +3 -1
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli.rb +1 -1
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +52 -9
- 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_validator.rb +20 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +1 -1
- data/lib/rubocop/cop/base.rb +6 -0
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -3
- 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/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +1 -1
- 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 +229 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +91 -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/on_send_without_on_csend.rb +90 -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/undefined_config.rb +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -8
- data/lib/rubocop/cop/layout/block_alignment.rb +4 -1
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +4 -4
- 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 +1 -1
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +28 -1
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +22 -2
- 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 +3 -8
- 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 +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +1 -0
- 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 +9 -4
- 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 +1 -0
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +16 -11
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- 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 +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +1 -0
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +7 -4
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- 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_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +0 -14
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- 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_expression.rb +0 -2
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +6 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -1
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +103 -9
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -3
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +8 -4
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +4 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +18 -31
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -1
- 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_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +258 -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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/return_in_void_context.rb +4 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +8 -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/unescaped_bracket_in_regexp.rb +1 -4
- 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 +2 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +5 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +2 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/void.rb +12 -9
- 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/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- 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/code_length_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +13 -13
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +4 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +1 -1
- 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 +1 -1
- 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/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +48 -24
- data/lib/rubocop/cop/mixin/range_help.rb +15 -3
- 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 +1 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +15 -3
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/method_name.rb +64 -8
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +3 -3
- data/lib/rubocop/cop/naming/variable_name.rb +51 -6
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +34 -5
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +39 -28
- data/lib/rubocop/cop/style/block_delimiters.rb +9 -21
- data/lib/rubocop/cop/style/class_and_module_children.rb +35 -10
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +10 -3
- data/lib/rubocop/cop/style/comparable_between.rb +75 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -4
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +4 -4
- 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 +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +3 -10
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +3 -3
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -0
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +2 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +24 -148
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +105 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -13
- data/lib/rubocop/cop/style/if_unless_modifier.rb +5 -5
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +1 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +2 -2
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- 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 +36 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +100 -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/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +2 -1
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +22 -15
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +2 -1
- 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/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +26 -20
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +1 -1
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/parallel_assignment.rb +1 -5
- 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/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +14 -12
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +2 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +47 -2
- 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_format.rb +257 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -3
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +34 -13
- data/lib/rubocop/cop/style/redundant_parentheses.rb +30 -15
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_self.rb +1 -0
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +14 -28
- data/lib/rubocop/cop/style/redundant_sort.rb +2 -2
- 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/rescue_modifier.rb +3 -0
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +4 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +4 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +41 -106
- data/lib/rubocop/cop/style/string_concatenation.rb +2 -2
- 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/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -0
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- 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/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +10 -5
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +9 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +1 -1
- data/lib/rubocop/cops_documentation_generator.rb +25 -14
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +85 -0
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +39 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +10 -7
- data/lib/rubocop/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +30 -8
- data/lib/rubocop.rb +16 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +65 -0
- metadata +59 -16
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -23,6 +23,10 @@ module RuboCop
|
|
23
23
|
# `define_method`, therefore, `super` used within these blocks will be allowed.
|
24
24
|
# This approach might result in false negatives, yet ensuring safe detection takes precedence.
|
25
25
|
#
|
26
|
+
# NOTE: When forwarding the same arguments but replacing the block argument with a new inline
|
27
|
+
# block, it is not necessary to explicitly list the non-block arguments. As such, an offense
|
28
|
+
# will be registered in this case.
|
29
|
+
#
|
26
30
|
# @example
|
27
31
|
# # bad
|
28
32
|
# def method(*args, **kwargs)
|
@@ -44,6 +48,16 @@ module RuboCop
|
|
44
48
|
# super()
|
45
49
|
# end
|
46
50
|
#
|
51
|
+
# # bad - forwarding with overridden block
|
52
|
+
# def method(*args, **kwargs, &block)
|
53
|
+
# super(*args, **kwargs) { do_something }
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# # good - implicitly passing all non-block arguments
|
57
|
+
# def method(*args, **kwargs, &block)
|
58
|
+
# super { do_something }
|
59
|
+
# end
|
60
|
+
#
|
47
61
|
# # good - assigning to the block variable before calling super
|
48
62
|
# def method(&block)
|
49
63
|
# # Assigning to the block variable would pass the old value to super,
|
@@ -58,46 +72,77 @@ module RuboCop
|
|
58
72
|
ASSIGN_TYPES = %i[or_asgn lvasgn].freeze
|
59
73
|
|
60
74
|
MSG = 'Call `super` without arguments and parentheses when the signature is identical.'
|
75
|
+
MSG_INLINE_BLOCK = 'Call `super` without arguments and parentheses when all positional ' \
|
76
|
+
'and keyword arguments are forwarded.'
|
61
77
|
|
62
78
|
def on_super(super_node)
|
63
|
-
def_node = super_node
|
79
|
+
return unless (def_node = find_def_node(super_node))
|
80
|
+
|
81
|
+
def_node_args = def_node.arguments.argument_list
|
82
|
+
super_args = preprocess_super_args(super_node.arguments)
|
83
|
+
|
84
|
+
return unless arguments_identical?(def_node, super_node, def_node_args, super_args)
|
85
|
+
|
86
|
+
# If the number of arguments to the def node and super node are different here,
|
87
|
+
# it's because the block argument is not forwarded.
|
88
|
+
message = def_node_args.size == super_args.size ? MSG : MSG_INLINE_BLOCK
|
89
|
+
add_offense(super_node, message: message) do |corrector|
|
90
|
+
corrector.replace(super_node, 'super')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
def find_def_node(super_node)
|
97
|
+
super_node.ancestors.find do |node|
|
64
98
|
# When defining dynamic methods, implicitly calling `super` is not possible.
|
65
99
|
# Since there is a possibility of delegation to `define_method`,
|
66
100
|
# `super` used within the block is always allowed.
|
67
|
-
break if node.
|
101
|
+
break if node.any_block_type? && !block_sends_to_super?(super_node, node)
|
68
102
|
|
69
103
|
break node if DEF_TYPES.include?(node.type)
|
70
104
|
end
|
71
|
-
return unless def_node
|
72
|
-
return unless arguments_identical?(def_node, def_node.arguments.argument_list,
|
73
|
-
super_node.arguments)
|
74
|
-
|
75
|
-
add_offense(super_node) { |corrector| corrector.replace(super_node, 'super') }
|
76
105
|
end
|
77
106
|
|
78
|
-
private
|
79
|
-
|
80
107
|
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
81
|
-
def arguments_identical?(def_node, def_args, super_args)
|
82
|
-
|
83
|
-
return false if def_args.size != super_args.size
|
108
|
+
def arguments_identical?(def_node, super_node, def_args, super_args)
|
109
|
+
return false if argument_list_size_differs?(def_args, super_args, super_node)
|
84
110
|
|
85
111
|
def_args.zip(super_args).each do |def_arg, super_arg|
|
86
112
|
next if positional_arg_same?(def_arg, super_arg)
|
87
113
|
next if positional_rest_arg_same(def_arg, super_arg)
|
88
114
|
next if keyword_arg_same?(def_arg, super_arg)
|
89
115
|
next if keyword_rest_arg_same?(def_arg, super_arg)
|
90
|
-
next if block_arg_same?(def_node, def_arg, super_arg)
|
116
|
+
next if block_arg_same?(def_node, super_node, def_arg, super_arg)
|
91
117
|
next if forward_arg_same?(def_arg, super_arg)
|
92
118
|
|
93
119
|
return false
|
94
120
|
end
|
121
|
+
|
95
122
|
true
|
96
123
|
end
|
97
124
|
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
98
125
|
|
126
|
+
def argument_list_size_differs?(def_args, super_args, super_node)
|
127
|
+
# If the def node has a block argument and the super node has an explicit block,
|
128
|
+
# the number of arguments is the same, so ignore the def node block arg.
|
129
|
+
def_args_size = def_args.size
|
130
|
+
def_args_size -= 1 if def_args.any?(&:blockarg_type?) && block_sends_to_super?(super_node)
|
131
|
+
|
132
|
+
def_args_size != super_args.size
|
133
|
+
end
|
134
|
+
|
135
|
+
def block_sends_to_super?(super_node, parent_node = super_node.parent)
|
136
|
+
# Checks if the send node of a block is the given super node,
|
137
|
+
# or a method chain containing it.
|
138
|
+
return false unless parent_node
|
139
|
+
return false unless parent_node.any_block_type?
|
140
|
+
|
141
|
+
parent_node.send_node.each_node(:super).any?(super_node)
|
142
|
+
end
|
143
|
+
|
99
144
|
def positional_arg_same?(def_arg, super_arg)
|
100
|
-
return false unless def_arg.
|
145
|
+
return false unless def_arg.type?(:arg, :optarg)
|
101
146
|
return false unless super_arg.lvar_type?
|
102
147
|
|
103
148
|
def_arg.name == super_arg.children.first
|
@@ -114,7 +159,7 @@ module RuboCop
|
|
114
159
|
end
|
115
160
|
|
116
161
|
def keyword_arg_same?(def_arg, super_arg)
|
117
|
-
return false unless def_arg.
|
162
|
+
return false unless def_arg.type?(:kwarg, :kwoptarg)
|
118
163
|
return false unless (pair_node = super_arg).pair_type?
|
119
164
|
return false unless (sym_node = pair_node.key).sym_type?
|
120
165
|
return false unless (lvar_node = pair_node.value).lvar_type?
|
@@ -133,8 +178,11 @@ module RuboCop
|
|
133
178
|
def_arg.name == lvar_node.children.first
|
134
179
|
end
|
135
180
|
|
136
|
-
def block_arg_same?(def_node, def_arg, super_arg)
|
137
|
-
return false unless def_arg.blockarg_type?
|
181
|
+
def block_arg_same?(def_node, super_node, def_arg, super_arg)
|
182
|
+
return false unless def_arg.blockarg_type?
|
183
|
+
return true if block_sends_to_super?(super_node)
|
184
|
+
return false unless super_arg.block_pass_type?
|
185
|
+
|
138
186
|
# anonymous forwarding
|
139
187
|
return true if (block_pass_child = super_arg.children.first).nil? && def_arg.name.nil?
|
140
188
|
|
@@ -159,6 +159,7 @@ module RuboCop
|
|
159
159
|
{
|
160
160
|
(block $#symbol_proc_receiver? $(args (arg _var)) (send (lvar _var) $_))
|
161
161
|
(numblock $#symbol_proc_receiver? $1 (send (lvar :_1) $_))
|
162
|
+
(itblock $#symbol_proc_receiver? $_ (send (lvar :it) $_))
|
162
163
|
}
|
163
164
|
PATTERN
|
164
165
|
|
@@ -185,6 +186,7 @@ module RuboCop
|
|
185
186
|
end
|
186
187
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
187
188
|
alias on_numblock on_block
|
189
|
+
alias on_itblock on_block
|
188
190
|
|
189
191
|
def destructuring_block_argument?(argument_node)
|
190
192
|
argument_node.one? && argument_node.source.include?(',')
|
@@ -64,6 +64,7 @@ module RuboCop
|
|
64
64
|
end
|
65
65
|
|
66
66
|
alias on_numblock on_block
|
67
|
+
alias on_itblock on_block
|
67
68
|
|
68
69
|
private
|
69
70
|
|
@@ -77,7 +78,7 @@ module RuboCop
|
|
77
78
|
|
78
79
|
# @!method define_method_block?(node)
|
79
80
|
def_node_matcher :define_method_block?, <<~PATTERN
|
80
|
-
(
|
81
|
+
(any_block (send _ :define_method _) ...)
|
81
82
|
PATTERN
|
82
83
|
end
|
83
84
|
end
|
@@ -7,12 +7,15 @@ module RuboCop
|
|
7
7
|
# The supported styles are:
|
8
8
|
#
|
9
9
|
# * `consistent_comma`: Requires a comma after the last argument,
|
10
|
-
# for all parenthesized method calls with arguments.
|
10
|
+
# for all parenthesized multi-line method calls with arguments.
|
11
11
|
# * `comma`: Requires a comma after the last argument, but only for
|
12
12
|
# parenthesized method calls where each argument is on its own line.
|
13
13
|
# * `no_comma`: Requires that there is no comma after the last
|
14
14
|
# argument.
|
15
15
|
#
|
16
|
+
# Regardless of style, trailing commas are not allowed in
|
17
|
+
# single-line method calls.
|
18
|
+
#
|
16
19
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
20
|
# # bad
|
18
21
|
# method(1, 2,)
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
6
6
|
# Checks for trailing comma in array literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
10
|
-
#
|
11
|
-
# * `comma`: Requires a comma after last item in an array,
|
12
|
-
#
|
13
|
-
# * `
|
14
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline array
|
10
|
+
# literals.
|
11
|
+
# * `comma`: Requires a comma after the last item in an array, but only when each item is on
|
12
|
+
# its own line.
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in an array, but only when that item is
|
14
|
+
# followed by an immediate newline.
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in an array
|
15
16
|
#
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
18
|
# # bad
|
@@ -37,6 +38,14 @@ module RuboCop
|
|
37
38
|
# 2,
|
38
39
|
# ]
|
39
40
|
#
|
41
|
+
# # bad
|
42
|
+
# a = [1, 2,
|
43
|
+
# 3, 4]
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# a = [1, 2,
|
47
|
+
# 3, 4,]
|
48
|
+
#
|
40
49
|
# @example EnforcedStyleForMultiline: comma
|
41
50
|
# # bad
|
42
51
|
# a = [1, 2,]
|
@@ -72,6 +81,38 @@ module RuboCop
|
|
72
81
|
# 2,
|
73
82
|
# ]
|
74
83
|
#
|
84
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
85
|
+
# # bad
|
86
|
+
# a = [1, 2,]
|
87
|
+
#
|
88
|
+
# # good
|
89
|
+
# a = [1, 2]
|
90
|
+
#
|
91
|
+
# # good
|
92
|
+
# a = [
|
93
|
+
# 1, 2,
|
94
|
+
# 3,
|
95
|
+
# ]
|
96
|
+
#
|
97
|
+
# # good
|
98
|
+
# a = [
|
99
|
+
# 1, 2, 3,
|
100
|
+
# ]
|
101
|
+
#
|
102
|
+
# # good
|
103
|
+
# a = [
|
104
|
+
# 1,
|
105
|
+
# 2,
|
106
|
+
# ]
|
107
|
+
#
|
108
|
+
# # bad
|
109
|
+
# a = [1, 2,
|
110
|
+
# 3, 4,]
|
111
|
+
#
|
112
|
+
# # good
|
113
|
+
# a = [1, 2,
|
114
|
+
# 3, 4]
|
115
|
+
#
|
75
116
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
76
117
|
# # bad
|
77
118
|
# a = [1, 2,]
|
@@ -6,12 +6,13 @@ module RuboCop
|
|
6
6
|
# Checks for trailing comma in hash literals.
|
7
7
|
# The configuration options are:
|
8
8
|
#
|
9
|
-
# * `consistent_comma`: Requires a comma after the
|
10
|
-
#
|
11
|
-
# * `comma`: Requires a comma after the last item in a hash,
|
12
|
-
#
|
13
|
-
# * `
|
14
|
-
#
|
9
|
+
# * `consistent_comma`: Requires a comma after the last item of all non-empty, multiline hash
|
10
|
+
# literals.
|
11
|
+
# * `comma`: Requires a comma after the last item in a hash, but only when each item is on its
|
12
|
+
# own line.
|
13
|
+
# * `diff_comma`: Requires a comma after the last item in a hash, but only when that item is
|
14
|
+
# followed by an immediate newline.
|
15
|
+
# * `no_comma`: Does not require a comma after the last item in a hash
|
15
16
|
#
|
16
17
|
# @example EnforcedStyleForMultiline: consistent_comma
|
17
18
|
#
|
@@ -38,6 +39,14 @@ module RuboCop
|
|
38
39
|
# bar: 2,
|
39
40
|
# }
|
40
41
|
#
|
42
|
+
# # bad
|
43
|
+
# a = { foo: 1, bar: 2,
|
44
|
+
# baz: 3, qux: 4 }
|
45
|
+
#
|
46
|
+
# # good
|
47
|
+
# a = { foo: 1, bar: 2,
|
48
|
+
# baz: 3, qux: 4, }
|
49
|
+
#
|
41
50
|
# @example EnforcedStyleForMultiline: comma
|
42
51
|
#
|
43
52
|
# # bad
|
@@ -74,6 +83,39 @@ module RuboCop
|
|
74
83
|
# bar: 2,
|
75
84
|
# }
|
76
85
|
#
|
86
|
+
# @example EnforcedStyleForMultiline: diff_comma
|
87
|
+
#
|
88
|
+
# # bad
|
89
|
+
# a = { foo: 1, bar: 2, }
|
90
|
+
#
|
91
|
+
# # good
|
92
|
+
# a = { foo: 1, bar: 2 }
|
93
|
+
#
|
94
|
+
# # good
|
95
|
+
# a = {
|
96
|
+
# foo: 1, bar: 2,
|
97
|
+
# qux: 3,
|
98
|
+
# }
|
99
|
+
#
|
100
|
+
# # good
|
101
|
+
# a = {
|
102
|
+
# foo: 1, bar: 2, qux: 3,
|
103
|
+
# }
|
104
|
+
#
|
105
|
+
# # good
|
106
|
+
# a = {
|
107
|
+
# foo: 1,
|
108
|
+
# bar: 2,
|
109
|
+
# }
|
110
|
+
#
|
111
|
+
# # bad
|
112
|
+
# a = { foo: 1, bar: 2,
|
113
|
+
# baz: 3, qux: 4, }
|
114
|
+
#
|
115
|
+
# # good
|
116
|
+
# a = { foo: 1, bar: 2,
|
117
|
+
# baz: 3, qux: 4 }
|
118
|
+
#
|
77
119
|
# @example EnforcedStyleForMultiline: no_comma (default)
|
78
120
|
#
|
79
121
|
# # bad
|
@@ -113,7 +113,7 @@ module RuboCop
|
|
113
113
|
private
|
114
114
|
|
115
115
|
def in_module_or_instance_eval?(node)
|
116
|
-
node.each_ancestor(:
|
116
|
+
node.each_ancestor(:any_block, :class, :sclass, :module).each do |pnode|
|
117
117
|
case pnode.type
|
118
118
|
when :class, :sclass
|
119
119
|
return false
|
@@ -85,6 +85,12 @@ module RuboCop
|
|
85
85
|
NONCOMMUTATIVE_OPERATORS = %i[===].freeze
|
86
86
|
PROGRAM_NAMES = %i[$0 $PROGRAM_NAME].freeze
|
87
87
|
RESTRICT_ON_SEND = RuboCop::AST::Node::COMPARISON_OPERATORS
|
88
|
+
ENFORCE_YODA_STYLES = %i[
|
89
|
+
require_for_all_comparison_operators require_for_equality_operators_only
|
90
|
+
].freeze
|
91
|
+
EQUALITY_ONLY_STYLES = %i[
|
92
|
+
forbid_for_equality_operators_only require_for_equality_operators_only
|
93
|
+
].freeze
|
88
94
|
|
89
95
|
# @!method file_constant_equal_program_name?(node)
|
90
96
|
def_node_matcher :file_constant_equal_program_name?, <<~PATTERN
|
@@ -105,13 +111,11 @@ module RuboCop
|
|
105
111
|
private
|
106
112
|
|
107
113
|
def enforce_yoda?
|
108
|
-
style
|
109
|
-
style == :require_for_equality_operators_only
|
114
|
+
ENFORCE_YODA_STYLES.include?(style)
|
110
115
|
end
|
111
116
|
|
112
117
|
def equality_only?
|
113
|
-
style
|
114
|
-
style == :require_for_equality_operators_only
|
118
|
+
EQUALITY_ONLY_STYLES.include?(style)
|
115
119
|
end
|
116
120
|
|
117
121
|
def yoda_compatible_condition?(node)
|
@@ -50,6 +50,7 @@ module RuboCop
|
|
50
50
|
|
51
51
|
def on_send(node)
|
52
52
|
return unless supported_operators.include?(node.method_name.to_s)
|
53
|
+
return unless node.arguments?
|
53
54
|
|
54
55
|
lhs = node.receiver
|
55
56
|
rhs = node.first_argument
|
@@ -71,7 +72,7 @@ module RuboCop
|
|
71
72
|
end
|
72
73
|
|
73
74
|
def constant_portion?(node)
|
74
|
-
node.
|
75
|
+
node.type?(:numeric, :const)
|
75
76
|
end
|
76
77
|
|
77
78
|
def supported_operators
|
data/lib/rubocop/cop/util.rb
CHANGED
@@ -32,7 +32,7 @@ module RuboCop
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def parentheses?(node)
|
35
|
-
node.
|
35
|
+
node.loc_is?(:end, ')')
|
36
36
|
end
|
37
37
|
|
38
38
|
# rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
@@ -74,9 +74,9 @@ module RuboCop
|
|
74
74
|
|
75
75
|
def args_begin(node)
|
76
76
|
loc = node.loc
|
77
|
-
selector = if node.
|
77
|
+
selector = if node.type?(:super, :yield)
|
78
78
|
loc.keyword
|
79
|
-
elsif node.
|
79
|
+
elsif node.type?(:def, :defs)
|
80
80
|
loc.name
|
81
81
|
else
|
82
82
|
loc.selector
|
@@ -193,11 +193,18 @@ module RuboCop
|
|
193
193
|
enforced_style.sub(/^Enforced/, 'Supported').sub('Style', 'Styles')
|
194
194
|
end
|
195
195
|
|
196
|
+
def parse_regexp(text)
|
197
|
+
Regexp::Parser.parse(text)
|
198
|
+
rescue Regexp::Parser::Error
|
199
|
+
# Upon encountering an invalid regular expression,
|
200
|
+
# we aim to proceed and identify any remaining potential offenses.
|
201
|
+
nil
|
202
|
+
end
|
203
|
+
|
196
204
|
private
|
197
205
|
|
198
206
|
def compatible_external_encoding_for?(src)
|
199
|
-
src
|
200
|
-
src.force_encoding(Encoding.default_external).valid_encoding?
|
207
|
+
src.dup.force_encoding(Encoding.default_external).valid_encoding?
|
201
208
|
end
|
202
209
|
|
203
210
|
def include_or_equal?(source, target)
|
@@ -5,15 +5,19 @@ module RuboCop
|
|
5
5
|
module Utils
|
6
6
|
# Parses {Kernel#sprintf} format strings.
|
7
7
|
class FormatString
|
8
|
-
|
8
|
+
# Escaping the `#` in `INTERPOLATION` and `TEMPLATE_NAME` is necessary to
|
9
|
+
# avoid a bug in Ruby 3.2.0
|
10
|
+
# See: https://bugs.ruby-lang.org/issues/19379
|
11
|
+
DIGIT_DOLLAR = /(?<arg_number>\d+)\$/.freeze
|
12
|
+
INTERPOLATION = /\#\{.*?\}/.freeze
|
9
13
|
FLAG = /[ #0+-]|#{DIGIT_DOLLAR}/.freeze
|
10
14
|
NUMBER_ARG = /\*#{DIGIT_DOLLAR}?/.freeze
|
11
|
-
NUMBER = /\d+|#{NUMBER_ARG}/.freeze
|
15
|
+
NUMBER = /\d+|#{NUMBER_ARG}|#{INTERPOLATION}/.freeze
|
12
16
|
WIDTH = /(?<width>#{NUMBER})/.freeze
|
13
|
-
PRECISION = /\.(?<precision>#{NUMBER})/.freeze
|
17
|
+
PRECISION = /\.(?<precision>#{NUMBER}?)/.freeze
|
14
18
|
TYPE = /(?<type>[bBdiouxXeEfgGaAcps])/.freeze
|
15
19
|
NAME = /<(?<name>\w+)>/.freeze
|
16
|
-
TEMPLATE_NAME =
|
20
|
+
TEMPLATE_NAME = /(?<!\#)\{(?<name>\w+)\}/.freeze
|
17
21
|
|
18
22
|
SEQUENCE = /
|
19
23
|
% (?<type>%)
|
@@ -41,7 +45,7 @@ module RuboCop
|
|
41
45
|
#
|
42
46
|
# @see https://ruby-doc.org/core-2.6.3/Kernel.html#method-i-format
|
43
47
|
class FormatSequence
|
44
|
-
attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type
|
48
|
+
attr_reader :begin_pos, :end_pos, :flags, :width, :precision, :name, :type, :arg_number
|
45
49
|
|
46
50
|
def initialize(match)
|
47
51
|
@source = match[0]
|
@@ -52,6 +56,7 @@ module RuboCop
|
|
52
56
|
@precision = match[:precision]
|
53
57
|
@name = match[:name]
|
54
58
|
@type = match[:type]
|
59
|
+
@arg_number = match[:arg_number]
|
55
60
|
end
|
56
61
|
|
57
62
|
def percent?
|
@@ -31,11 +31,18 @@ module RuboCop
|
|
31
31
|
def assign(node)
|
32
32
|
assignment = Assignment.new(node, self)
|
33
33
|
|
34
|
-
|
34
|
+
mark_last_as_reassigned!(assignment)
|
35
35
|
|
36
36
|
@assignments << assignment
|
37
37
|
end
|
38
38
|
|
39
|
+
def mark_last_as_reassigned!(assignment)
|
40
|
+
return if captured_by_block?
|
41
|
+
return unless assignment.branch == @assignments.last&.branch
|
42
|
+
|
43
|
+
@assignments.last&.reassigned!
|
44
|
+
end
|
45
|
+
|
39
46
|
def referenced?
|
40
47
|
!@references.empty?
|
41
48
|
end
|
@@ -72,7 +79,7 @@ module RuboCop
|
|
72
79
|
parent = parent.parent if parent&.begin_type?
|
73
80
|
return false if parent.nil?
|
74
81
|
|
75
|
-
|
82
|
+
parent.type?(:if, :while, :until) && parent.modifier_form?
|
76
83
|
end
|
77
84
|
|
78
85
|
def capture_with_block!
|
@@ -100,7 +100,7 @@ module RuboCop
|
|
100
100
|
|
101
101
|
# Only block scope allows referencing outer scope variables.
|
102
102
|
node = scope.node
|
103
|
-
return nil unless node.
|
103
|
+
return nil unless node.any_block_type?
|
104
104
|
end
|
105
105
|
|
106
106
|
nil
|
@@ -113,14 +113,14 @@ module RuboCop
|
|
113
113
|
def accessible_variables
|
114
114
|
scope_stack.reverse_each.with_object([]) do |scope, variables|
|
115
115
|
variables.concat(scope.variables.values)
|
116
|
-
break variables unless scope.node.
|
116
|
+
break variables unless scope.node.any_block_type?
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
120
|
private
|
121
121
|
|
122
122
|
def mark_variable_as_captured_by_block_if_so(variable)
|
123
|
-
return unless current_scope.node.
|
123
|
+
return unless current_scope.node.any_block_type?
|
124
124
|
return if variable.scope == current_scope
|
125
125
|
|
126
126
|
variable.capture_with_block!
|
@@ -54,7 +54,7 @@ module RuboCop
|
|
54
54
|
|
55
55
|
ZERO_ARITY_SUPER_TYPE = :zsuper
|
56
56
|
|
57
|
-
TWISTED_SCOPE_TYPES = %i[block numblock class sclass defs module].freeze
|
57
|
+
TWISTED_SCOPE_TYPES = %i[block numblock itblock class sclass defs module].freeze
|
58
58
|
SCOPE_TYPES = (TWISTED_SCOPE_TYPES + [:def]).freeze
|
59
59
|
|
60
60
|
SEND_TYPE = :send
|