Beispiel #1
0
        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));
        }
Beispiel #2
0
        /// <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);
        }