Type
# File typeprof-0.12.0/lib/typeprof/type.rb, line 210
def initialize(tys, elems)
raise unless tys.is_a?(Utils::Set)
@types = tys # Set
# invariant check
local = nil
tys.each do |ty|
raise ty.inspect unless ty.is_a?(Type)
local = true if ty.is_a?(Local)
end
raise if local && elems
@elems = elems
raise elems.inspect if elems && !elems.is_a?(::Hash)
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 364
def consistent?(_other)
raise "should not be called"
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 262
def each_child(&blk) # local
@types.each(&blk)
raise if @elems
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 267
def each_child_global(&blk)
@types.each(&blk)
@elems&.each do |(container_kind, base_type), elems|
yield container_kind.new(elems, base_type)
end
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 226
def each_free_type_variable(&blk)
each_child_global do |ty|
ty.each_free_type_variable(&blk)
end
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 323
def globalize(env, visited, depth)
return Type.any if depth <= 0
tys = Utils::Set[]
if @elems
# XXX: If @elems is non nil, the Union type should global, so calling globalize against such a type should not occur.
# However, currently, ActualArguments may contain global types for flag_args_kw_splat case.
# This should be fixed in future in ActualArguments side. See Scratch#setup_actual_arguments.
#raise
end
elems = @elems ? @elems.dup : {}
@types.each do |ty|
ty = ty.globalize(env, visited, depth - 1)
case ty
when Type::Array, Type::Hash
key = [ty.class, ty.base_type]
elems[key] = union_elems(elems[key], ty.elems)
else
tys = tys.add(ty)
end
end
elems = nil if elems.empty?
Type::Union.new(tys, elems).normalize
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 391
def include_untyped?(scratch)
@types.each do |ty|
return true if ty.include_untyped?(scratch)
end
@elems&.each do |(container_kind, base_type), elems|
return true if base_type.include_untyped?(scratch)
return true if elems.include_untyped?(scratch)
end
false
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 274
def inspect
a = []
a << "Type::Union{#{ @types.to_a.map {|ty| ty.inspect }.join(", ") }"
@elems&.each do |(container_kind, base_type), elems|
a << ", #{ container_kind.new(elems, base_type).inspect }"
end
a << "}"
a.join
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 232
def limit_size(limit)
return Type.any if limit <= 0
tys = Utils::Set[]
@types.each do |ty|
tys = tys.add(ty.limit_size(limit - 1))
end
elems = @elems&.to_h do |key, elems|
[key, elems.limit_size(limit - 1)]
end
Union.new(tys, elems)
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 349
def localize(env, alloc_site, depth)
return env, Type.any if depth <= 0
tys = @types.map do |ty|
env, ty2 = ty.localize(env, alloc_site, depth - 1)
ty2
end
@elems&.each do |(container_kind, base_type), elems|
ty = container_kind.new(elems, base_type)
env, ty = ty.localize(env, alloc_site, depth - 1)
tys = tys.add(ty)
end
ty = Union.new(tys, nil).normalize
return env, ty
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 246
def normalize
if @types.size == 1 && !@elems
@types.each {|ty| return ty }
elsif @types.size == 0
if @elems && @elems.size == 1
(container_kind, base_type), elems = @elems.first
# container_kind = Type::Array or Type::Hash
container_kind.new(elems, base_type)
else
self
end
else
self
end
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 284
def screen_name(scratch)
types = @types.to_a
@elems&.each do |(container_kind, base_type), elems|
types << container_kind.new(elems, base_type)
end
if types.size == 0
"bot"
else
types = types.to_a
optional = !!types.delete(Type::Instance.new(Type::Builtin[:nil]))
bool = false
if types.include?(Type::Instance.new(Type::Builtin[:false])) &&
types.include?(Type::Instance.new(Type::Builtin[:true]))
types.delete(Type::Instance.new(Type::Builtin[:false]))
types.delete(Type::Instance.new(Type::Builtin[:true]))
bool = true
end
types.delete(Type.any) unless Config.options[:show_untyped]
proc_tys, types = types.partition {|ty| ty.is_a?(Proc) }
types = types.map {|ty| ty.screen_name(scratch) }
types << scratch.show_proc_signature(proc_tys) unless proc_tys.empty?
types << "bool" if bool
types = types.sort
if optional
case types.size
when 0 then "nil"
when 1 then types.first + "?"
else
"(#{ types.join (" | ") })?"
end
else
types.join (" | ")
end
end
rescue SystemStackError
p self
raise
end
# File typeprof-0.12.0/lib/typeprof/type.rb, line 368
def substitute(subst, depth)
return Type.any if depth <= 0
unions = []
tys = Utils::Set[]
@types.each do |ty|
ty = ty.substitute(subst, depth - 1)
case ty
when Union
unions << ty
else
tys = tys.add(ty)
end
end
elems = @elems&.to_h do |(container_kind, base_type), elems|
[[container_kind, base_type], elems.substitute(subst, depth - 1)]
end
ty = Union.new(tys, elems).normalize
unions.each do |ty0|
ty = ty.union(ty0)
end
ty
end