From 1ac5f01a3cf63656738a9124b0bbab7e3c19da8b Mon Sep 17 00:00:00 2001 From: Patrick Stevens <3138005+Smaug123@users.noreply.github.com> Date: Sun, 15 Jun 2025 21:40:53 +0100 Subject: [PATCH] Make isinst more powerful (#55) --- WoofWare.PawPrint/UnaryMetadataIlOp.fs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/WoofWare.PawPrint/UnaryMetadataIlOp.fs b/WoofWare.PawPrint/UnaryMetadataIlOp.fs index 9e75c40..506c485 100644 --- a/WoofWare.PawPrint/UnaryMetadataIlOp.fs +++ b/WoofWare.PawPrint/UnaryMetadataIlOp.fs @@ -308,11 +308,25 @@ module internal UnaryMetadataIlOp = let targetType : TypeDefn = match metadataToken with | MetadataToken.TypeDefinition td -> - TypeDefn.FromDefinition ( - ComparableTypeDefinitionHandle.Make td, - state.ActiveAssembly(thread).Name.FullName, - failwith "TODO" - ) + let activeAssy = state.ActiveAssembly thread + let ty = activeAssy.TypeDefs.[td] + + let baseTy = + TypeInfo.resolveBaseType + baseClassTypes + _.Name + (fun x y -> x.TypeDefs.[y]) + activeAssy.Name + ty.BaseType + + let sigType = + match baseTy with + | ResolvedBaseType.Enum + | ResolvedBaseType.ValueType -> SignatureTypeKind.ValueType + | ResolvedBaseType.Object -> SignatureTypeKind.Class + | ResolvedBaseType.Delegate -> failwith "todo" + + TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make td, activeAssy.Name.FullName, sigType) | MetadataToken.TypeSpecification handle -> state.ActiveAssembly(thread).TypeSpecs.[handle].Signature | m -> failwith $"unexpected metadata token {m} in IsInst"