diff --git a/MetadataProvider/SignatureTypeProvider.cs b/MetadataProvider/SignatureTypeProvider.cs index 9ce7a48e..e35663c0 100644 --- a/MetadataProvider/SignatureTypeProvider.cs +++ b/MetadataProvider/SignatureTypeProvider.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; +using System.Reflection.Metadata.Ecma335; using System.Text; using SRM = System.Reflection.Metadata; @@ -50,6 +51,7 @@ public virtual IType GetPrimitiveType(SRM.PrimitiveTypeCode typeCode) public virtual IType GetTypeFromDefinition(SRM.MetadataReader reader, SRM.TypeDefinitionHandle handle, byte rawTypeKind = 0) { var result = extractor.GetDefinedType(handle); + result.TypeKind = ResolveTypeKind(reader, handle, rawTypeKind); return result; } @@ -63,7 +65,8 @@ public virtual IType GetTypeFromReference(SRM.MetadataReader reader, SRM.TypeRef var type = new BasicType(name) { ContainingNamespace = namespaze, - GenericParameterCount = genericParameterCount + GenericParameterCount = genericParameterCount, + TypeKind = ResolveTypeKind(reader, handle, rawTypeKind) }; type.Resolve(extractor.Host); @@ -232,5 +235,20 @@ public virtual IType GetFunctionPointerType(SRM.MethodSignature signature return result; } + + private TypeKind ResolveTypeKind(SRM.MetadataReader reader, SRM.EntityHandle typeHandle, byte rawTypeKind) + { + var typeKind = reader.ResolveSignatureTypeKind(typeHandle, rawTypeKind); + switch (typeKind) + { + case SRM.SignatureTypeKind.Class: + return TypeKind.ReferenceType; + case SRM.SignatureTypeKind.ValueType: + return TypeKind.ValueType; + default: + return TypeKind.Unknown; + } + + } } } \ No newline at end of file