2008-11-04 Chris Toshok <toshok@ximian.com>
[mono-project.git] / mcs / tools / corcompare / MissingMember.cs
blob2341c532b036b7e76c51b8937d9cb7aa21572343
1 using System;
2 using System.Xml;
3 using System.Reflection;
4 using System.Collections;
6 namespace Mono.Util.CorCompare
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
18 // e.g. <method name="Equals" status="missing"/>
19 protected MemberInfo mInfoMono;
20 protected MemberInfo mInfoMS;
22 public MissingMember (MemberInfo infoMono, MemberInfo infoMS)
24 mInfoMono = infoMono;
25 mInfoMS = 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),
42 rgAttributes);
44 if (mInfoMono != null && mInfoMS != null)
46 Accessibility acMono = GetAccessibility (mInfoMono);
47 Accessibility acMS = GetAccessibility (mInfoMS);
48 if (acMono != acMS)
49 Status.AddWarning ("Should be "+AccessibilityToString (acMS));
52 m_nodeStatus.Add (nsAttributes);
54 return m_nodeStatus;
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
63 get { return (mInfoMono != null) ? mInfoMono : mInfoMS; }
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
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;
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 ());
135 throw new Exception ("Invalid accessibility: "+mi.ToString ());