2004-09-15 Marek Safar <marek.safar@seznam.cz>
authorMarek Safar <marek.safar@gmail.com>
Wed, 15 Sep 2004 11:11:48 +0000 (11:11 -0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 15 Sep 2004 11:11:48 +0000 (11:11 -0000)
Fixed bug #59980, #64224
* expression.cs (Invocation.DoResolve): Fixed error CS0571 test.

* typemanager.cs (IsSpecialMethod): Simplified

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

mcs/mcs/ChangeLog
mcs/mcs/expression.cs
mcs/mcs/typemanager.cs

index 87dd5b9fd5dd2c2a38d26b1205264f34dc2bf5e6..b9342f10dd494c9699eca5478b661739f453edb4 100755 (executable)
@@ -1,3 +1,10 @@
+2004-09-15  Marek Safar  <marek.safar@seznam.cz>
+
+       Fixed bug #59980, #64224
+       * expression.cs (Invocation.DoResolve): Fixed error CS0571 test.
+
+       * typemanager.cs (IsSpecialMethod): Simplified
+
 2004-09-14  Marek Safar  <marek.safar@seznam.cz>
 
        * decl.cs (MemberCore.Emit): Resuscitated VerifyObsoleteAttribute
index 89f9b9d5fc4662a9dadae7462dbbbb4542118c37..ace91f479f2a98035232272733cadcb58b4b05b5 100755 (executable)
@@ -5012,9 +5012,11 @@ namespace Mono.CSharp {
                                return null;
                        }
 
-                       if ((method.Attributes & MethodAttributes.SpecialName) != 0){
-                               if (TypeManager.IsSpecialMethod (method))
-                                       Report.Error (571, loc, method.Name + ": can not call operator or accessor");
+                       if ((method.Attributes & MethodAttributes.SpecialName) != 0) {
+                               if (TypeManager.LookupDeclSpace (method.DeclaringType) != null || TypeManager.IsSpecialMethod (method)) {
+                                       Report.Error (571, loc, TypeManager.CSharpSignature (method) + ": can not call operator or accessor");
+                                       return null;
+                               }
                        }
 
                        eclass = ExprClass.Value;
index 14817bb102aacd82f9ed81b8ecf8d47514014e14..51e7fb9339df7d4a3e4edb58b3052ef176279c67 100755 (executable)
@@ -2500,7 +2500,6 @@ public class TypeManager {
 
        static Closure closure = new Closure ();
        static MemberFilter FilterWithClosure_delegate = new MemberFilter (closure.Filter);
-       static MemberFilter FilterNone_delegate = new MemberFilter (FilterNone);
 
        //
        // Looks up a member called `name' in the `queried_type'.  This lookup
@@ -2738,85 +2737,30 @@ public class TypeManager {
                return null;
        }
 
-       //
-       // This is used to extract properties and event declarations from a type
-       //
-       static MemberInfo [] SpecialContainerLookup (Type t, bool is_static)
-       {
-               BindingFlags bf = BindingFlags.DeclaredOnly | (is_static ? BindingFlags.Static : BindingFlags.Instance);
-
-               bf |= BindingFlags.Public | BindingFlags.NonPublic;
-               
-               if (t is TypeBuilder) {
-                       DeclSpace decl = (DeclSpace) builder_to_declspace [t];
-
-                       return (MemberInfo []) decl.FindMembers (
-                               MemberTypes.Property | MemberTypes.Event,
-                               bf, FilterNone_delegate, null);
-               } else {
-                       return t.FindMembers (MemberTypes.Property | MemberTypes.Event,
-                                             bf, FilterNone_delegate, null);
-
-               }
-       }
-       
+       // Tests whether external method is really special
        public static bool IsSpecialMethod (MethodBase mb)
        {
-               Type t = mb.DeclaringType;
-               
-               MemberInfo [] matches = TypeManager.SpecialContainerLookup (t, mb.IsStatic);
-               if (matches == null)
-                       return false;
-               
-               foreach (MemberInfo mi in matches){
-                       if (mi is PropertyBuilder){
-                               Pair p = (Pair) properties [mi];
-
-                               if (p.First == mb || p.Second == mb)
-                                       return true;
-                       } else if (mi is PropertyInfo){
-                               MethodInfo [] methods = ((PropertyInfo) mi).GetAccessors (true);
-                               
-                               foreach (MethodInfo m in methods){
-                                       if (m == mb)
-                                               return true;
-                               }
-                       } else if (mi is MyEventBuilder){
-                               Pair p = (Pair) events [mi];
+               string name = mb.Name;
+               if (name.StartsWith ("get_") || name.StartsWith ("set_"))
+                       return mb.DeclaringType.GetProperty (name.Substring (4)) != null;
 
-                               if (p.First == mb || p.Second == mb)
-                                       return true;
-                       } else if (mi is EventInfo){
-                               EventInfo ei = ((EventInfo) mi);
-                               
-                               if (ei.GetAddMethod (true) == mb)
-                                       return true;
-                               
-                               if (ei.GetRemoveMethod (true) == mb)
-                                       return true;
-                               
-                               if (ei.GetRaiseMethod (true) == mb)
-                                       return true;
-                       }
-               }
+               if (name.StartsWith ("add_"))
+                       return mb.DeclaringType.GetEvent (name.Substring (4)) != null;
 
-               //
-               // Now check if it is an operator method
-               //
-               string s = mb.Name;
+               if (name.StartsWith ("remove_"))
+                       return mb.DeclaringType.GetEvent (name.Substring (7)) != null;
 
-               if (s.StartsWith ("op_")){
-                       foreach (string name in Unary.oper_names){
-                               if (s == name)
+               if (name.StartsWith ("op_")){
+                       foreach (string oname in Unary.oper_names) {
+                               if (oname == name)
                                        return true;
                        }
-
-                       foreach (string name in Binary.oper_names){
-                               if (s == name)
+               
+                       foreach (string oname in Binary.oper_names) {
+                               if (oname == name)
                                        return true;
                        }
                }
-               
                return false;
        }