rubocop 1.68.0 → 1.71.2
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 +2 -2
- data/config/default.yml +77 -8
- data/lib/rubocop/cli/command/execute_runner.rb +3 -3
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/comment_config.rb +1 -1
- data/lib/rubocop/config.rb +13 -4
- data/lib/rubocop/config_loader.rb +4 -0
- data/lib/rubocop/config_loader_resolver.rb +14 -3
- data/lib/rubocop/config_validator.rb +18 -8
- data/lib/rubocop/cop/autocorrect_logic.rb +32 -35
- 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/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- 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/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 +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_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/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.rb +5 -0
- 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 +1 -2
- data/lib/rubocop/cop/layout/class_structure.rb +9 -9
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +1 -1
- 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 +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- 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 +3 -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 +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 +1 -0
- data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +15 -0
- 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 +119 -4
- 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 +2 -2
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- 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 +2 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- 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 +6 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- 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 +10 -12
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +6 -0
- 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/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- 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_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/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +19 -8
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- 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 +1 -0
- 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_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +3 -6
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- 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 +5 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- 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 +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
- 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/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- 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/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +8 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +2 -0
- data/lib/rubocop/cop/lint/self_assignment.rb +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- 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 -1
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- 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 +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +8 -11
- 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 +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +8 -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 +2 -3
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +11 -11
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +7 -2
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -4
- data/lib/rubocop/cop/mixin/hash_subset.rb +188 -0
- data/lib/rubocop/cop/mixin/line_length_help.rb +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +0 -1
- 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 +1 -1
- 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 +3 -3
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +19 -15
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +0 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +3 -4
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +1 -1
- 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 +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +24 -22
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +1 -1
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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 +3 -3
- 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/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- 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 +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +1 -1
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- 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 +0 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- 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 +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/map_into_array.rb +1 -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 +20 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -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 +2 -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/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +34 -22
- 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/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- 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 +9 -18
- 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 +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- 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_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +38 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- 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_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +44 -23
- data/lib/rubocop/cop/style/redundant_parentheses.rb +12 -12
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -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_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +8 -15
- 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_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- 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/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 +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +14 -13
- 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/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- 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/util.rb +11 -4
- data/lib/rubocop/cop/variable_force/variable.rb +14 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +22 -14
- data/lib/rubocop/directive_comment.rb +9 -8
- 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 +15 -49
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +2 -1
- data/lib/rubocop/path_util.rb +11 -8
- data/lib/rubocop/result_cache.rb +13 -13
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +4 -1
- data/lib/rubocop/rspec/support.rb +1 -2
- data/lib/rubocop/runner.rb +5 -6
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +15 -0
- data/lib/rubocop/version.rb +1 -1
- data/lib/rubocop.rb +14 -0
- data/lib/ruby_lsp/rubocop/addon.rb +78 -0
- data/lib/ruby_lsp/rubocop/wraps_built_in_lsp_runtime.rb +50 -0
- metadata +36 -15
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -4,7 +4,12 @@ module RuboCop
|
|
4
4
|
module Cop
|
5
5
|
# Common functionality for checking whether an AST node/token is aligned
|
6
6
|
# with something on a preceding or following line
|
7
|
+
# rubocop:disable Metrics/ModuleLength
|
7
8
|
module PrecedingFollowingAlignment
|
9
|
+
# Tokens that end with an `=`, as well as `<<`, that can be aligned together:
|
10
|
+
# `=`, `==`, `===`, `!=`, `<=`, `>=`, `<<` and operator assignment (`+=`, etc).
|
11
|
+
ASSIGNMENT_OR_COMPARISON_TOKENS = %i[tEQL tEQ tEQQ tNEQ tLEQ tGEQ tOP_ASGN tLSHFT].freeze
|
12
|
+
|
8
13
|
private
|
9
14
|
|
10
15
|
def allow_for_alignment?
|
@@ -19,16 +24,20 @@ module RuboCop
|
|
19
24
|
aligned_with_adjacent_line?(range, method(:aligned_operator?))
|
20
25
|
end
|
21
26
|
|
22
|
-
|
27
|
+
# Allows alignment with a preceding operator that ends with an `=`,
|
28
|
+
# including assignment and comparison operators.
|
29
|
+
def aligned_with_preceding_equals_operator(token)
|
23
30
|
preceding_line_range = token.line.downto(1)
|
24
31
|
|
25
|
-
|
32
|
+
aligned_with_equals_sign(token, preceding_line_range)
|
26
33
|
end
|
27
34
|
|
28
|
-
|
35
|
+
# Allows alignment with a subsequent operator that ends with an `=`,
|
36
|
+
# including assignment and comparison operators.
|
37
|
+
def aligned_with_subsequent_equals_operator(token)
|
29
38
|
subsequent_line_range = token.line.upto(processed_source.lines.length)
|
30
39
|
|
31
|
-
|
40
|
+
aligned_with_equals_sign(token, subsequent_line_range)
|
32
41
|
end
|
33
42
|
|
34
43
|
def aligned_with_adjacent_line?(range, predicate)
|
@@ -62,7 +71,7 @@ module RuboCop
|
|
62
71
|
next unless index
|
63
72
|
next if indent && indent != index
|
64
73
|
|
65
|
-
return yield(range, line)
|
74
|
+
return yield(range, line, lineno + 1)
|
66
75
|
end
|
67
76
|
false
|
68
77
|
end
|
@@ -74,12 +83,12 @@ module RuboCop
|
|
74
83
|
end.map(&:line)
|
75
84
|
end
|
76
85
|
|
77
|
-
def aligned_token?(range, line)
|
78
|
-
aligned_words?(range, line) ||
|
86
|
+
def aligned_token?(range, line, lineno)
|
87
|
+
aligned_words?(range, line) || aligned_equals_operator?(range, lineno)
|
79
88
|
end
|
80
89
|
|
81
|
-
def aligned_operator?(range, line)
|
82
|
-
aligned_identical?(range, line) ||
|
90
|
+
def aligned_operator?(range, line, lineno)
|
91
|
+
aligned_identical?(range, line) || aligned_equals_operator?(range, lineno)
|
83
92
|
end
|
84
93
|
|
85
94
|
def aligned_words?(range, line)
|
@@ -90,23 +99,42 @@ module RuboCop
|
|
90
99
|
token == line[left_edge, token.length]
|
91
100
|
end
|
92
101
|
|
93
|
-
def
|
94
|
-
|
95
|
-
|
102
|
+
def aligned_equals_operator?(range, lineno)
|
103
|
+
# Check that the operator is aligned with a previous assignment or comparison operator
|
104
|
+
# ie. an equals sign, an operator assignment (eg. `+=`), a comparison (`==`, `<=`, etc.).
|
105
|
+
# Since append operators (`<<`) are a type of assignment, they are allowed as well,
|
106
|
+
# despite not ending with a literal equals character.
|
107
|
+
line_range = processed_source.buffer.line_range(lineno)
|
108
|
+
return false unless line_range
|
109
|
+
|
110
|
+
# Find the specific token to avoid matching up to operators inside strings
|
111
|
+
operator_token = processed_source.tokens_within(line_range).detect do |token|
|
112
|
+
ASSIGNMENT_OR_COMPARISON_TOKENS.include?(token.type)
|
113
|
+
end
|
114
|
+
|
115
|
+
aligned_with_preceding_equals?(range, operator_token) ||
|
116
|
+
aligned_with_append_operator?(range, operator_token)
|
96
117
|
end
|
97
118
|
|
98
|
-
def
|
99
|
-
|
119
|
+
def aligned_with_preceding_equals?(range, token)
|
120
|
+
return false unless token
|
100
121
|
|
101
|
-
|
102
|
-
|
122
|
+
range.source[-1] == '=' && range.last_column == token.pos.last_column
|
123
|
+
end
|
124
|
+
|
125
|
+
def aligned_with_append_operator?(range, token)
|
126
|
+
return false unless token
|
127
|
+
|
128
|
+
((range.source == '<<' && token.equal_sign?) ||
|
129
|
+
(range.source[-1] == '=' && token.type == :tLSHFT)) &&
|
130
|
+
token && range.last_column == token.pos.last_column
|
103
131
|
end
|
104
132
|
|
105
133
|
def aligned_identical?(range, line)
|
106
134
|
range.source == line[range.column, range.size]
|
107
135
|
end
|
108
136
|
|
109
|
-
def
|
137
|
+
def aligned_with_equals_sign(token, line_range)
|
110
138
|
token_line_indent = processed_source.line_indentation(token.line)
|
111
139
|
assignment_lines = relevant_assignment_lines(line_range)
|
112
140
|
relevant_line_number = assignment_lines[1]
|
@@ -116,12 +144,9 @@ module RuboCop
|
|
116
144
|
relevant_indent = processed_source.line_indentation(relevant_line_number)
|
117
145
|
|
118
146
|
return :none if relevant_indent < token_line_indent
|
147
|
+
return :none unless processed_source.lines[relevant_line_number - 1]
|
119
148
|
|
120
|
-
|
121
|
-
|
122
|
-
return :none unless assignment_line
|
123
|
-
|
124
|
-
aligned_assignment?(token.pos, assignment_line) ? :yes : :no
|
149
|
+
aligned_equals_operator?(token.pos, relevant_line_number) ? :yes : :no
|
125
150
|
end
|
126
151
|
|
127
152
|
def assignment_lines
|
@@ -132,10 +157,14 @@ module RuboCop
|
|
132
157
|
@assignment_tokens ||= begin
|
133
158
|
tokens = processed_source.tokens.select(&:equal_sign?)
|
134
159
|
|
135
|
-
#
|
136
|
-
#
|
137
|
-
#
|
138
|
-
|
160
|
+
# We don't want to operate on equals signs which are part of an `optarg` in a
|
161
|
+
# method definition, or the separator of an endless method definition.
|
162
|
+
# For example (the equals sign to ignore is highlighted with ^):
|
163
|
+
# def method(optarg = default_val); end
|
164
|
+
# ^
|
165
|
+
# def method = foo
|
166
|
+
# ^
|
167
|
+
tokens = remove_equals_in_def(tokens, processed_source)
|
139
168
|
|
140
169
|
# Only attempt to align the first = on each line
|
141
170
|
Set.new(tokens.uniq(&:line))
|
@@ -171,11 +200,20 @@ module RuboCop
|
|
171
200
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
172
201
|
# rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
|
173
202
|
|
174
|
-
def
|
175
|
-
|
176
|
-
|
177
|
-
|
203
|
+
def remove_equals_in_def(asgn_tokens, processed_source)
|
204
|
+
nodes = processed_source.ast.each_node(:optarg, :def)
|
205
|
+
eqls_to_ignore = nodes.with_object([]) do |node, arr|
|
206
|
+
loc = if node.def_type?
|
207
|
+
node.loc.assignment if node.endless?
|
208
|
+
else
|
209
|
+
node.loc.operator
|
210
|
+
end
|
211
|
+
arr << loc.begin_pos if loc
|
212
|
+
end
|
213
|
+
|
214
|
+
asgn_tokens.reject { |t| eqls_to_ignore.include?(t.begin_pos) }
|
178
215
|
end
|
179
216
|
end
|
217
|
+
# rubocop:enable Metrics/ModuleLength
|
180
218
|
end
|
181
219
|
end
|
@@ -55,14 +55,19 @@ module RuboCop
|
|
55
55
|
end
|
56
56
|
|
57
57
|
def if_body_source(if_body)
|
58
|
-
if if_body.call_type? &&
|
59
|
-
if_body.last_argument&.hash_type? && if_body.last_argument.pairs.last&.value_omission?
|
58
|
+
if if_body.call_type? && !if_body.method?(:[]=) && omitted_value_in_last_hash_arg?(if_body)
|
60
59
|
"#{method_source(if_body)}(#{if_body.arguments.map(&:source).join(', ')})"
|
61
60
|
else
|
62
61
|
if_body.source
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
65
|
+
def omitted_value_in_last_hash_arg?(if_body)
|
66
|
+
return false unless (last_argument = if_body.last_argument)
|
67
|
+
|
68
|
+
last_argument.hash_type? && last_argument.pairs.last&.value_omission?
|
69
|
+
end
|
70
|
+
|
66
71
|
def method_source(if_body)
|
67
72
|
end_range = if_body.implicit_call? ? if_body.loc.dot.end : if_body.loc.selector
|
68
73
|
|
@@ -96,7 +101,7 @@ module RuboCop
|
|
96
101
|
end
|
97
102
|
|
98
103
|
def max_line_length
|
99
|
-
return unless config.
|
104
|
+
return unless config.cop_enabled?('Layout/LineLength')
|
100
105
|
|
101
106
|
config.for_cop('Layout/LineLength')['Max']
|
102
107
|
end
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
# A :begin node inside a :dstr, :dsym, or :regexp node is an interpolation.
|
34
34
|
node.ancestors
|
35
35
|
.drop_while { |a| !a.begin_type? }
|
36
|
-
.any? { |a| a.
|
36
|
+
.any? { |a| a.type?(:dstr, :dsym, :regexp) }
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -8,12 +8,28 @@ module RuboCop
|
|
8
8
|
@minimum_target_ruby_version
|
9
9
|
end
|
10
10
|
|
11
|
+
def required_maximum_ruby_version
|
12
|
+
@maximum_target_ruby_version
|
13
|
+
end
|
14
|
+
|
11
15
|
def minimum_target_ruby_version(version)
|
12
16
|
@minimum_target_ruby_version = version
|
13
17
|
end
|
14
18
|
|
19
|
+
def maximum_target_ruby_version(version)
|
20
|
+
@maximum_target_ruby_version = version
|
21
|
+
end
|
22
|
+
|
15
23
|
def support_target_ruby_version?(version)
|
16
|
-
|
24
|
+
# By default, no minimum or maximum versions of ruby are required
|
25
|
+
# to run any cop. In order to do a simple numerical comparison of
|
26
|
+
# the requested version against any requirements, we use 0 and
|
27
|
+
# Infinity as the default values to indicate no minimum (0) and no
|
28
|
+
# maximum (Infinity).
|
29
|
+
min = required_minimum_ruby_version || 0
|
30
|
+
max = required_maximum_ruby_version || Float::INFINITY
|
31
|
+
|
32
|
+
min <= version && max >= version
|
17
33
|
end
|
18
34
|
end
|
19
35
|
end
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
|
-
# Common methods shared by Style/TrailingCommaInArguments
|
6
|
-
# Style/
|
5
|
+
# Common methods shared by Style/TrailingCommaInArguments,
|
6
|
+
# Style/TrailingCommaInArrayLiteral and Style/TrailingCommaInHashLiteral
|
7
7
|
module TrailingComma
|
8
8
|
include ConfigurableEnforcedStyle
|
9
9
|
include RangeHelp
|
@@ -181,7 +181,7 @@ module RuboCop
|
|
181
181
|
# ...
|
182
182
|
# SOURCE
|
183
183
|
# })
|
184
|
-
return heredoc?(node.children.last) if node.
|
184
|
+
return heredoc?(node.children.last) if node.type?(:pair, :hash)
|
185
185
|
|
186
186
|
false
|
187
187
|
end
|
@@ -3,13 +3,13 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Naming
|
6
|
-
#
|
7
|
-
# to both instance and class methods.
|
6
|
+
# Avoid prefixing accessor method names with `get_` or `set_`.
|
7
|
+
# Applies to both instance and class methods.
|
8
8
|
#
|
9
|
-
# NOTE:
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# one.
|
9
|
+
# NOTE: Method names starting with `get_` or `set_` only register an offense
|
10
|
+
# when the methods match the expected arity for getters and setters respectively.
|
11
|
+
# Getters (`get_attribute`) must have no arguments to be registered,
|
12
|
+
# and setters (`set_attribute(value)`) must have exactly one.
|
13
13
|
#
|
14
14
|
# @example
|
15
15
|
# # bad
|
@@ -13,6 +13,20 @@ module RuboCop
|
|
13
13
|
# The default variable name is `block`. If the name is already in use, it will not be
|
14
14
|
# autocorrected.
|
15
15
|
#
|
16
|
+
# [NOTE]
|
17
|
+
# --
|
18
|
+
# Because of a bug in Ruby 3.3.0, when a block is referenced inside of another block,
|
19
|
+
# no offense will be registered until Ruby 3.4:
|
20
|
+
|
21
|
+
# [source,ruby]
|
22
|
+
# ----
|
23
|
+
# def foo(&block)
|
24
|
+
# # Using an anonymous block would be a syntax error on Ruby 3.3.0
|
25
|
+
# block_method { bar(&block) }
|
26
|
+
# end
|
27
|
+
# ----
|
28
|
+
# --
|
29
|
+
#
|
16
30
|
# @example EnforcedStyle: anonymous (default)
|
17
31
|
#
|
18
32
|
# # bad
|
@@ -90,21 +104,11 @@ module RuboCop
|
|
90
104
|
last_argument.source == block_pass_node.source
|
91
105
|
end
|
92
106
|
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
# def foo(&)
|
97
|
-
# block_method do
|
98
|
-
# bar(&)
|
99
|
-
# end
|
100
|
-
# end
|
101
|
-
#
|
102
|
-
# $ ruby -vc foo.rb
|
103
|
-
# ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-darwin22]
|
104
|
-
# foo.rb: foo.rb:4: anonymous block parameter is also used within block (SyntaxError)
|
105
|
-
#
|
107
|
+
# Ruby 3.3.0 had a bug where accessing an anonymous block argument inside of a block
|
108
|
+
# was a syntax error in unambiguous cases: https://bugs.ruby-lang.org/issues/20090
|
109
|
+
# We disallow this also for earlier Ruby versions so that code is forwards compatible.
|
106
110
|
def invalidates_syntax?(block_pass_node)
|
107
|
-
block_pass_node.each_ancestor(:
|
111
|
+
target_ruby_version <= 3.3 && block_pass_node.each_ancestor(:any_block).any?
|
108
112
|
end
|
109
113
|
|
110
114
|
def use_kwarg_in_method_definition?(node)
|
@@ -138,7 +142,7 @@ module RuboCop
|
|
138
142
|
def use_block_argument_as_local_variable?(node, last_argument)
|
139
143
|
return false if node.body.nil?
|
140
144
|
|
141
|
-
node.body.
|
145
|
+
node.body.each_node(:lvar, :lvasgn).any? do |lvar|
|
142
146
|
!lvar.parent.block_pass_type? && lvar.node_parts[0].to_s == last_argument
|
143
147
|
end
|
144
148
|
end
|
@@ -31,12 +31,11 @@ module RuboCop
|
|
31
31
|
PATTERN
|
32
32
|
|
33
33
|
def on_casgn(node)
|
34
|
-
if node.parent&.or_asgn_type?
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
end
|
34
|
+
value = if node.parent&.or_asgn_type?
|
35
|
+
node.parent.expression
|
36
|
+
else
|
37
|
+
node.expression
|
38
|
+
end
|
40
39
|
|
41
40
|
# We cannot know the result of method calls like
|
42
41
|
# NewClass = something_that_returns_a_class
|
@@ -46,7 +45,7 @@ module RuboCop
|
|
46
45
|
# SomeClass = Class.new(...)
|
47
46
|
# SomeClass = Struct.new(...)
|
48
47
|
return if allowed_assignment?(value)
|
49
|
-
return if SNAKE_CASE.match?(
|
48
|
+
return if SNAKE_CASE.match?(node.name)
|
50
49
|
|
51
50
|
add_offense(node.loc.name)
|
52
51
|
end
|
@@ -37,8 +37,6 @@ module RuboCop
|
|
37
37
|
#
|
38
38
|
# anything/using_snake_case.rake
|
39
39
|
class FileName < Base
|
40
|
-
include RangeHelp
|
41
|
-
|
42
40
|
MSG_SNAKE_CASE = 'The name of this source file (`%<basename>s`) should use snake_case.'
|
43
41
|
MSG_NO_DEFINITION = '`%<basename>s` should define a class or module called `%<namespace>s`.'
|
44
42
|
MSG_REGEX = '`%<basename>s` should match `%<regex>s`.'
|
@@ -155,6 +155,7 @@ module RuboCop
|
|
155
155
|
UNDERSCORE_REQUIRED = 'Memoized variable `%<var>s` does not start ' \
|
156
156
|
'with `_`. Use `@%<suggested_var>s` instead.'
|
157
157
|
DYNAMIC_DEFINE_METHODS = %i[define_method define_singleton_method].to_set.freeze
|
158
|
+
INITIALIZE_METHODS = %i[initialize initialize_clone initialize_copy initialize_dup].freeze
|
158
159
|
|
159
160
|
# @!method method_definition?(node)
|
160
161
|
def_node_matcher :method_definition?, <<~PATTERN
|
@@ -168,7 +169,7 @@ module RuboCop
|
|
168
169
|
# rubocop:disable Metrics/AbcSize
|
169
170
|
# rubocop:disable Metrics/MethodLength
|
170
171
|
def on_or_asgn(node)
|
171
|
-
lhs
|
172
|
+
lhs = node.lhs
|
172
173
|
return unless lhs.ivasgn_type?
|
173
174
|
|
174
175
|
method_node, method_name = find_definition(node)
|
@@ -181,8 +182,8 @@ module RuboCop
|
|
181
182
|
|
182
183
|
suggested_var = suggested_var(method_name)
|
183
184
|
msg = format(
|
184
|
-
message(lhs.
|
185
|
-
var: lhs.
|
185
|
+
message(lhs.name),
|
186
|
+
var: lhs.name,
|
186
187
|
suggested_var: suggested_var,
|
187
188
|
method: method_name
|
188
189
|
)
|
@@ -209,14 +210,13 @@ module RuboCop
|
|
209
210
|
method_node, method_name = find_definition(node)
|
210
211
|
return false unless method_node
|
211
212
|
|
212
|
-
|
213
|
-
defined_memoized?(method_node.body, var_name) do |defined_ivar, return_ivar, ivar_assign|
|
213
|
+
defined_memoized?(method_node.body, arg.name) do |defined_ivar, return_ivar, ivar_assign|
|
214
214
|
return false if matches?(method_name, ivar_assign)
|
215
215
|
|
216
216
|
suggested_var = suggested_var(method_name)
|
217
217
|
msg = format(
|
218
|
-
message(
|
219
|
-
var:
|
218
|
+
message(arg.name),
|
219
|
+
var: arg.name,
|
220
220
|
suggested_var: suggested_var,
|
221
221
|
method: method_name
|
222
222
|
)
|
@@ -251,11 +251,10 @@ module RuboCop
|
|
251
251
|
end
|
252
252
|
|
253
253
|
def matches?(method_name, ivar_assign)
|
254
|
-
return true if ivar_assign.nil? || method_name
|
254
|
+
return true if ivar_assign.nil? || INITIALIZE_METHODS.include?(method_name)
|
255
255
|
|
256
|
-
method_name = method_name.to_s.delete('
|
257
|
-
|
258
|
-
variable_name = variable.to_s.sub('@', '')
|
256
|
+
method_name = method_name.to_s.delete('!?=')
|
257
|
+
variable_name = ivar_assign.name.to_s.sub('@', '')
|
259
258
|
|
260
259
|
variable_name_candidates(method_name).include?(variable_name)
|
261
260
|
end
|
@@ -269,7 +268,7 @@ module RuboCop
|
|
269
268
|
end
|
270
269
|
|
271
270
|
def suggested_var(method_name)
|
272
|
-
suggestion = method_name.to_s.delete('
|
271
|
+
suggestion = method_name.to_s.delete('!?=')
|
273
272
|
|
274
273
|
style == :required ? "_#{suggestion}" : suggestion
|
275
274
|
end
|
@@ -109,11 +109,11 @@ module RuboCop
|
|
109
109
|
variable_name_matches?(lvasgn_node, name)
|
110
110
|
end
|
111
111
|
else
|
112
|
-
node.
|
112
|
+
node.name == name
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
116
|
-
# rubocop:disable Metrics/
|
116
|
+
# rubocop:disable Metrics/MethodLength
|
117
117
|
def correct_node(corrector, node, offending_name, preferred_name)
|
118
118
|
return unless node
|
119
119
|
|
@@ -129,24 +129,19 @@ module RuboCop
|
|
129
129
|
end
|
130
130
|
end
|
131
131
|
|
132
|
-
if child_node.
|
132
|
+
if child_node.type?(:masgn, :lvasgn)
|
133
133
|
correct_reassignment(corrector, child_node, offending_name, preferred_name)
|
134
134
|
break
|
135
135
|
end
|
136
136
|
end
|
137
137
|
end
|
138
|
-
# rubocop:enable Metrics/
|
138
|
+
# rubocop:enable Metrics/MethodLength
|
139
139
|
|
140
140
|
# If the exception variable is reassigned, that assignment needs to be corrected.
|
141
141
|
# Further `lvar` nodes will not be corrected though since they now refer to a
|
142
142
|
# different variable.
|
143
143
|
def correct_reassignment(corrector, node, offending_name, preferred_name)
|
144
|
-
|
145
|
-
correct_node(corrector, node.child_nodes.first, offending_name, preferred_name)
|
146
|
-
elsif node.masgn_type?
|
147
|
-
# With multiple assign, the assignments are in an array as the last child
|
148
|
-
correct_node(corrector, node.children.last, offending_name, preferred_name)
|
149
|
-
end
|
144
|
+
correct_node(corrector, node.rhs, offending_name, preferred_name)
|
150
145
|
end
|
151
146
|
|
152
147
|
def preferred_name(variable_name)
|
@@ -159,10 +154,7 @@ module RuboCop
|
|
159
154
|
end
|
160
155
|
|
161
156
|
def variable_name(node)
|
162
|
-
|
163
|
-
return unless asgn_node
|
164
|
-
|
165
|
-
asgn_node.children.last
|
157
|
+
node.exception_variable.name if node.exception_variable.respond_to?(:name)
|
166
158
|
end
|
167
159
|
|
168
160
|
def message(node)
|
@@ -40,11 +40,10 @@ module RuboCop
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def on_lvasgn(node)
|
43
|
-
|
44
|
-
return
|
45
|
-
return if allowed_identifier?(name)
|
43
|
+
return unless node.name
|
44
|
+
return if allowed_identifier?(node.name)
|
46
45
|
|
47
|
-
check_name(node, name, node.loc.name)
|
46
|
+
check_name(node, node.name, node.loc.name)
|
48
47
|
end
|
49
48
|
alias on_ivasgn on_lvasgn
|
50
49
|
alias on_cvasgn on_lvasgn
|
@@ -113,10 +113,9 @@ module RuboCop
|
|
113
113
|
|
114
114
|
def on_arg(node)
|
115
115
|
@node = node
|
116
|
-
|
117
|
-
return if allowed_identifier?(name)
|
116
|
+
return if allowed_identifier?(node.name)
|
118
117
|
|
119
|
-
check_name(node, name, node.loc.name)
|
118
|
+
check_name(node, node.name, node.loc.name)
|
120
119
|
end
|
121
120
|
alias on_lvasgn on_arg
|
122
121
|
alias on_ivasgn on_arg
|
@@ -32,6 +32,7 @@ module RuboCop
|
|
32
32
|
MONUPLE_HASH_MSG =
|
33
33
|
'Delegate hash directly without wrapping in an array when only using a single value.'
|
34
34
|
REDUNDANT_HASH_MSG = 'Calling .hash on elements of a hashed array is redundant.'
|
35
|
+
RESTRICT_ON_SEND = %i[hash ^ + * |].freeze
|
35
36
|
|
36
37
|
# @!method hash_method_definition?(node)
|
37
38
|
def_node_matcher :hash_method_definition?, <<~PATTERN
|
@@ -99,6 +100,7 @@ module RuboCop
|
|
99
100
|
add_offense(node, message: REDUNDANT_HASH_MSG)
|
100
101
|
end
|
101
102
|
end
|
103
|
+
alias on_csend on_send
|
102
104
|
alias on_op_asgn on_send
|
103
105
|
end
|
104
106
|
end
|
@@ -25,18 +25,19 @@ module RuboCop
|
|
25
25
|
#
|
26
26
|
class YAMLLoad < Base
|
27
27
|
extend AutoCorrector
|
28
|
+
extend TargetRubyVersion
|
28
29
|
|
29
30
|
MSG = 'Prefer using `YAML.safe_load` over `YAML.load`.'
|
30
31
|
RESTRICT_ON_SEND = %i[load].freeze
|
31
32
|
|
33
|
+
maximum_target_ruby_version 3.0
|
34
|
+
|
32
35
|
# @!method yaml_load(node)
|
33
36
|
def_node_matcher :yaml_load, <<~PATTERN
|
34
37
|
(send (const {nil? cbase} :YAML) :load ...)
|
35
38
|
PATTERN
|
36
39
|
|
37
40
|
def on_send(node)
|
38
|
-
return if target_ruby_version >= 3.1
|
39
|
-
|
40
41
|
yaml_load(node) do
|
41
42
|
add_offense(node.loc.selector) do |corrector|
|
42
43
|
corrector.replace(node.loc.selector, 'safe_load')
|