using System;
using System.Collections.Specialized;
using System.Reflection;
using URAnticipatingMinds.PlatformServices.UnmanagedReflection;
namespace AnticipatingMinds.Genesis.CodeDOM{
/// <summary>
/// Summary description for CodeTypeMemberInfo.
/// </summary>
[Serializable]
public abstract class CodeTypeMemberInfo
{
/// <summary>
/// Initializes new instance of the <see cref="CodeTypeMemberInfo"/> class.
/// </summary>
/// <param name="declaringTypeInfo">Declaring type information.</param>
protected CodeTypeMemberInfo(CodeTypeInfo declaringTypeInfo)
{
this.declaringTypeInfo = declaringTypeInfo;
}
/// <summary>
/// Gets declaring type.
/// </summary>
public CodeTypeInfo DeclaringTypeInfo
{
get
{
return declaringTypeInfo;
}
}
/// <summary>
/// Gets member name.
/// </summary>
public abstract string Name
{
get;
}
/// <summary>
/// True if member is static.
/// </summary>
public abstract bool IsStatic
{
get;
}
private CodeTypeInfo declaringTypeInfo;
}
/// <summary>
/// Represents method information.
/// </summary>
[Serializable]
public abstract class CodeMethodInfo : CodeTypeMemberInfo
{
/// <summary>
/// Initializes new instance of the <see cref="CodeMethodInfo"/> class.
/// </summary>
/// <param name="declaringTypeInfo">Declaring type information.</param>
protected CodeMethodInfo(CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
}
/// <summary>
/// Gets the full name of the method return type.
/// </summary>
public abstract string ReturnType
{
get;
}
/// <summary>
/// Gets an array of method arguments.
/// </summary>
/// <returns>An array of method arguments.</returns>
public abstract CodeParameterInfo[] GetParameters();
}
/// <summary>
/// Represents property information.
/// </summary>
[Serializable]
public abstract class CodePropertyInfo : CodeTypeMemberInfo
{
/// <summary>
/// Initializes new instance of the <see cref="CodePropertyInfo"/> class.
/// </summary>
/// <param name="declaringTypeInfo">Declaring type information.</param>
protected CodePropertyInfo(CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
}
/// <summary>
/// Gets the full name of property type.
/// </summary>
public abstract string PropertyType
{
get;
}
/// <summary>
/// Gets an array of indexer parameters if property is an indexer.
/// </summary>
/// <returns>If property is an indexer - an array of indexer parameters.</returns>
public abstract CodeParameterInfo[] GetIndexParameters();
}
/// <summary>
/// Represents field information.
/// </summary>
[Serializable]
public abstract class CodeFieldInfo : CodeTypeMemberInfo
{
/// <summary>
/// Initializes new instance of the <see cref="CodeFieldInfo"/> class.
/// </summary>
/// <param name="declaringTypeInfo">Declaring type information.</param>
protected CodeFieldInfo(CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
}
/// <summary>
/// Gets full name of the field type.
/// </summary>
public abstract string FieldType
{
get;
}
/// <summary>
/// Returns true if declared field is constant
/// </summary>
public abstract bool IsConst
{
get;
}
}
/// <summary>
/// Represents event information.
/// </summary>
[Serializable]
public abstract class CodeEventInfo : CodeTypeMemberInfo
{
/// <summary>
/// Initializes new instance of the <see cref="CodeEventInfo"/> class.
/// </summary>
/// <param name="declaringTypeInfo">Declaring type information.</param>
protected CodeEventInfo(CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
}
/// <summary>
/// Gets full name of the event handler type.
/// </summary>
public abstract string EventHandlerType
{
get;
}
}
[Serializable]
internal class CodeMetadataMethodInfo : CodeMethodInfo
{
internal CodeMetadataMethodInfo(UR.MethodInfo methodInfo,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
name = methodInfo.Name;
returnType = methodInfo.ReturnType;
UR.ParameterInfo[] metadataParameters = methodInfo.Parameters;
parameters = new CodeParameterInfo[metadataParameters.Length];
for(int parameterIndex = 0; parameterIndex < metadataParameters.Length;parameterIndex++)
{
parameters[parameterIndex] = new CodeMetadataParameterInfo(metadataParameters[parameterIndex]);
}
isStatic = (methodInfo.CorAttributes & MethodAttributes.Static) != 0;
}
public override string Name
{
get
{
return name;
}
}
public override string ReturnType
{
get
{
return returnType;
}
}
public override CodeParameterInfo[] GetParameters()
{
return parameters;
}
public override bool IsStatic
{
get
{
return isStatic;
}
}
private bool isStatic;
private string name;
private string returnType;
private CodeParameterInfo[] parameters;
}
[Serializable]
internal class CodeMetadataPropertyInfo : CodePropertyInfo
{
internal CodeMetadataPropertyInfo(UR.PropertyInfo propertyInfo,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
name = propertyInfo.Name;
returnType = propertyInfo.PropertyType;
UR.ParameterInfo[] metadataParameters = propertyInfo.Parameters;
parameters = new CodeParameterInfo[metadataParameters.Length];
for(int parameterIndex = 0; parameterIndex < metadataParameters.Length;parameterIndex++)
{
parameters[parameterIndex] = new CodeMetadataParameterInfo(metadataParameters[parameterIndex]);
}
UR.MethodInfo methodInfo = null;
if(propertyInfo.GetterMethodInfo != null)
methodInfo = propertyInfo.GetterMethodInfo;
else
methodInfo = propertyInfo.SetterMethodInfo;
if(methodInfo != null)
isStatic = (methodInfo.CorAttributes & MethodAttributes.Static) != 0;
}
public override string Name
{
get
{
return name;
}
}
public override string PropertyType
{
get
{
return returnType;
}
}
public override CodeParameterInfo[] GetIndexParameters()
{
return parameters;
}
public override bool IsStatic
{
get
{
return isStatic;
}
}
private bool isStatic;
private string name;
private string returnType;
private CodeParameterInfo[] parameters;
}
[Serializable]
internal class CodeMetadataFieldInfo : CodeFieldInfo
{
internal CodeMetadataFieldInfo(UR.FieldInfo fieldInfo,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
name = fieldInfo.Name;
fieldType = fieldInfo.FieldType;
isStatic = (fieldInfo.CorAttributes & FieldAttributes.Static) != 0;
isConst = isStatic;
}
public override string Name
{
get
{
return name;
}
}
public override string FieldType
{
get
{
return fieldType;
}
}
public override bool IsStatic
{
get
{
return isStatic;
}
}
public override bool IsConst
{
get
{
return isConst;
}
}
private bool isStatic;
private bool isConst;
private string name;
private string fieldType;
}
[Serializable]
internal class CodeMetadataEventInfo : CodeEventInfo
{
internal CodeMetadataEventInfo(UR.EventInfo eventInfo,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
name = eventInfo.Name;
eventHandlerType = eventInfo.EventHandlerType;
isStatic = false;
}
public override string Name
{
get
{
return name;
}
}
public override string EventHandlerType
{
get
{
return eventHandlerType;
}
}
public override bool IsStatic
{
get
{
return isStatic;
}
}
private bool isStatic;
private string name;
private string eventHandlerType;
}
[Serializable]
internal class CodeModelMethodInfo : CodeMethodInfo
{
internal CodeModelMethodInfo(CodeTypeMethodDeclaration methodDeclaration,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
this.methodDeclaration = methodDeclaration;
this.methodDeclaration.MemberInfo = this;
parameters = new CodeParameterInfo[methodDeclaration.Parameters.Count];
for(int parameterIndex = 0; parameterIndex < methodDeclaration.Parameters.Count;parameterIndex++)
{
parameters[parameterIndex] = new CodeModelParameterInfo(methodDeclaration.Parameters[parameterIndex]);
}
}
public override string Name
{
get
{
return methodDeclaration.Name;
}
}
public override string ReturnType
{
get
{
if(methodDeclaration.ReturnType.TypeInfo != null)
return methodDeclaration.ReturnType.TypeInfo.FullName;
else
return methodDeclaration.ReturnType.TypeName;
}
}
public override CodeParameterInfo[] GetParameters()
{
return parameters;
}
public override bool IsStatic
{
get
{
return (methodDeclaration.Modifiers & CodeTypeMethodDeclaration.MemberDeclarationModifiers.Static) != 0;
}
}
private CodeTypeMethodDeclaration methodDeclaration;
private CodeParameterInfo[] parameters;
}
[Serializable]
internal class CodeModelPropertyInfo : CodePropertyInfo
{
internal CodeModelPropertyInfo(CodeTypePropertyDeclaration propertyDeclaration,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
this.propertyDeclaration = propertyDeclaration;
this.propertyDeclaration.MemberInfo = this;
if(propertyDeclaration is CodeTypeIndexerDeclaration)
{
CodeTypeIndexerDeclaration indexerDeclaration = propertyDeclaration as CodeTypeIndexerDeclaration;
parameters = new CodeParameterInfo[indexerDeclaration.Parameters.Count];
for(int parameterIndex = 0; parameterIndex < indexerDeclaration.Parameters.Count;parameterIndex++)
{
parameters[parameterIndex] = new CodeModelParameterInfo(indexerDeclaration.Parameters[parameterIndex]);
}
}
else
{
parameters = new CodeParameterInfo[0];
}
}
public override string Name
{
get
{
return propertyDeclaration.Name;
}
}
public override string PropertyType
{
get
{
if(propertyDeclaration.ReturnType.TypeInfo != null)
return propertyDeclaration.ReturnType.TypeInfo.FullName;
else
return propertyDeclaration.ReturnType.TypeName;
}
}
public override CodeParameterInfo[] GetIndexParameters()
{
return parameters;
}
public override bool IsStatic
{
get
{
return (propertyDeclaration.Modifiers & CodeTypePropertyDeclaration.MemberDeclarationModifiers.Static) != 0;
}
}
private CodeTypePropertyDeclaration propertyDeclaration;
private CodeParameterInfo[] parameters;
}
[Serializable]
internal class CodeModelFieldInfo : CodeFieldInfo
{
internal CodeModelFieldInfo(CodeTypeFieldDeclaration fieldDeclaration, string filedName,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
this.filedName = filedName;
this.fieldDeclaration = fieldDeclaration;
this.fieldDeclaration.MemberInfo = this;
}
public override string Name
{
get
{
return filedName;
}
}
public override string FieldType
{
get
{
if(fieldDeclaration.DeclarationType.TypeInfo != null)
return fieldDeclaration.DeclarationType.TypeInfo.FullName;
else
return fieldDeclaration.DeclarationType.TypeName;
}
}
public override bool IsStatic
{
get
{
return (fieldDeclaration.Modifiers & CodeTypeFieldDeclaration.MemberDeclarationModifiers.Static) != 0;
}
}
public override bool IsConst
{
get
{
return (fieldDeclaration.Modifiers & CodeTypeFieldDeclaration.MemberDeclarationModifiers.Const) != 0;
}
}
private string filedName;
private CodeTypeFieldDeclaration fieldDeclaration;
}
[Serializable]
internal class CodeModelEventInfo : CodeEventInfo
{
internal CodeModelEventInfo(CodeTypeEventDeclaration eventDeclaration, CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
this.eventName = eventDeclaration.Name;
this.eventDeclaration = eventDeclaration;
this.eventDeclaration.MemberInfo = this;
}
internal CodeModelEventInfo(CodeTypeEventListDeclaration eventListDeclaration, string eventName,CodeTypeInfo declaringTypeInfo):base(declaringTypeInfo)
{
this.eventName = eventName;
this.eventListDeclaration = eventListDeclaration;
}
public override string Name
{
get
{
return eventName;
}
}
public override string EventHandlerType
{
get
{
if(eventListDeclaration != null)
{
if(eventListDeclaration.DeclarationType.TypeInfo != null)
return eventListDeclaration.DeclarationType.TypeInfo.FullName;
else
return eventListDeclaration.DeclarationType.TypeName;
}
else //eventDeclaration != null
{
if(eventDeclaration.DeclarationType.TypeInfo != null)
return eventDeclaration.DeclarationType.TypeInfo.FullName;
else
return eventDeclaration.DeclarationType.TypeName;
}
}
}
public override bool IsStatic
{
get
{
if(eventListDeclaration != null)
{
return (eventListDeclaration.Modifiers & CodeTypeMemberDeclaration.MemberDeclarationModifiers.Static) != 0;
}
else //eventDeclaration != null
{
return (eventDeclaration.Modifiers & CodeTypeMemberDeclaration.MemberDeclarationModifiers.Static) != 0;
}
}
}
private string eventName;
private CodeTypeEventDeclaration eventDeclaration;
private CodeTypeEventListDeclaration eventListDeclaration;
}
}
|