Object
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 80
def env
builder.env
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 164
def function(type, result,, context))
type.each_param do |param|
type(param.type, result: result, context: negate(context))
end
type(type.return_type, result: result, context: context)
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 96
def in_inherit(name,, args,, variables))
type = if name.class?
Types::ClassInstance.new(name: name, args: args, location: nil)
else
Types::Interface.new(name: name, args: args, location: nil)
end
Result.new(variables: variables).tap do |result|
type(type, result: result, context: :covariant)
end
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 84
def in_method_type(method_type,, variables))
result = Result.new(variables: variables)
function(method_type.type, result: result, context: :covariant)
if block = method_type.block
function(block.type, result: result, context: :contravariant)
end
result
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 108
def in_type_alias(name))
decl = env.alias_decls[name].decl or raise
variables = decl.type_params.each.map(&:name)
Result.new(variables: variables).tap do |result|
type(decl.type, result: result, context: :covariant)
end
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 171
def negate(variance)
case variance
when :invariant
:invariant
when :covariant
:contravariant
when :contravariant
:covariant
else
raise
end
end
# File rbs-2.1.0/lib/rbs/variance_calculator.rb, line 116
def type(type, result,, context))
case type
when Types::Variable
if result.include?(type.name)
case context
when :covariant
result.covariant(type.name)
when :contravariant
result.contravariant(type.name)
when :invariant
result.invariant(type.name)
end
end
when Types::ClassInstance, Types::Interface, Types::Alias
NoTypeFoundError.check!(type.name,
env: env,
location: type.location)
type_params = case type
when Types::ClassInstance
env.class_decls[type.name].type_params
when Types::Interface
env.interface_decls[type.name].decl.type_params
when Types::Alias
env.alias_decls[type.name].decl.type_params
end
type.args.each.with_index do |ty, i|
if var = type_params[i]
case var.variance
when :invariant
type(ty, result: result, context: :invariant)
when :covariant
type(ty, result: result, context: context)
when :contravariant
type(ty, result: result, context: negate(context))
end
end
end
when Types::Proc
function(type.type, result: result, context: context)
else
type.each_type do |ty|
type(ty, result: result, context: context)
end
end
end