void CompareMemberLists(ComparisonNode parent, List <CompNamed> reference_list, List <CompNamed> target_list) { int m = 0, a = 0; UnityProfilesDocumentation.State state = profile_documentation.CurrentState; reference_list.Sort(CompNamed.Compare); target_list.Sort(CompNamed.Compare); while (m < reference_list.Count || a < target_list.Count) { if (m == reference_list.Count) { AddExtra(parent, target_list[a]); a++; continue; } else if (a == target_list.Count) { AddMissing(parent, reference_list[m]); m++; continue; } int c = String.Compare(reference_list[m].Name, target_list[a].Name); comparisons_performed++; if (c == 0) { DocumentedMember currentMember; switch (reference_list[m].Type) { case CompType.Field: currentMember = profile_documentation.AddReferenceField(reference_list[m].Name); break; case CompType.Method: currentMember = profile_documentation.AddReferenceMethod(reference_list[m].Name); break; case CompType.Property: currentMember = profile_documentation.AddReferenceProperty(reference_list[m].Name); break; default: profile_documentation.CurrentMember = null; currentMember = null; break; } if (currentMember != null) { currentMember.AddSupportedProfile(target_profile); //Console.WriteLine ("\t\t\t\tAdded member {0} in profile {1}", reference_list[m].Name, target_profile); } /* the names match, further investigation is required */ // Console.WriteLine ("method {0} is in both, doing more comparisons", reference_list[m].Name); ComparisonNode comparison = target_list[a].GetComparisonNode(); parent.AddChild(comparison); if (reference_list[m] is CompMember && target_list[a] is CompMember) { string reference_type = ((CompMember)reference_list[m]).GetMemberType(); string target_type = ((CompMember)target_list[a]).GetMemberType(); if (reference_type != target_type) { HandleError(comparison, String.Format("reference type is <i>{0}</i>, target type is <i>{1}</i>", reference_type, target_type)); } string reference_access = ((CompMember)reference_list[m]).GetMemberAccess(); string target_access = ((CompMember)target_list[a]).GetMemberAccess(); if (reference_access != target_access) { // Try to give some hints to the developer, best we can do with // strings. string extra_msg = ""; if (reference_access.IndexOf("Public, Final, Virtual, HideBySig") != -1 && target_access.IndexOf("Public, HideBySig") != -1) { extra_msg = "\n\t\t<b>Hint:</b> reference uses an implicit interface implementation, target doesn't"; } HandleError(comparison, String.Format("reference access is '<i>{0}</i>', target access is '<i>{1}</i>'{2}", reference_access, target_access, extra_msg)); comparison.Status = ComparisonStatus.Error; } } if (reference_list[m] is CompMethod) { if (((CompMethod)target_list[a]).ThrowsNotImplementedException() && !((CompMethod)reference_list[m]).ThrowsNotImplementedException()) { comparison.ThrowsNIE = true; } } if (reference_list[m] is CompField) { if (((CompField)reference_list[m]).GetLiteralValue() != ((CompField)target_list[a]).GetLiteralValue()) { HandleError(comparison, String.Format("reference field has value {0}, target field has value {1}", ((CompField)reference_list[m]).GetLiteralValue(), ((CompField)target_list[a]).GetLiteralValue())); comparison.Status = ComparisonStatus.Error; } } if (reference_list[m] is ICompAttributeContainer) { //Console.WriteLine ("Comparing attributes for {0}", reference_list[m].Name); CompareAttributes(comparison, (ICompAttributeContainer)reference_list[m], (ICompAttributeContainer)target_list[a]); } if (reference_list[m] is ICompMemberContainer) { CompareMembers(comparison, (ICompMemberContainer)reference_list[m], (ICompMemberContainer)target_list[a]); } //CompareParameters (comparison, reference_list[m], target_namespace [target_list[a]]); m++; a++; } else if (c < 0) { /* reference name is before target name, reference name is missing from target */ AddMissing(parent, reference_list[m]); m++; } else { /* reference name is after target name, target name is extra */ AddExtra(parent, target_list[a]); a++; } } profile_documentation.CurrentState = state; }
void CompareTypeLists(ComparisonNode parent, List <CompNamed> reference_list, List <CompNamed> target_list) { int m = 0, a = 0; UnityProfilesDocumentation.State state = profile_documentation.CurrentState; reference_list.Sort(CompNamed.Compare); target_list.Sort(CompNamed.Compare); while (m < reference_list.Count || a < target_list.Count) { if (m == reference_list.Count) { AddExtra(parent, target_list[a]); a++; continue; } else if (a == target_list.Count) { AddMissing(parent, reference_list[m]); m++; continue; } int c = String.Compare(reference_list[m].Name, target_list[a].Name); comparisons_performed++; //Console.WriteLine ("\t\t\t\tWorking on item {0} [type {1}] in profile {2}", reference_list[m].Name, reference_list[m].Type, target_profile); if (c == 0) { ProgressChange((double)comparisons_performed / total_comparisons * 100.0, String.Format("Comparing {0} {1}", reference_list[m].Type, reference_list[m].Name)); switch (reference_list[m].Type) { case CompType.Namespace: profile_documentation.AddReferenceNamespace(reference_list[m].Name); profile_documentation.CurrentClass = null; //Console.WriteLine ("\t\t\t\tAdding namespace {0} in profile {1}", reference_list[m].Name, target_profile); break; case CompType.Class: profile_documentation.AddReferenceClass(reference_list[m].Name); profile_documentation.CurrentClass.AddSupportedProfile(target_profile); //Console.WriteLine ("\t\t\t\tAdding class {0} in profile {1}", reference_list[m].Name, target_profile); break; default: break; } /* the names match, further investigation is required */ ComparisonNode comparison = target_list[a].GetComparisonNode(); parent.AddChild(comparison); // compare base types if (reference_list[m] is ICompHasBaseType && target_list[a] is ICompHasBaseType) { CompareBaseTypes(comparison, (ICompHasBaseType)reference_list[m], (ICompHasBaseType)target_list[a]); } // compares generic type parameters if (reference_list[m] is ICompGenericParameter && target_list[a] is ICompGenericParameter) { CompareTypeParameters(comparison, (ICompGenericParameter)reference_list[m], (ICompGenericParameter)target_list[a]); } // compare nested types if (reference_list[m] is ICompTypeContainer && target_list[a] is ICompTypeContainer) { CompareNestedTypes(comparison, (ICompTypeContainer)reference_list[m], (ICompTypeContainer)target_list[a]); } if (reference_list[m] is ICompMemberContainer && target_list[a] is ICompMemberContainer) { CompareMembers(comparison, (ICompMemberContainer)reference_list[m], (ICompMemberContainer)target_list[a]); } if (reference_list[m] is ICompAttributeContainer && target_list[a] is ICompAttributeContainer) { CompareAttributes(comparison, (ICompAttributeContainer)reference_list[m], (ICompAttributeContainer)target_list[a]); } m++; a++; } else if (c < 0) { /* reference name is before target name, reference name is missing from target */ AddMissing(parent, reference_list[m]); m++; } else { /* reference name is after target name, target name is extra */ AddExtra(parent, target_list[a]); a++; } } profile_documentation.CurrentState = state; }