* generic.cs (DropGenericTypeArguments): New. Captures the common
[mono.git] / mcs / gmcs / generic.cs
index 0e095e5670235a1d4bd721ec5ebea47c6f30c571..e938019b20b78863e1daec5f84f8718d9579ede7 100644 (file)
@@ -1967,9 +1967,7 @@ namespace Mono.CSharp {
 
                public static TypeContainer LookupGenericTypeContainer (Type t)
                {
-                       while (t.IsGenericInstance)
-                               t = t.GetGenericTypeDefinition ();
-
+                       t = DropGenericTypeArguments (t);
                        return LookupTypeContainer (t);
                }
 
@@ -2033,6 +2031,16 @@ namespace Mono.CSharp {
                                return t.GetGenericArguments ();
                }
 
+               public static Type DropGenericTypeArguments (Type t)
+               {
+                       if (!t.IsGenericType)
+                               return t;
+                       // Micro-optimization: a generic typebuilder is always a generic type definition
+                       if (t is TypeBuilder)
+                               return t;
+                       return t.GetGenericTypeDefinition ();
+               }
+
                //
                // Whether `array' is an array of T and `enumerator' is `IEnumerable<T>'.
                // For instance "string[]" -> "IEnumerable<string>".
@@ -2260,14 +2268,12 @@ namespace Mono.CSharp {
                        int tcount = GetNumberOfTypeArguments (type);
                        int pcount = GetNumberOfTypeArguments (parent);
 
-                       if (type.IsGenericInstance)
-                               type = type.GetGenericTypeDefinition ();
-                       if (parent.IsGenericInstance)
-                               parent = parent.GetGenericTypeDefinition ();
-
                        if (tcount != pcount)
                                return false;
 
+                       type = DropGenericTypeArguments (type);
+                       parent = DropGenericTypeArguments (parent);
+
                        return type.Equals (parent);
                }
 
@@ -2582,11 +2588,7 @@ namespace Mono.CSharp {
 
                public static bool IsNullableType (Type t)
                {
-                       if (!t.IsGenericInstance)
-                               return false;
-
-                       Type gt = t.GetGenericTypeDefinition ();
-                       return gt == generic_nullable_type;
+                       return generic_nullable_type == DropGenericTypeArguments (t);
                }
        }