3 using System.Reflection;
4 using System.Collections;
6 namespace Mono.Util.CorCompare
10 /// Represents a generic member that is completely missing
13 /// created by - Piersh
14 /// created on - 3/1/2002 3:37:00 am
16 abstract class MissingMember : MissingBase
18 // e.g. <method name="Equals" status="missing"/>
19 protected MemberInfo mInfoMono;
20 protected MemberInfo mInfoMS;
22 public MissingMember (MemberInfo infoMono, MemberInfo infoMS)
26 m_nodeStatus = new NodeStatus (infoMono, infoMS);
29 public override string Name
31 get { return Info.Name; }
34 public override NodeStatus Analyze ()
36 if (!Status.IsMissing)
38 rgAttributes = new ArrayList ();
39 nsAttributes = MissingAttribute.AnalyzeAttributes (
40 (mInfoMono == null) ? null : mInfoMono.GetCustomAttributes (false),
41 (mInfoMS == null) ? null : mInfoMS.GetCustomAttributes (false),
44 if (mInfoMono != null && mInfoMS != null)
46 Accessibility acMono = GetAccessibility (mInfoMono);
47 Accessibility acMS = GetAccessibility (mInfoMS);
49 Status.AddWarning ("Should be "+AccessibilityToString (acMS));
52 m_nodeStatus.Add (nsAttributes);
58 /// returns the MemberInfo for this member.
59 /// if it's a missing member then the microsoft MemberInfo is returned instead
61 public MemberInfo Info
63 get { return (mInfoMono != null) ? mInfoMono : mInfoMS; }
67 /// returns the 'best' info for this member. the 'best' info is the microsoft info, if it's available, otherwise the mono info.
69 public MemberInfo BestInfo
71 get { return (mInfoMS != null) ? mInfoMS : mInfoMono; }
74 public static string GetUniqueName (MemberInfo mi)
76 return (mi.MemberType).ToString () + mi.ToString ();
79 public static Accessibility GetAccessibility (MemberInfo mi)
81 switch (mi.MemberType)
83 case MemberTypes.Constructor:
84 case MemberTypes.Method:
85 MethodBase mb = (MethodBase) mi;
87 return Accessibility.Public;
88 else if (mb.IsAssembly)
89 return Accessibility.Assembly;
90 else if (mb.IsFamilyOrAssembly)
91 return Accessibility.FamilyOrAssembly;
93 return Accessibility.Family;
94 else if (mb.IsFamilyAndAssembly)
95 return Accessibility.FamilyAndAssembly;
96 else if (mb.IsPrivate)
97 return Accessibility.Private;
99 case MemberTypes.Field:
100 FieldInfo fi = (FieldInfo) mi;
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;
114 case MemberTypes.NestedType:
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;
129 case MemberTypes.Event:
130 case MemberTypes.Property:
131 return Accessibility.Public;
133 throw new Exception ("Missing handler for MemberType: "+mi.MemberType.ToString ());
135 throw new Exception ("Invalid accessibility: "+mi.ToString ());