class RuboCop::Cop::Style::ArgumentsForwarding::SendNodeClassifier

Classifies send nodes for possible rest/kwrest/all (including block) forwarding.

Public Class Methods

new(def_node, send_node, referenced_lvars, forwardable_args, **config) click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 252
def initialize(def_node, send_node, referenced_lvars, forwardable_args, **config)
  @def_node = def_node
  @send_node = send_node
  @referenced_lvars = referenced_lvars
  @rest_arg, @kwrest_arg, @block_arg = *forwardable_args
  @rest_arg_name, @kwrest_arg_name, @block_arg_name =
    *forwardable_args.map { |a| a&.name }
  @config = config
end

Public Instance Methods

classification() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 280
def classification
  return nil unless forwarded_rest_arg || forwarded_kwrest_arg

  if referenced_none? && (forwarded_exactly_all? || pre_ruby_32_allow_forward_all?)
    :all
  elsif target_ruby_version >= 3.2
    :rest_or_kwrest
  end
end
forwarded_block_arg() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 274
def forwarded_block_arg
  return nil if referenced_block_arg?

  find_forwarded_block_arg(@send_node, @block_arg_name).first
end
forwarded_kwrest_arg() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 268
def forwarded_kwrest_arg
  return nil if referenced_kwrest_arg?

  find_forwarded_kwrest_arg(@send_node, @kwrest_arg_name).first
end
forwarded_rest_arg() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 262
def forwarded_rest_arg
  return nil if referenced_rest_arg?

  find_forwarded_rest_arg(@send_node, @rest_arg_name).first
end

Private Instance Methods

forwarded_exactly_all?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 308
def forwarded_exactly_all?
  @send_node.arguments.size == 3 &&
    forwarded_rest_arg &&
    forwarded_kwrest_arg &&
    forwarded_block_arg
end
pre_ruby_32_allow_forward_all?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 319
def pre_ruby_32_allow_forward_all?
  target_ruby_version < 3.2 &&
    @def_node.arguments.none?(&:default?) &&
    (@block_arg ? forwarded_block_arg : !@config.fetch(:allow_only_rest_arguments))
end
referenced_block_arg?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 300
def referenced_block_arg?
  @referenced_lvars.include?(@block_arg_name)
end
referenced_kwrest_arg?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 296
def referenced_kwrest_arg?
  @referenced_lvars.include?(@kwrest_arg_name)
end
referenced_none?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 304
def referenced_none?
  !(referenced_rest_arg? || referenced_kwrest_arg? || referenced_block_arg?)
end
referenced_rest_arg?() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 292
def referenced_rest_arg?
  @referenced_lvars.include?(@rest_arg_name)
end
target_ruby_version() click to toggle source
# File lib/rubocop/cop/style/arguments_forwarding.rb, line 315
def target_ruby_version
  @config.fetch(:target_ruby_version)
end