TypeSig GetThisType(CorFunction func) { if (func == null) { return(null); } var funcClass = func.Class; var mod = funcClass == null ? null : funcClass.Module; var mdi = mod == null ? null : mod.GetMetaDataInterface <IMetaDataImport>(); if (mdi == null) { return(null); } int numTypeGenArgs = MetaDataUtils.GetCountGenericParameters(mdi, funcClass.Token); var genTypeArgs = this.TypeParameters.Take(numTypeGenArgs).ToArray(); var td = DebugSignatureReader.CreateTypeDef(mdi, funcClass.Token); // Assume it's a class for now. The code should ignore ClassSig and just use the TypeDef var sig = new ClassSig(td); if (genTypeArgs.Length == 0) { return(sig); } var genArgs = new List <TypeSig>(genTypeArgs.Length); for (int i = 0; i < genTypeArgs.Length; i++) { genArgs.Add(new GenericVar(i)); } return(new GenericInstSig(sig, genArgs)); }
/// <summary> /// Splits up <see cref="TypeParameters"/> into type and method generic arguments /// </summary> /// <param name="typeGenArgs">Gets updated with a list containing all generic type arguments</param> /// <param name="methGenArgs">Gets updated with a list containing all generic method arguments</param> /// <returns></returns> public bool GetTypeAndMethodGenericParameters(out CorType[] typeGenArgs, out CorType[] methGenArgs) { var func = Function; var module = func?.Module; if (module == null) { typeGenArgs = Array.Empty <CorType>(); methGenArgs = Array.Empty <CorType>(); return(false); } var mdi = module.GetMetaDataInterface <IMetaDataImport>(); var gas = new List <CorType>(TypeParameters); var cls = func.Class; int typeGenArgsCount = cls == null ? 0 : MetaDataUtils.GetCountGenericParameters(mdi, cls.Token); int methGenArgsCount = MetaDataUtils.GetCountGenericParameters(mdi, func.Token); Debug.Assert(typeGenArgsCount + methGenArgsCount == gas.Count); typeGenArgs = new CorType[typeGenArgsCount]; methGenArgs = new CorType[methGenArgsCount]; int j = 0; for (int i = 0; j < gas.Count && i < typeGenArgs.Length; i++, j++) { typeGenArgs[i] = gas[j]; } for (int i = 0; j < gas.Count && i < methGenArgs.Length; i++, j++) { methGenArgs[i] = gas[j]; } return(true); }