using System;
using System.Xml;
using System.Reflection;
using System.Collections;
namespace Mono.Util.CorCompare
{
///
/// Represents a generic member that is completely missing
///
///
/// created by - Piersh
/// created on - 3/1/2002 3:37:00 am
///
abstract class MissingMember : MissingBase
{
// e.g.
protected MemberInfo mInfoMono;
protected MemberInfo mInfoMS;
public MissingMember (MemberInfo infoMono, MemberInfo infoMS)
{
mInfoMono = infoMono;
mInfoMS = infoMS;
m_nodeStatus = new NodeStatus (infoMono, infoMS);
}
public override string Name
{
get { return Info.Name; }
}
public override NodeStatus Analyze ()
{
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;
}
///
/// returns the MemberInfo for this member.
/// if it's a missing member then the microsoft MemberInfo is returned instead
///
public MemberInfo Info
{
get { return (mInfoMono != null) ? mInfoMono : mInfoMS; }
}
///
/// returns the 'best' info for this member. the 'best' info is the microsoft info, if it's available, otherwise the mono info.
///
public MemberInfo BestInfo
{
get { return (mInfoMS != null) ? mInfoMS : mInfoMono; }
}
public static string GetUniqueName (MemberInfo mi)
{
return (mi.MemberType).ToString () + mi.ToString ();
}
public static Accessibility GetAccessibility (MemberInfo mi)
{
switch (mi.MemberType)
{
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 ());
}
throw new Exception ("Invalid accessibility: "+mi.ToString ());
}
}
}