From 89e6e1b4e8cbdf4c9c90e5a29b0444ca42c1d946 Mon Sep 17 00:00:00 2001 From: Patrick Stevens <3138005+Smaug123@users.noreply.github.com> Date: Sun, 15 Jun 2025 13:34:18 +0100 Subject: [PATCH] Add name to concrete type (#43) --- WoofWare.PawPrint.Domain/ConcreteType.fs | 7 +++++++ WoofWare.PawPrint.Domain/FieldInfo.fs | 5 ++++- WoofWare.PawPrint.Domain/MethodInfo.fs | 11 ++++++++++- WoofWare.PawPrint/IlMachineState.fs | 4 ++-- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/WoofWare.PawPrint.Domain/ConcreteType.fs b/WoofWare.PawPrint.Domain/ConcreteType.fs index 8461a52..a1b2651 100644 --- a/WoofWare.PawPrint.Domain/ConcreteType.fs +++ b/WoofWare.PawPrint.Domain/ConcreteType.fs @@ -22,12 +22,14 @@ type ConcreteType<'typeGeneric when 'typeGeneric : comparison and 'typeGeneric : { _AssemblyName : AssemblyName _Definition : ComparableTypeDefinitionHandle + _Name : string _Generics : 'typeGeneric list } member this.Assembly : AssemblyName = this._AssemblyName member this.Definition : ComparableTypeDefinitionHandle = this._Definition member this.Generics : 'typeGeneric list = this._Generics + member this.Name = this._Name override this.Equals (other : obj) : bool = match other with @@ -69,6 +71,7 @@ type RuntimeConcreteType = ConcreteType module ConcreteType = let make (assemblyName : AssemblyName) + (name : string) (defn : TypeDefinitionHandle) (generics : TypeDefn list) : RuntimeConcreteType @@ -76,18 +79,21 @@ module ConcreteType = { _AssemblyName = assemblyName _Definition = ComparableTypeDefinitionHandle.Make defn + _Name = name _Generics = generics } let make' (assemblyName : AssemblyName) (defn : TypeDefinitionHandle) + (name : string) (genericParamCount : int) : ConcreteType = { _AssemblyName = assemblyName _Definition = ComparableTypeDefinitionHandle.Make defn + _Name = name _Generics = List.replicate genericParamCount FakeUnit.FakeUnit } @@ -103,4 +109,5 @@ module ConcreteType = _AssemblyName = x._AssemblyName _Definition = x._Definition _Generics = generics + _Name = x._Name } diff --git a/WoofWare.PawPrint.Domain/FieldInfo.fs b/WoofWare.PawPrint.Domain/FieldInfo.fs index 305b766..ddeda38 100644 --- a/WoofWare.PawPrint.Domain/FieldInfo.fs +++ b/WoofWare.PawPrint.Domain/FieldInfo.fs @@ -48,7 +48,10 @@ module FieldInfo = let fieldSig = def.DecodeSignature (TypeDefn.typeProvider assembly, ()) let declaringType = def.GetDeclaringType () let typeGenerics = mr.GetTypeDefinition(declaringType).GetGenericParameters().Count - let declaringType = ConcreteType.make' assembly declaringType typeGenerics + let declaringTypeName = mr.GetString (mr.GetTypeDefinition(declaringType).Name) + + let declaringType = + ConcreteType.make' assembly declaringType declaringTypeName typeGenerics { Name = name diff --git a/WoofWare.PawPrint.Domain/MethodInfo.fs b/WoofWare.PawPrint.Domain/MethodInfo.fs index 5685a22..dbc7927 100644 --- a/WoofWare.PawPrint.Domain/MethodInfo.fs +++ b/WoofWare.PawPrint.Domain/MethodInfo.fs @@ -197,6 +197,9 @@ type MethodInfo<'typeGenerics when 'typeGenerics :> IComparable<'typeGenerics> a IsStatic : bool } + override this.ToString () = + $"{this.DeclaringType.Assembly.Name}.{this.DeclaringType.Name}.{this.Name}" + /// /// Whether this method's implementation is directly supplied by the CLI, rather than being loaded /// from an assembly as IL. @@ -613,6 +616,9 @@ module MethodInfo = let declaringType = methodDef.GetDeclaringType () + let declaringTypeName = + metadataReader.GetString (metadataReader.GetTypeDefinition(declaringType).Name) + let declaringTypeGenericParams = metadataReader.GetTypeDefinition(declaringType).GetGenericParameters().Count @@ -634,8 +640,11 @@ module MethodInfo = let methodGenericParams = GenericParameter.readAll metadataReader (methodDef.GetGenericParameters ()) + let declaringType = + ConcreteType.make' assemblyName declaringType declaringTypeName declaringTypeGenericParams + { - DeclaringType = ConcreteType.make' assemblyName declaringType declaringTypeGenericParams + DeclaringType = declaringType Handle = methodHandle Name = methodName Instructions = methodBody diff --git a/WoofWare.PawPrint/IlMachineState.fs b/WoofWare.PawPrint/IlMachineState.fs index be6b3b9..474ff77 100644 --- a/WoofWare.PawPrint/IlMachineState.fs +++ b/WoofWare.PawPrint/IlMachineState.fs @@ -620,7 +620,7 @@ module IlMachineState = ) // TypeDef won't have any generics; it would be a TypeSpec if it did - let ty = ConcreteType.make ty.Assembly typeDefinitionHandle [] + let ty = ConcreteType.make ty.Assembly ty.Name typeDefinitionHandle [] match loadClass loggerFactory corelib ty currentThread state with | FirstLoadThis state -> Error state @@ -644,7 +644,7 @@ module IlMachineState = targetType.Name ) - let ty = ConcreteType.make assy.Name targetType.TypeDefHandle [] + let ty = ConcreteType.make assy.Name targetType.Name targetType.TypeDefHandle [] match loadClass loggerFactory corelib ty currentThread state with | FirstLoadThis state -> Error state