Minor refactoring of Module.ResolveType(). Moved the wrapping of the type arrays into an IGenericContext up into Module.

This commit is contained in:
jfrijters 2012-07-16 12:36:31 +00:00
Родитель c77eae66f7
Коммит 937336844c
3 изменённых файлов: 40 добавлений и 39 удалений

Просмотреть файл

@ -1242,9 +1242,9 @@ namespace IKVM.Reflection.Emit
get { return this; }
}
public override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
internal override Type ResolveType(int metadataToken, IGenericContext context)
{
if (genericTypeArguments != null || genericMethodArguments != null)
if (metadataToken >> 24 != TypeDefTable.Index)
{
throw new NotImplementedException();
}

Просмотреть файл

@ -297,7 +297,6 @@ namespace IKVM.Reflection
public abstract string FullyQualifiedName { get; }
public abstract string Name { get; }
public abstract Guid ModuleVersionId { get; }
public abstract Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
public abstract MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
public abstract FieldInfo ResolveField(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
public abstract MemberInfo ResolveMember(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments);
@ -387,6 +386,42 @@ namespace IKVM.Reflection
return ResolveType(metadataToken, null, null);
}
internal sealed class GenericContext : IGenericContext
{
private readonly Type[] genericTypeArguments;
private readonly Type[] genericMethodArguments;
internal GenericContext(Type[] genericTypeArguments, Type[] genericMethodArguments)
{
this.genericTypeArguments = genericTypeArguments;
this.genericMethodArguments = genericMethodArguments;
}
public Type GetGenericTypeArgument(int index)
{
return genericTypeArguments[index];
}
public Type GetGenericMethodArgument(int index)
{
return genericMethodArguments[index];
}
}
public Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
{
if ((metadataToken >> 24) == TypeSpecTable.Index)
{
return ResolveType(metadataToken, new GenericContext(genericTypeArguments, genericMethodArguments));
}
else
{
return ResolveType(metadataToken, null);
}
}
internal abstract Type ResolveType(int metadataToken, IGenericContext context);
public MethodBase ResolveMethod(int metadataToken)
{
return ResolveMethod(metadataToken, null, null);
@ -619,7 +654,7 @@ namespace IKVM.Reflection
throw NotSupportedException();
}
public sealed override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
internal sealed override Type ResolveType(int metadataToken, IGenericContext context)
{
throw ArgumentOutOfRangeException();
}

Просмотреть файл

@ -356,7 +356,7 @@ namespace IKVM.Reflection.Reader
return str;
}
internal Type ResolveType(int metadataToken, IGenericContext context)
internal override Type ResolveType(int metadataToken, IGenericContext context)
{
int index = (metadataToken & 0xFFFFFF) - 1;
if (index < 0)
@ -485,18 +485,6 @@ namespace IKVM.Reflection.Reader
}
}
public override Type ResolveType(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
{
if ((metadataToken >> 24) == TypeSpecTable.Index)
{
return ResolveType(metadataToken, new GenericContext(genericTypeArguments, genericMethodArguments));
}
else
{
return ResolveType(metadataToken, null);
}
}
private TypeName GetTypeName(int typeNamespace, int typeName)
{
return new TypeName(GetString(typeNamespace), GetString(typeName));
@ -704,28 +692,6 @@ namespace IKVM.Reflection.Reader
return methods[index];
}
private sealed class GenericContext : IGenericContext
{
private readonly Type[] genericTypeArguments;
private readonly Type[] genericMethodArguments;
internal GenericContext(Type[] genericTypeArguments, Type[] genericMethodArguments)
{
this.genericTypeArguments = genericTypeArguments;
this.genericMethodArguments = genericMethodArguments;
}
public Type GetGenericTypeArgument(int index)
{
return genericTypeArguments[index];
}
public Type GetGenericMethodArgument(int index)
{
return genericMethodArguments[index];
}
}
public override MethodBase ResolveMethod(int metadataToken, Type[] genericTypeArguments, Type[] genericMethodArguments)
{
int index = (metadataToken & 0xFFFFFF) - 1;