mirror of
https://github.com/Smaug123/WoofWare.PawPrint
synced 2025-10-08 23:48:39 +00:00
Fix stelem of nested generic (#86)
This commit is contained in:
@@ -55,14 +55,33 @@ module TypeMethodSignature =
|
||||
RequiredParameterCount = p.RequiredParameterCount
|
||||
}
|
||||
|
||||
let map<'a, 'b> (f : 'a -> 'b) (signature : TypeMethodSignature<'a>) : TypeMethodSignature<'b> =
|
||||
{
|
||||
Header = signature.Header
|
||||
ReturnType = f signature.ReturnType
|
||||
ParameterTypes = signature.ParameterTypes |> List.map f
|
||||
GenericParameterCount = signature.GenericParameterCount
|
||||
RequiredParameterCount = signature.RequiredParameterCount
|
||||
}
|
||||
let map<'a, 'b, 'state>
|
||||
(state : 'state)
|
||||
(f : 'state -> 'a -> 'state * 'b)
|
||||
(signature : TypeMethodSignature<'a>)
|
||||
: 'state * TypeMethodSignature<'b>
|
||||
=
|
||||
let state, ret = f state signature.ReturnType
|
||||
|
||||
let state, pars =
|
||||
((state, []), signature.ParameterTypes)
|
||||
||> List.fold (fun (state, acc) par ->
|
||||
let state, result = f state par
|
||||
state, result :: acc
|
||||
)
|
||||
|
||||
let pars = List.rev pars
|
||||
|
||||
let answer =
|
||||
{
|
||||
Header = signature.Header
|
||||
ReturnType = ret
|
||||
ParameterTypes = pars
|
||||
GenericParameterCount = signature.GenericParameterCount
|
||||
RequiredParameterCount = signature.RequiredParameterCount
|
||||
}
|
||||
|
||||
state, answer
|
||||
|
||||
/// See I.8.2.2
|
||||
type PrimitiveType =
|
||||
|
@@ -84,6 +84,16 @@ type TypeInfo<'generic, 'fieldGeneric> =
|
||||
override this.ToString () =
|
||||
$"%s{this.Assembly.Name}.%s{this.Namespace}.%s{this.Name}"
|
||||
|
||||
static member NominallyEqual
|
||||
(a : TypeInfo<'generic, 'fieldGeneric>)
|
||||
(b : TypeInfo<'generic, 'fieldGeneric>)
|
||||
: bool
|
||||
=
|
||||
a.Assembly.FullName = b.Assembly.FullName
|
||||
&& a.Namespace = b.Namespace
|
||||
&& a.Name = b.Name
|
||||
&& a.Generics = b.Generics
|
||||
|
||||
type TypeInfoEval<'ret> =
|
||||
abstract Eval<'a, 'field> : TypeInfo<'a, 'field> -> 'ret
|
||||
|
||||
@@ -97,7 +107,7 @@ type TypeInfoCrate =
|
||||
|
||||
[<RequireQualifiedAccess>]
|
||||
module TypeInfoCrate =
|
||||
let make<'a, 'field> (t : TypeInfo<'a, 'field>) =
|
||||
let make<'a, 'field> (t : TypeInfo<'a, 'field>) : TypeInfoCrate =
|
||||
{ new TypeInfoCrate with
|
||||
member _.Apply e = e.Eval t
|
||||
|
||||
@@ -317,7 +327,7 @@ module TypeInfo =
|
||||
(getName : 'corelib -> AssemblyName)
|
||||
(getTypeDef : 'corelib -> TypeDefinitionHandle -> TypeInfo<'generic, 'field>)
|
||||
(getTypeRef : 'corelib -> TypeReferenceHandle -> TypeInfo<'generic, 'field>)
|
||||
(ty : TypeInfo<'generic, 'field>)
|
||||
(ty : TypeInfo<TypeDefn, TypeDefn>)
|
||||
: TypeDefn
|
||||
=
|
||||
let stk =
|
||||
@@ -327,4 +337,11 @@ module TypeInfo =
|
||||
| ResolvedBaseType.Object
|
||||
| ResolvedBaseType.Delegate -> SignatureTypeKind.Class
|
||||
|
||||
TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make ty.TypeDefHandle, ty.Assembly.FullName, stk)
|
||||
let defn =
|
||||
TypeDefn.FromDefinition (ComparableTypeDefinitionHandle.Make ty.TypeDefHandle, ty.Assembly.FullName, stk)
|
||||
|
||||
if ty.Generics.IsEmpty then
|
||||
defn
|
||||
else
|
||||
let generics = ty.Generics
|
||||
TypeDefn.GenericInstantiation (defn, generics)
|
||||
|
@@ -827,13 +827,7 @@ module internal UnaryMetadataIlOp =
|
||||
_.Name
|
||||
(fun x y -> x.TypeDefs.[y])
|
||||
(fun x y -> x.TypeRefs.[y] |> failwithf "%+A")
|
||||
(elementType
|
||||
|> TypeInfo.mapGeneric (fun i _ ->
|
||||
{
|
||||
Name = "<unknown>"
|
||||
SequenceNumber = i
|
||||
}
|
||||
))
|
||||
elementType
|
||||
|
||||
let state, zeroOfType =
|
||||
IlMachineState.cliTypeZeroOf
|
||||
|
Reference in New Issue
Block a user