New test.
[mono.git] / mcs / tools / corcompare / MissingMember.cs
index 86cbe98d8b82e915bfb5304d471436b63cffe19b..2341c532b036b7e76c51b8937d9cb7aa21572343 100644 (file)
@@ -18,15 +18,12 @@ namespace Mono.Util.CorCompare
                // e.g. <method name="Equals" status="missing"/>
                protected MemberInfo mInfoMono;
                protected MemberInfo mInfoMS;
-               protected CompletionTypes completion = CompletionTypes.Missing;
-               protected ArrayList rgAttributes;
-               protected CompletionInfo ci;
 
                public MissingMember (MemberInfo infoMono, MemberInfo infoMS) 
                {
                        mInfoMono = infoMono;
                        mInfoMS = infoMS;
-                       completion = (infoMono == null) ? CompletionTypes.Missing : CompletionTypes.Complete;
+                       m_nodeStatus = new NodeStatus (infoMono, infoMS);
                }
 
                public override string Name 
@@ -34,9 +31,27 @@ namespace Mono.Util.CorCompare
                        get { return Info.Name; }
                }
 
-               public override CompletionTypes Completion
+               public override NodeStatus Analyze ()
                {
-                       get { return completion; }
+                       if (!Status.IsMissing)
+                       {
+                               rgAttributes = new ArrayList ();
+                               nsAttributes = MissingAttribute.AnalyzeAttributes (
+                                       (mInfoMono == null) ? null : mInfoMono.GetCustomAttributes (false),
+                                       (mInfoMS   == null) ? null :   mInfoMS.GetCustomAttributes (false),
+                                       rgAttributes);
+
+                               if (mInfoMono != null && mInfoMS != null)
+                               {
+                                       Accessibility acMono = GetAccessibility (mInfoMono);
+                                       Accessibility acMS = GetAccessibility (mInfoMS);
+                                       if (acMono != acMS)
+                                               Status.AddWarning ("Should be "+AccessibilityToString (acMS));
+                               }
+
+                               m_nodeStatus.Add (nsAttributes);
+                       }
+                       return m_nodeStatus;
                }
 
                /// <summary>
@@ -56,37 +71,68 @@ namespace Mono.Util.CorCompare
                        get { return (mInfoMS != null) ? mInfoMS : mInfoMono; }
                }
 
-               public override XmlElement CreateXML (XmlDocument doc)
+               public static string GetUniqueName (MemberInfo mi)
                {
-                       XmlElement eltMissing = base.CreateXML (doc);
-
-                       XmlElement eltAttributes = MissingBase.CreateMemberCollectionElement ("attributes", rgAttributes, ci, doc);
-                       if (eltAttributes != null)
-                               eltMissing.AppendChild (eltAttributes);
-
-                       return eltMissing;
+                       return (mi.MemberType).ToString () + mi.ToString ();
                }
 
-               public virtual CompletionInfo Analyze ()
+               public static Accessibility GetAccessibility (MemberInfo mi)
                {
-                       if (mInfoMono == null)
-                       {
-                               completion = CompletionTypes.Missing;
-                       }
-                       else
+                       switch (mi.MemberType)
                        {
-                               rgAttributes = new ArrayList ();
-                               ci = MissingAttribute.AnalyzeAttributes (
-                                       (mInfoMono == null) ? null : mInfoMono.GetCustomAttributes (false),
-                                       (mInfoMS   == null) ? null :   mInfoMS.GetCustomAttributes (false),
-                                       rgAttributes);
-
-                               if (ci.cTodo != 0 || ci.cMissing != 0)
-                                       completion = CompletionTypes.Todo;
-                               else
-                                       completion = CompletionTypes.Complete;
+                               case MemberTypes.Constructor:
+                               case MemberTypes.Method:
+                                       MethodBase mb = (MethodBase) mi;
+                                       if (mb.IsPublic)
+                                               return Accessibility.Public;
+                                       else if (mb.IsAssembly)
+                                               return Accessibility.Assembly;
+                                       else if (mb.IsFamilyOrAssembly)
+                                               return Accessibility.FamilyOrAssembly;
+                                       else if (mb.IsFamily)
+                                               return Accessibility.Family;
+                                       else if (mb.IsFamilyAndAssembly)
+                                               return Accessibility.FamilyAndAssembly;
+                                       else if (mb.IsPrivate)
+                                               return Accessibility.Private;
+                                       break;
+                               case MemberTypes.Field:
+                                       FieldInfo fi = (FieldInfo) mi;
+                                       if (fi.IsPublic)
+                                               return Accessibility.Public;
+                                       else if (fi.IsAssembly)
+                                               return Accessibility.Assembly;
+                                       else if (fi.IsFamilyOrAssembly)
+                                               return Accessibility.FamilyOrAssembly;
+                                       else if (fi.IsFamily)
+                                               return Accessibility.Family;
+                                       else if (fi.IsFamilyAndAssembly)
+                                               return Accessibility.FamilyAndAssembly;
+                                       else if (fi.IsPrivate)
+                                               return Accessibility.Private;
+                                       break;
+                               case MemberTypes.NestedType:
+                                       Type ti = (Type) mi;
+                                       if (ti.IsNestedPublic)
+                                               return Accessibility.Public;
+                                       if (ti.IsNestedAssembly)
+                                               return Accessibility.Assembly;
+                                       else if (ti.IsNestedFamORAssem)
+                                               return Accessibility.FamilyOrAssembly;
+                                       else if (ti.IsNestedFamily)
+                                               return Accessibility.Family;
+                                       else if (ti.IsNestedFamANDAssem)
+                                               return Accessibility.FamilyAndAssembly;
+                                       else if (ti.IsNestedPrivate)
+                                               return Accessibility.Private;
+                                       break;
+                               case MemberTypes.Event:
+                               case MemberTypes.Property:
+                                       return Accessibility.Public;
+                               default:
+                                       throw new Exception ("Missing handler for MemberType: "+mi.MemberType.ToString ());
                        }
-                       return ci;
+                       throw new Exception ("Invalid accessibility: "+mi.ToString ());
                }
        }
 }