Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        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;
        }