X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fmcs%2Fmembercache.cs;h=0dabf85b80f696ca392f8a65fb6d88001c0e8292;hb=cc39d7ebf1bfa8fafd6adc3a9fda354672579d1c;hp=3cd2810ce8847919fea52c82d18448d8f233372d;hpb=3a5ab11813e7e37e1a1d5fa9742ae777f4fa5c40;p=mono.git diff --git a/mcs/mcs/membercache.cs b/mcs/mcs/membercache.cs index 3cd2810ce88..0dabf85b80f 100644 --- a/mcs/mcs/membercache.cs +++ b/mcs/mcs/membercache.cs @@ -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 ()); }