benches/strings: add .gitignore and `make clean`
[nit.git] / src / modelbuilder_base.nit
index b940049..9995338 100644 (file)
@@ -311,7 +311,7 @@ class ModelBuilder
                                if mt == null then return null # forward error
                                var anchor
                                if mclassdef != null then anchor = mclassdef.bound_mtype else anchor = null
-                               if not mt.is_subtype(mmodule, anchor, bound) then
+                               if not check_subtype(nt, mmodule, anchor, mt, bound) then
                                        error(nt, "Type error: expected {bound}, got {mt}")
                                        return null
                                end
@@ -320,6 +320,26 @@ class ModelBuilder
                ntype.checked_mtype = true
                return mtype
        end
+
+       # Check that `sub` is a subtype of `sup`.
+       # Do not display an error message.
+       #
+       # This method is used a an entry point for the modelize phase to test static subtypes.
+       # Some refinements could redefine it to collect statictics.
+       fun check_subtype(node: ANode, mmodule: MModule, anchor: nullable MClassType, sub, sup: MType): Bool
+       do
+               return sub.is_subtype(mmodule, anchor, sup)
+       end
+
+       # Check that `sub` and `sup` are equvalent types.
+       # Do not display an error message.
+       #
+       # This method is used a an entry point for the modelize phase to test static equivalent types.
+       # Some refinements could redefine it to collect statictics.
+       fun check_sametype(node: ANode, mmodule: MModule, anchor: nullable MClassType, sub, sup: MType): Bool
+       do
+               return sub.is_subtype(mmodule, anchor, sup) and sup.is_subtype(mmodule, anchor, sub)
+       end
 end
 
 redef class AType
@@ -355,7 +375,7 @@ redef class ADoc
        do
                var res = mdoc_cache
                if res != null then return res
-               res = new MDoc
+               res = new MDoc(location)
                for c in n_comment do
                        var text = c.text
                        if text.length < 2 then