X-Git-Url: http://nitlanguage.org diff --git a/src/modelize/modelize_class.nit b/src/modelize/modelize_class.nit index 091ec2d..3be6804 100644 --- a/src/modelize/modelize_class.nit +++ b/src/modelize/modelize_class.nit @@ -179,7 +179,7 @@ redef class ModelBuilder end var nfdt = nfd.n_type if nfdt != null then - var bound = resolve_mtype_unchecked(mmodule, null, nfdt, false) + var bound = resolve_mtype3_unchecked(mmodule, null, null, nfdt, false) if bound == null then return # Forward error if bound.need_anchor then # No F-bounds! @@ -256,7 +256,7 @@ redef class ModelBuilder for nsc in nclassdef.n_superclasses do specobject = false var ntype = nsc.n_type - var mtype = resolve_mtype_unchecked(mmodule, mclassdef, ntype, false) + var mtype = resolve_mtype_unchecked(mclassdef, ntype, false) if mtype == null then continue # Skip because of error if not mtype isa MClassType then error(ntype, "Error: supertypes cannot be a formal type.") @@ -274,10 +274,19 @@ redef class ModelBuilder if mclassdef.is_intro and objectclass != null then if mclass.kind == extern_kind and mclass.name != "Pointer" then # it is an extern class, but not a Pointer + if pointerclass == null then + error(nclassdef, "Error: `Pointer` must be defined first.") + return + end if specpointer then supertypes.add pointerclass.mclass_type - else if specobject and mclass.name != "Object" then - # it is a standard class without super class (but is not Object) - supertypes.add objectclass.mclass_type + else if specobject then + if mclass.name != "Object" then + # it is a standard class without super class (but is not Object) + supertypes.add objectclass.mclass_type + else if mclass.kind != interface_kind then + error(nclassdef, "Error: `Object` must be an {interface_kind}.") + return + end end end @@ -303,7 +312,6 @@ redef class ModelBuilder end # Build the classes of the module `nmodule`. - # REQUIRE: classes of imported modules are already build. (let `phase` do the job) private fun build_classes(nmodule: AModule) do # Force building recursively @@ -356,11 +364,21 @@ redef class ModelBuilder for nclassdef in nmodule.n_classdefs do if nclassdef isa AStdClassdef then var mclassdef = nclassdef.mclassdef + var mclass + var anchor + if mclassdef == null then + mclass = null + anchor = null + else + mclass = mclassdef.mclass + anchor = mclassdef.bound_mtype + end + # check bound of formal parameter - for nfd in nclassdef.n_formaldefs do + for nfd in nclassdef.n_formaldefs do var nfdt = nfd.n_type if nfdt != null and nfdt.mtype != null then - var bound = resolve_mtype(mmodule, mclassdef, nfdt) + var bound = resolve_mtype3(mmodule, mclass, anchor, nfdt) if bound == null then return # Forward error end end @@ -368,7 +386,7 @@ redef class ModelBuilder for nsc in nclassdef.n_superclasses do var ntype = nsc.n_type if ntype.mtype != null then - var mtype = resolve_mtype(mmodule, mclassdef, ntype) + var mtype = resolve_mtype3(mmodule, mclass, anchor, ntype) if mtype == null then return # Forward error end end