| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | using dnlib.DotNet;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace HybridCLR.Editor.Meta{    public class GenericArgumentContext    {        private readonly List<TypeSig> typeArgsStack;        private readonly List<TypeSig> methodArgsStack;        public GenericArgumentContext(List<TypeSig> typeArgsStack, List<TypeSig> methodArgsStack)        {            this.typeArgsStack = typeArgsStack;            this.methodArgsStack = methodArgsStack;        }        public TypeSig Resolve(TypeSig typeSig)        {			if (!typeSig.ContainsGenericParameter)            {				return typeSig;            }            typeSig = typeSig.RemovePinnedAndModifiers();			switch (typeSig.ElementType)			{				case ElementType.Ptr: return new PtrSig(Resolve(typeSig.Next));				case ElementType.ByRef: return new ByRefSig(Resolve(typeSig.Next));                case ElementType.SZArray: return new SZArraySig(Resolve(typeSig.Next));				case ElementType.Array:                {                    var ara = (ArraySig)typeSig;                    return new ArraySig(Resolve(typeSig.Next), ara.Rank, ara.Sizes, ara.LowerBounds);                }				case ElementType.Var:                {                    GenericVar genericVar = (GenericVar)typeSig;                    var newSig = Resolve(typeArgsStack, genericVar.Number);                    if (newSig == null)                    {                        throw new Exception();                    }                    return newSig;                }				case ElementType.MVar:                {                    GenericMVar genericVar = (GenericMVar)typeSig;                    var newSig = Resolve(methodArgsStack, genericVar.Number);                    if (newSig == null)                    {                        throw new Exception();                    }                    return newSig;                }				case ElementType.GenericInst:                {                    var gia = (GenericInstSig)typeSig;                    return new GenericInstSig(gia.GenericType, gia.GenericArguments.Select(ga => Resolve(ga)).ToList());                }				case ElementType.FnPtr:                {                    var fptr = (FnPtrSig)typeSig;                    var cs = fptr.Signature;                    CallingConventionSig ccs;                    switch (cs)                    {                        case MethodSig ms:                        {                            ccs = new MethodSig(ms.GetCallingConvention(), ms.GenParamCount, Resolve(ms.RetType), ms.Params.Select(p => Resolve(p)).ToList());                            break;                        }                        case PropertySig ps:                        {                            ccs = new PropertySig(ps.HasThis, Resolve(ps.RetType));                            break;                        }                        case GenericInstMethodSig gims:                        {                            ccs = new GenericInstMethodSig(gims.GenericArguments.Select(ga => Resolve(ga)).ToArray());                            break;                        }                        default: throw new NotSupportedException(cs.ToString());                    }                    return new FnPtrSig(ccs);                }				case ElementType.ValueArray:                {                    var vas = (ValueArraySig)typeSig;                    return new ValueArraySig(Resolve(vas.Next), vas.Size);                }                default: return typeSig;			}        }        private TypeSig Resolve(List<TypeSig> args, uint number)        {            return args[(int)number];        }    }}
 |