#
# TODO: better doc
#
-# TODO: liearization, closures, extern stuff
+# TODO: liearization, extern stuff
# FIXME: better handling of the types
module model
import poset
import location
-import model_base
+import mmodule
private import more_collections
redef class Model
# Return true if `self` is an subtype of `sup`.
# The typing is done using the standard typing policy of Nit.
#
- # REQUIRE: `anchor == null` implies `not self.need_anchor and not sup.need_anchor`
- # REQUIRE: `anchor != null` implies `self.can_resolve_for(anchor, null, mmodule) and sup.can_resolve_for(anchor, null, mmodule)`
+ # REQUIRE: `anchor == null implies not self.need_anchor and not sup.need_anchor`
+ # REQUIRE: `anchor != null implies self.can_resolve_for(anchor, null, mmodule) and sup.can_resolve_for(anchor, null, mmodule)`
fun is_subtype(mmodule: MModule, anchor: nullable MClassType, sup: MType): Bool
do
var sub = self
# because "redef type U: Y". Therefore, Map[T, U] is bound to
# Map[B, Y]
#
- # ENSURE: `not self.need_anchor` implies `(return) == self`
- # ENSURE: `not (return).need_anchor`
+ # ENSURE: `not self.need_anchor implies result == self`
+ # ENSURE: `not result.need_anchor`
fun anchor_to(mmodule: MModule, anchor: MClassType): MType
do
if not need_anchor then return self
# H[Int] supertype_to G #-> G[Int, Bool]
#
# REQUIRE: `super_mclass` is a super-class of `self`
- # REQUIRE: `self.need_anchor` implies `anchor != null and self.can_resolve_for(anchor, null, mmodule)`
- # ENSURE: `(return).mclass = super_mclass`
+ # REQUIRE: `self.need_anchor implies anchor != null and self.can_resolve_for(anchor, null, mmodule)`
+ # ENSURE: `result.mclass = super_mclass`
fun supertype_to(mmodule: MModule, anchor: nullable MClassType, super_mclass: MClass): MClassType
do
if super_mclass.arity == 0 then return super_mclass.mclass_type
# two function instead of one seems also to be a bad idea.
#
# REQUIRE: `can_resolve_for(mtype, anchor, mmodule)`
- # ENSURE: `not self.need_anchor` implies `(return) == self`
+ # ENSURE: `not self.need_anchor implies result == self`
fun resolve_for(mtype: MType, anchor: nullable MClassType, mmodule: MModule, cleanup_virtual: Bool): MType is abstract
# Can the type be resolved?
# B[E] is a red hearing only the E is important,
# E make sense in A
#
- # REQUIRE: `anchor != null` implies `not anchor.need_anchor`
- # REQUIRE: `mtype.need_anchor` implies `anchor != null and mtype.can_resolve_for(anchor, null, mmodule)`
- # ENSURE: `not self.need_anchor` implies `(return) == true`
+ # REQUIRE: `anchor != null implies not anchor.need_anchor`
+ # REQUIRE: `mtype.need_anchor implies anchor != null and mtype.can_resolve_for(anchor, null, mmodule)`
+ # ENSURE: `not self.need_anchor implies result == true`
fun can_resolve_for(mtype: MType, anchor: nullable MClassType, mmodule: MModule): Bool is abstract
# Return the nullable version of the type
end
# The formal arguments of the type
- # ENSURE: `(return).length == self.mclass.arity`
+ # ENSURE: `result.length == self.mclass.arity`
var arguments: Array[MType] = new Array[MType]
redef fun to_s do return mclass.to_s
redef fun collect_mtypes(mmodule) do return new HashSet[MClassType]
end
-# A signature of a method (or a closure)
+# A signature of a method
class MSignature
super MType
# The each parameter (in order)
var mparameters: Array[MParameter]
- var mclosures = new Array[MParameter]
-
# The return type (null for a procedure)
var return_mtype: nullable MType
var d = p.mtype.depth
if d > dmax then dmax = d
end
- for p in mclosures do
- var d = p.mtype.depth
- if d > dmax then dmax = d
- end
return dmax + 1
end
for p in mparameters do
res += p.mtype.length
end
- for p in mclosures do
- res += p.mtype.length
- end
return res
end
ret = ret.resolve_for(mtype, anchor, mmodule, cleanup_virtual)
end
var res = new MSignature(params, ret)
- for p in self.mclosures do
- res.mclosures.add(p.resolve_for(mtype, anchor, mmodule, cleanup_virtual))
- end
return res
end
end
# REQUIRE: `mtype.has_mproperty(mmodule, self)`
fun lookup_first_definition(mmodule: MModule, mtype: MType): MPROPDEF
do
+ assert mtype.has_mproperty(mmodule, self)
return lookup_all_definitions(mmodule, mtype).first
end