model: add Type#length
authorJean Privat <jean@pryen.org>
Fri, 2 Aug 2013 17:13:37 +0000 (13:13 -0400)
committerJean Privat <jean@pryen.org>
Fri, 2 Aug 2013 17:13:37 +0000 (13:13 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/model/model.nit

index 80d643f..23ce2a0 100644 (file)
@@ -776,6 +776,19 @@ abstract class MType
                return 1
        end
 
+       # The length of the type seen as a tree.
+       #
+       # A -> 1
+       # G[A] -> 2
+       # H[A, B] -> 3
+       # H[G[A], B] -> 4
+       #
+       # Formal types have a length of 1.
+       fun length: Int
+       do
+               return 1
+       end
+
        # Compute all the classdefs inherited/imported.
        # The returned set contains:
        #  * the class definitions from `mmodule` and its imported modules
@@ -955,6 +968,15 @@ class MGenericType
                end
                return dmax + 1
        end
+
+       redef fun length
+       do
+               var res = 1
+               for a in self.arguments do
+                       res += a.length
+               end
+               return res
+       end
 end
 
 # A virtual formal type.
@@ -1166,6 +1188,8 @@ class MNullableType
 
        redef fun depth do return self.mtype.depth
 
+       redef fun length do return self.mtype.length
+
        redef fun collect_mclassdefs(mmodule)
        do
                assert not self.need_anchor
@@ -1235,6 +1259,20 @@ class MSignature
                return dmax + 1
        end
 
+       redef fun length
+       do
+               var res = 1
+               var t = self.return_mtype
+               if t != null then res += t.length
+               for p in mparameters do
+                       res += p.mtype.length
+               end
+               for p in mclosures do
+                       res += p.mtype.length
+               end
+               return res
+       end
+
        # REQUIRE: 1 <= mparameters.count p -> p.is_vararg
        init(mparameters: Array[MParameter], return_mtype: nullable MType)
        do