nitc :: MClassType :: defaultinit
# A type based on a class.
#
# `MClassType` have properties (see `has_mproperty`).
class MClassType
super MType
# The associated class
var mclass: MClass
redef fun model do return self.mclass.intro_mmodule.model
redef fun location do return mclass.location
# TODO: private init because strongly bounded to its mclass. see `mclass.mclass_type`
# The formal arguments of the type
# ENSURE: `result.length == self.mclass.arity`
var arguments = new Array[MType]
redef fun to_s do return mclass.to_s
redef fun full_name do return mclass.full_name
redef fun c_name do return mclass.c_name
redef fun need_anchor do return false
redef fun anchor_to(mmodule, anchor): MClassType
do
return super.as(MClassType)
end
redef fun resolve_for(mtype: MType, anchor: nullable MClassType, mmodule: MModule, cleanup_virtual: Bool): MClassType do return self
redef fun can_resolve_for(mtype, anchor, mmodule) do return true
redef fun collect_mclassdefs(mmodule)
do
assert not self.need_anchor
var cache = self.collect_mclassdefs_cache
if not cache.has_key(mmodule) then
self.collect_things(mmodule)
end
return cache[mmodule]
end
redef fun collect_mclasses(mmodule)
do
if collect_mclasses_last_module == mmodule then return collect_mclasses_last_module_cache
assert not self.need_anchor
var cache = self.collect_mclasses_cache
if not cache.has_key(mmodule) then
self.collect_things(mmodule)
end
var res = cache[mmodule]
collect_mclasses_last_module = mmodule
collect_mclasses_last_module_cache = res
return res
end
private var collect_mclasses_last_module: nullable MModule = null
private var collect_mclasses_last_module_cache: Set[MClass] is noinit
redef fun collect_mtypes(mmodule)
do
assert not self.need_anchor
var cache = self.collect_mtypes_cache
if not cache.has_key(mmodule) then
self.collect_things(mmodule)
end
return cache[mmodule]
end
# common implementation for `collect_mclassdefs`, `collect_mclasses`, and `collect_mtypes`.
private fun collect_things(mmodule: MModule)
do
var res = new HashSet[MClassDef]
var seen = new HashSet[MClass]
var types = new HashSet[MClassType]
seen.add(self.mclass)
var todo = [self.mclass]
while not todo.is_empty do
var mclass = todo.pop
#print "process {mclass}"
for mclassdef in mclass.mclassdefs do
if not mmodule.in_importation <= mclassdef.mmodule then continue
#print " process {mclassdef}"
res.add(mclassdef)
for supertype in mclassdef.supertypes do
types.add(supertype)
var superclass = supertype.mclass
if seen.has(superclass) then continue
#print " add {superclass}"
seen.add(superclass)
todo.add(superclass)
end
end
end
collect_mclassdefs_cache[mmodule] = res
collect_mclasses_cache[mmodule] = seen
collect_mtypes_cache[mmodule] = types
end
private var collect_mclassdefs_cache = new HashMap[MModule, Set[MClassDef]]
private var collect_mclasses_cache = new HashMap[MModule, Set[MClass]]
private var collect_mtypes_cache = new HashMap[MModule, Set[MClassType]]
redef fun mdoc_or_fallback do return mclass.mdoc_or_fallback
end
src/model/model.nit:1286,1--1394,3