From d49b678b262f38b3be22528e3c833532c05853e1 Mon Sep 17 00:00:00 2001 From: fcurdi Date: Sun, 23 Feb 2020 13:43:02 -0300 Subject: [PATCH] resolve type kind --- MetadataProvider/SignatureTypeProvider.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) 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