X-Git-Url: http://nitlanguage.org diff --git a/src/model/model.nit b/src/model/model.nit index 973cec5..2243a88 100644 --- a/src/model/model.nit +++ b/src/model/model.nit @@ -252,8 +252,8 @@ redef class MModule # The primitive type `String` var string_type: MClassType = self.get_primitive_class("String").mclass_type is lazy - # The primitive type `NativeString` - var native_string_type: MClassType = self.get_primitive_class("NativeString").mclass_type is lazy + # The primitive type `CString` + var c_string_type: MClassType = self.get_primitive_class("CString").mclass_type is lazy # A primitive type of `Array` fun array_type(elt_type: MType): MClassType do return array_class.get_mtype([elt_type]) @@ -603,7 +603,7 @@ class MClassDef # ENSURE: `bound_mtype.mclass == self.mclass` var bound_mtype: MClassType - redef var location: Location + redef var location redef fun visibility do return mclass.visibility @@ -1058,8 +1058,17 @@ abstract class MType # # `MErrorType` are used in result with conflict or inconsistencies. # + # See `is_legal_in` to check conformity with generic bounds. fun is_ok: Bool do return true + # Is the type legal in a given `mmodule` (with an optional `anchor`)? + # + # A type is valid if: + # + # * it does not contain a `MErrorType` (see `is_ok`). + # * its generic formal arguments are within their bounds. + fun is_legal_in(mmodule: MModule, anchor: nullable MClassType): Bool do return is_ok + # Can the type be resolved? # # In order to resolve open types, the formal types must make sence. @@ -1364,6 +1373,18 @@ class MGenericType return super end + redef fun is_legal_in(mmodule, anchor) + do + var mtype + if need_anchor then + assert anchor != null + mtype = anchor_to(mmodule, anchor) + else + mtype = self + end + if not mtype.is_ok then return false + return mtype.is_subtype(mmodule, null, mtype.mclass.intro.bound_mtype) + end redef fun depth do @@ -1688,6 +1709,8 @@ abstract class MProxyType redef fun is_ok do return mtype.is_ok + redef fun is_legal_in(mmodule, anchor) do return mtype.is_legal_in(mmodule, anchor) + redef fun lookup_fixed(mmodule, resolved_receiver) do var t = mtype.lookup_fixed(mmodule, resolved_receiver)