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