if (name_entry.MemberDefinition.CLSAttributeValue == false)
continue;
- IParametersMember p_a = name_entry as IParametersMember;
- if (p_a != null && !name_entry.IsAccessor) {
- if (!is_imported_type) {
+ IParametersMember p_a = null;
+ if (!is_imported_type) {
+ p_a = name_entry as IParametersMember;
+ if (p_a != null && !name_entry.IsAccessor) {
var p_a_pd = p_a.Parameters;
+ //
+ // Check differing overloads in @container
+ //
for (int ii = i + 1; ii < entry.Value.Count; ++ii) {
var checked_entry = entry.Value[ii];
IParametersMember p_b = checked_entry as IParametersMember;
var res = ParametersCompiled.IsSameClsSignature (p_a.Parameters, p_b.Parameters);
if (res != 0) {
- var last = GetLaterDefinedMember (checked_entry, name_entry);
- if (last == checked_entry.MemberDefinition) {
- report.SymbolRelatedToPreviousError (name_entry);
- } else {
- report.SymbolRelatedToPreviousError (checked_entry);
- }
-
- if ((res & 1) != 0) {
- report.Warning (3006, 1, last.Location,
- "Overloaded method `{0}' differing only in ref or out, or in array rank, is not CLS-compliant",
- name_entry.GetSignatureForError ());
- }
-
- if ((res & 2) != 0) {
- report.Warning (3007, 1, last.Location,
- "Overloaded method `{0}' differing only by unnamed array types is not CLS-compliant",
- name_entry.GetSignatureForError ());
- }
+ ReportOverloadedMethodClsDifference (name_entry, checked_entry, res, report);
}
}
}
} else {
bool same_names_only = true;
foreach (var f in found) {
- if (f.Name == name_entry.Name)
- continue;
+ if (f.Name == name_entry.Name) {
+ if (p_a != null) {
+ IParametersMember p_b = f as IParametersMember;
+ if (p_b == null)
+ continue;
+
+ if (p_a.Parameters.Count != p_b.Parameters.Count)
+ continue;
+
+ if (f.IsAccessor)
+ continue;
+
+ var res = ParametersCompiled.IsSameClsSignature (p_a.Parameters, p_b.Parameters);
+ if (res != 0) {
+ ReportOverloadedMethodClsDifference (f, name_entry, res, report);
+ }
+ }
-// if (f.IsAccessor && name_entry.IsAccessor)
-// continue;
+ continue;
+ }
same_names_only = false;
if (!is_imported_type) {
if (mc_b == null)
return mc_a;
+ if (a.DeclaringType.MemberDefinition != b.DeclaringType.MemberDefinition)
+ return mc_b;
+
if (mc_a.Location.File != mc_a.Location.File)
return mc_b;
return mc_b.Location.Row > mc_a.Location.Row ? mc_b : mc_a;
}
+ static void ReportOverloadedMethodClsDifference (MemberSpec a, MemberSpec b, int res, Report report)
+ {
+ var last = GetLaterDefinedMember (a, b);
+ if (last == a.MemberDefinition) {
+ report.SymbolRelatedToPreviousError (b);
+ } else {
+ report.SymbolRelatedToPreviousError (a);
+ }
+
+ if ((res & 1) != 0) {
+ report.Warning (3006, 1, last.Location,
+ "Overloaded method `{0}' differing only in ref or out, or in array rank, is not CLS-compliant",
+ last.GetSignatureForError ());
+ }
+
+ if ((res & 2) != 0) {
+ report.Warning (3007, 1, last.Location,
+ "Overloaded method `{0}' differing only by unnamed array types is not CLS-compliant",
+ last.GetSignatureForError ());
+ }
+ }
+
public bool CheckExistingMembersOverloads (MemberCore member, AParametersCollection parameters)
{
var name = GetLookupName (member);