* generic.cs (TypeParameter): Implement IMemberContainer.
authorRaja R Harinath <harinath@hurrynot.org>
Thu, 21 Sep 2006 15:22:11 +0000 (15:22 -0000)
committerRaja R Harinath <harinath@hurrynot.org>
Thu, 21 Sep 2006 15:22:11 +0000 (15:22 -0000)
(GenericTypeParameterBuilder): New.  An abominable repugnant hack.

svn path=/trunk/mcs/; revision=65770

mcs/mcs/ChangeLog
mcs/mcs/flowanalysis.cs
mcs/mcs/generic.cs
mcs/mcs/typemanager.cs

index 0d3c753279b5ce5fe8401d5d4a73a12f02385e0c..2c0ae182ecc9344a711e9fbcb8a40d2686c70ff7 100644 (file)
@@ -1,5 +1,8 @@
 2006-09-21  Raja R Harinath  <rharinath@novell.com>
 
+       * generic.cs (TypeParameter): Implement IMemberContainer.
+       (GenericTypeParameterBuilder): New.  An abominable repugnant hack.
+
        * rootcontext.cs: Unify with gmcs version.
 
        * report.cs: Unify with gmcs version.
index 4213bc0c49da8e5b3ee889c930d38bfb7220f339..528c0fb506e6f915f7002e7cc764b56ef92660c8 100644 (file)
@@ -1344,12 +1344,10 @@ namespace Mono.CSharp
                                        Fields = new FieldInfo [Count];
                                        public_fields.CopyTo (Fields, 0);
                                        non_public_fields.CopyTo (Fields, CountPublic);
-#if GMCS_SOURCE
                                } else if (type is GenericTypeParameterBuilder) {
                                        CountPublic = CountNonPublic = Count = 0;
 
                                        Fields = new FieldInfo [0];
-#endif
                                } else {
                                        FieldInfo[] public_fields = type.GetFields (
                                                BindingFlags.Instance|BindingFlags.Public);
index 676831210ec723a59ba0ba334b7d16f829fde8b2..d6fefe4e86291005bb21e1e72dcc9dc7c07fd0cf 100644 (file)
@@ -7,6 +7,7 @@
 // (C) 2006 Novell, Inc.
 //
 using System;
+using System.Reflection;
 using System.Collections;
 
 namespace Mono.CSharp {
@@ -19,7 +20,7 @@ namespace Mono.CSharp {
                }
        }
 
-       public abstract class TypeParameter : MemberCore {
+       public abstract class TypeParameter : MemberCore, IMemberContainer {
                private TypeParameter ()
                        : base (null, null, null)
                {
@@ -29,5 +30,40 @@ namespace Mono.CSharp {
                {
                        throw new InternalErrorException ("cannot be called");
                }
+
+#region IMemberContainer
+               public Type Type {
+                       get { throw new InternalErrorException ("cannot be called"); }
+               }
+
+               public MemberCache BaseCache {
+                       get { throw new InternalErrorException ("cannot be called"); }
+               }
+
+               public bool IsInterface {
+                       get { throw new InternalErrorException ("cannot be called"); }
+               }
+
+               public MemberList GetMembers (MemberTypes mt, BindingFlags bf)
+               {
+                       return FindMembers (mt, bf, null, null);
+               }
+
+               public MemberCache MemberCache {
+                       get { throw new InternalErrorException ("cannot be called"); }
+               }
+#endregion
+
+               public MemberList FindMembers (MemberTypes mt, BindingFlags bf,
+                                              MemberFilter filter, object criteria)
+               {
+                       throw new InternalErrorException ("cannot be called");
+               }
+       }
+}
+
+namespace System.Reflection.Emit {
+       // GRIEVOUS HACK
+       abstract class GenericTypeParameterBuilder : Type {
        }
 }
index b0acc6eff5a7e81a7be4ac5a69408a32ee8e1636..2d2335b21126a2375c3361989050a3b09916a1c0 100644 (file)
@@ -442,14 +442,12 @@ public partial class TypeManager {
                                return container.MemberCache;
                }
 
-#if GMCS_SOURCE
                if (t is GenericTypeParameterBuilder) {
                        IMemberContainer container = builder_to_type_param [t] as IMemberContainer;
 
                        if (container != null)
                                return container.MemberCache;
                }
-#endif
 
                return TypeHandle.GetMemberCache (t);
        }
@@ -1367,7 +1365,6 @@ public partial class TypeManager {
                        t.IsSubclassOf (TypeManager.array_type))
                        return new MemberList (TypeManager.array_type.FindMembers (mt, bf, filter, criteria));
 
-#if GMCS_SOURCE
                if (t is GenericTypeParameterBuilder) {
                        TypeParameter tparam = (TypeParameter) builder_to_type_param [t];
 
@@ -1377,7 +1374,6 @@ public partial class TypeManager {
                        Timer.StopTimer (TimerType.FindMembers);
                        return list;
                }
-#endif
 
                //
                // Since FindMembers will not lookup both static and instance
@@ -1469,7 +1465,6 @@ public partial class TypeManager {
                                mt, bf, name, FilterWithClosure_delegate, null);
                }
 
-#if GMCS_SOURCE
                if (t is GenericTypeParameterBuilder) {
                        TypeParameter tparam = (TypeParameter) builder_to_type_param [t];
 
@@ -1482,7 +1477,7 @@ public partial class TypeManager {
                        return (MemberInfo []) list;
                }
 
-               if (t.IsGenericType && (mt == MemberTypes.NestedType)) {
+               if (IsGenericType (t) && (mt == MemberTypes.NestedType)) {
                        //
                        // This happens if we're resolving a class'es base class and interfaces
                        // in TypeContainer.DefineType().  At this time, the types aren't
@@ -1493,7 +1488,6 @@ public partial class TypeManager {
                        used_cache = false;
                        return info;
                }
-#endif
 
                //
                // This call will always succeed.  There is exactly one TypeHandle instance per
@@ -2217,7 +2211,6 @@ public partial class TypeManager {
 
                        iface_cache [t] = result;
                        return result;
-#if GMCS_SOURCE
                } else if (t is GenericTypeParameterBuilder){
                        Type[] type_ifaces = (Type []) builder_to_ifaces [t];
                        if (type_ifaces == null || type_ifaces.Length == 0)
@@ -2225,7 +2218,6 @@ public partial class TypeManager {
 
                        iface_cache [t] = type_ifaces;
                        return type_ifaces;
-#endif
                } else {
                        Type[] ifaces = t.GetInterfaces ();
                        iface_cache [t] = ifaces;
@@ -3385,10 +3377,10 @@ public sealed class TypeHandle : IMemberContainer {
        public MemberList GetMembers (MemberTypes mt, BindingFlags bf)
        {
                 MemberInfo [] members;
-#if GMCS_SOURCE
+
                if (type is GenericTypeParameterBuilder)
                        return MemberList.Empty;
-#endif
+
                if (mt == MemberTypes.Event)
                         members = type.GetEvents (bf | BindingFlags.DeclaredOnly);
                 else