Merge: Nitmetric fixes
authorJean Privat <jean@pryen.org>
Thu, 7 Sep 2017 14:49:00 +0000 (10:49 -0400)
committerJean Privat <jean@pryen.org>
Thu, 7 Sep 2017 14:49:00 +0000 (10:49 -0400)
Avoid some nitmetric crashes

Pull-Request: #2533

src/metrics/detect_covariance.nit
src/metrics/static_types_metrics.nit

index ba6a684..c80f929 100644 (file)
@@ -473,19 +473,19 @@ redef class MType
                end
                #print "4.is {sub} a {sup}? <- no more resolution"
 
-               assert sub isa MClassType # It is the only remaining type
-
-               # A unfixed formal type can only accept itself
-               if sup isa MFormalType then
-                       return false
+               if sub isa MBottomType or sub isa MErrorType then
+                       return true
                end
 
-               if sup isa MNullType then
-                       # `sup` accepts only null
+               assert sub isa MClassType else print_error "{sub} <? {sup}" # It is the only remaining type
+
+               # Handle sup-type when the sub-type is class-based (other cases must have be identified before).
+               if sup isa MFormalType or sup isa MNullType or sup isa MBottomType or sup isa MErrorType then
+                       # These types are not super-types of Class-based types.
                        return false
                end
 
-               assert sup isa MClassType # It is the only remaining type
+               assert sup isa MClassType else print_error "got {sup} {sub.inspect}" # It is the only remaining type
 
                # Now both are MClassType, we need to dig
 
index 5276632..45c429b 100644 (file)
@@ -53,8 +53,9 @@ private class ATypeCounterVisitor
        do
                if n isa AAnnotation then return
 
-               if n isa AType then
-                       var mclassdef = self.nclassdef.mclassdef.as(not null)
+               if n isa AType then do
+                       var mclassdef = self.nclassdef.mclassdef
+                       if mclassdef == null then break
                        var mtype = modelbuilder.resolve_mtype(mclassdef, n)
                        if mtype != null then
                                self.typecount.inc(mtype)