[fix] #631810: Form.DialogResult needs to call its close events *before* closing.
[mono.git] / mcs / mcs / membercache.cs
index 3cd2810ce8847919fea52c82d18448d8f233372d..0dabf85b80f696ca392f8a65fb6d88001c0e8292 100644 (file)
@@ -230,9 +230,6 @@ namespace Mono.CSharp {
                                }
 
                                foreach (var ce in entry.Value) {
-                                       if (ce.DeclaringType != iface)
-                                               break;
-
                                        if (list.Contains (ce))
                                                continue;
 
@@ -328,7 +325,7 @@ namespace Mono.CSharp {
                                                continue;
                                }
 
-                               if (member.DeclaringType.ImplementsInterface (entry.DeclaringType)) {
+                               if (member.DeclaringType.ImplementsInterface (entry.DeclaringType, false)) {
                                        if (existing is MemberSpec[]) {
                                                existing = new MemberSpec[] { member };
                                                return true;
@@ -339,7 +336,7 @@ namespace Mono.CSharp {
                                }
 
                                if ((entry.DeclaringType == member.DeclaringType && entry.IsAccessor == member.IsAccessor) ||
-                                       entry.DeclaringType.ImplementsInterface (member.DeclaringType))
+                                       entry.DeclaringType.ImplementsInterface (member.DeclaringType, false))
                                        return false;
                        }
 
@@ -513,10 +510,18 @@ namespace Mono.CSharp {
                                                }
 
                                                //
-                                               // Is the member of the correct type ?
-                                               // Destructors are ignored as they cannot be overridden by user
+                                               // Is the member of same type ?
+                                               //
                                                if ((entry.Kind & ~MemberKind.Destructor & mkind & MemberKind.MaskType) == 0) {
-                                                       if ((entry.Kind & MemberKind.Destructor) == 0 && (member_param == null || !(entry is IParametersMember))) {
+                                                       // Destructors are ignored as they cannot be overridden by user
+                                                       if ((entry.Kind & MemberKind.Destructor) != 0)
+                                                               continue;
+
+                                                       // Only different arity methods hide
+                                                       if (mkind != MemberKind.Method && member.MemberName.Arity != entry.Arity)
+                                                               continue;
+                                                       
+                                                       if ((member_param == null || !(entry is IParametersMember))) {
                                                                bestCandidate = entry;
                                                                return null;
                                                        }
@@ -538,13 +543,21 @@ namespace Mono.CSharp {
                                                                continue;
 
                                                        var pm = entry as IParametersMember;
-                                                       if (pm == null)
-                                                               continue;
+                                                       AParametersCollection entry_parameters;
+                                                       if (pm == null) {
+                                                               if (entry.Kind != MemberKind.Delegate)
+                                                                       continue;
+
+                                                               // TODO: I don't have DelegateSpec
+                                                               entry_parameters = Delegate.GetParameters (member.Compiler, (TypeSpec) entry);
+                                                       } else {
+                                                               entry_parameters = pm.Parameters;
+                                                       }
 
                                                        if (entry.IsAccessor != member is AbstractPropertyEventMethod)
                                                                continue;
 
-                                                       if (!TypeSpecComparer.Override.IsEqual (pm.Parameters, member_param))
+                                                       if (!TypeSpecComparer.Override.IsEqual (entry_parameters, member_param))
                                                                continue;
                                                }
 
@@ -617,6 +630,10 @@ namespace Mono.CSharp {
                                return MemberKind.Interface;
                        if (member is EventProperty)
                                return MemberKind.Event;
+                       if (member is Delegate)
+                               return MemberKind.Delegate;
+                       if (member is Enum)
+                               return MemberKind.Enum;
 
                        throw new NotImplementedException (member.GetType ().ToString ());
                }