//
static bool AddInterfaceMember (MemberSpec member, ref IList<MemberSpec> existing)
{
- var member_param = member is IParametersMember ? ((IParametersMember) member).Parameters : ParametersCompiled.EmptyReadOnlyParameters;
+ var member_param = member is IParametersMember ? ((IParametersMember) member).Parameters : null;
//
// interface IA : IB { int Prop { set; } }
if (entry.Arity != member.Arity)
continue;
- if (entry is IParametersMember) {
- var entry_param = ((IParametersMember) entry).Parameters;
- if (!TypeSpecComparer.Override.IsEqual (entry_param, member_param))
- continue;
+ AParametersCollection entry_param = null;
+ if (member_param != null) {
+ var entry_pm = entry as IParametersMember;
+ if (entry_pm != null) {
+ entry_param = entry_pm.Parameters;
+ if (!TypeSpecComparer.Override.IsEqual (entry_param, member_param))
+ continue;
+ }
}
if (member.DeclaringType.ImplementsInterface (entry.DeclaringType, false)) {
continue;
}
- if ((entry.DeclaringType == member.DeclaringType && entry.IsAccessor == member.IsAccessor) ||
- entry.DeclaringType.ImplementsInterface (member.DeclaringType, false))
+ if ((entry.DeclaringType == member.DeclaringType && entry.IsAccessor == member.IsAccessor))
+ return false;
+
+ if (entry.DeclaringType.ImplementsInterface (member.DeclaringType, false) && AParametersCollection.HasSameParameterDefaults (entry_param, member_param))
return false;
}
return ambig_candidate;
}
+ public static List<TypeSpec> GetDeclaredNestedTypes (TypeSpec container)
+ {
+ List<TypeSpec> found = null;
+ foreach (var entry in container.MemberCache.member_hash) {
+ foreach (var member in entry.Value) {
+ if ((member.Kind & MemberKind.NestedMask) == 0)
+ continue;
+
+ if (found == null)
+ found = new List<TypeSpec> ();
+
+ found.Add ((TypeSpec)member);
+ }
+ }
+
+ return found;
+ }
+
//
// Returns inflated version of MemberSpec, it works similarly to
// SRE TypeBuilder.GetMethod
if (a.DeclaringType.MemberDefinition != b.DeclaringType.MemberDefinition)
return mc_b;
- if (mc_a.Location.File != mc_a.Location.File)
+ if (mc_a.Location.File != mc_b.Location.File)
return mc_b;
return mc_b.Location.Row > mc_a.Location.Row ? mc_b : mc_a;