зеркало из https://github.com/mono/ikvm-fork.git
Minor refactoring of Module.ResolveType(). Moved the wrapping of the type arrays into an IGenericContext up into Module.
This commit is contained in:
Родитель
c77eae66f7
Коммит
937336844c
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче