New test.
[mono.git] / mcs / tools / corcompare / MissingMember.cs
1 using System;
2 using System.Xml;
3 using System.Reflection;
4 using System.Collections;
5
6 namespace Mono.Util.CorCompare
7 {
8
9         /// <summary>
10         ///     Represents a generic member that is completely missing
11         /// </summary>
12         /// <remarks>
13         ///     created by - Piersh
14         ///     created on - 3/1/2002 3:37:00 am
15         /// </remarks>
16         abstract class MissingMember : MissingBase
17         {
18                 // e.g. <method name="Equals" status="missing"/>
19                 protected MemberInfo mInfoMono;
20                 protected MemberInfo mInfoMS;
21
22                 public MissingMember (MemberInfo infoMono, MemberInfo infoMS) 
23                 {
24                         mInfoMono = infoMono;
25                         mInfoMS = infoMS;
26                         m_nodeStatus = new NodeStatus (infoMono, infoMS);
27                 }
28
29                 public override string Name 
30                 {
31                         get { return Info.Name; }
32                 }
33
34                 public override NodeStatus Analyze ()
35                 {
36                         if (!Status.IsMissing)
37                         {
38                                 rgAttributes = new ArrayList ();
39                                 nsAttributes = MissingAttribute.AnalyzeAttributes (
40                                         (mInfoMono == null) ? null : mInfoMono.GetCustomAttributes (false),
41                                         (mInfoMS   == null) ? null :   mInfoMS.GetCustomAttributes (false),
42                                         rgAttributes);
43
44                                 if (mInfoMono != null && mInfoMS != null)
45                                 {
46                                         Accessibility acMono = GetAccessibility (mInfoMono);
47                                         Accessibility acMS = GetAccessibility (mInfoMS);
48                                         if (acMono != acMS)
49                                                 Status.AddWarning ("Should be "+AccessibilityToString (acMS));
50                                 }
51
52                                 m_nodeStatus.Add (nsAttributes);
53                         }
54                         return m_nodeStatus;
55                 }
56
57                 /// <summary>
58                 /// returns the MemberInfo for this member.
59                 /// if it's a missing member then the microsoft MemberInfo is returned instead
60                 /// </summary>
61                 public MemberInfo Info
62                 {
63                         get { return (mInfoMono != null) ? mInfoMono : mInfoMS; }
64                 }
65
66                 /// <summary>
67                 /// returns the 'best' info for this member. the 'best' info is the microsoft info, if it's available, otherwise the mono info.
68                 /// </summary>
69                 public MemberInfo BestInfo
70                 {
71                         get { return (mInfoMS != null) ? mInfoMS : mInfoMono; }
72                 }
73
74                 public static string GetUniqueName (MemberInfo mi)
75                 {
76                         return (mi.MemberType).ToString () + mi.ToString ();
77                 }
78
79                 public static Accessibility GetAccessibility (MemberInfo mi)
80                 {
81                         switch (mi.MemberType)
82                         {
83                                 case MemberTypes.Constructor:
84                                 case MemberTypes.Method:
85                                         MethodBase mb = (MethodBase) mi;
86                                         if (mb.IsPublic)
87                                                 return Accessibility.Public;
88                                         else if (mb.IsAssembly)
89                                                 return Accessibility.Assembly;
90                                         else if (mb.IsFamilyOrAssembly)
91                                                 return Accessibility.FamilyOrAssembly;
92                                         else if (mb.IsFamily)
93                                                 return Accessibility.Family;
94                                         else if (mb.IsFamilyAndAssembly)
95                                                 return Accessibility.FamilyAndAssembly;
96                                         else if (mb.IsPrivate)
97                                                 return Accessibility.Private;
98                                         break;
99                                 case MemberTypes.Field:
100                                         FieldInfo fi = (FieldInfo) mi;
101                                         if (fi.IsPublic)
102                                                 return Accessibility.Public;
103                                         else if (fi.IsAssembly)
104                                                 return Accessibility.Assembly;
105                                         else if (fi.IsFamilyOrAssembly)
106                                                 return Accessibility.FamilyOrAssembly;
107                                         else if (fi.IsFamily)
108                                                 return Accessibility.Family;
109                                         else if (fi.IsFamilyAndAssembly)
110                                                 return Accessibility.FamilyAndAssembly;
111                                         else if (fi.IsPrivate)
112                                                 return Accessibility.Private;
113                                         break;
114                                 case MemberTypes.NestedType:
115                                         Type ti = (Type) mi;
116                                         if (ti.IsNestedPublic)
117                                                 return Accessibility.Public;
118                                         if (ti.IsNestedAssembly)
119                                                 return Accessibility.Assembly;
120                                         else if (ti.IsNestedFamORAssem)
121                                                 return Accessibility.FamilyOrAssembly;
122                                         else if (ti.IsNestedFamily)
123                                                 return Accessibility.Family;
124                                         else if (ti.IsNestedFamANDAssem)
125                                                 return Accessibility.FamilyAndAssembly;
126                                         else if (ti.IsNestedPrivate)
127                                                 return Accessibility.Private;
128                                         break;
129                                 case MemberTypes.Event:
130                                 case MemberTypes.Property:
131                                         return Accessibility.Public;
132                                 default:
133                                         throw new Exception ("Missing handler for MemberType: "+mi.MemberType.ToString ());
134                         }
135                         throw new Exception ("Invalid accessibility: "+mi.ToString ());
136                 }
137         }
138 }