Example #1
0
        IList <MethodSig> PossibleMethodSigs(ITypeDefOrRef declaringType, MethodSig sig, MethodData data)
        {
            // Setup generic types
            IList <TypeSig> typeGenerics = new List <TypeSig>(), methodGenerics = new List <TypeSig>();

            // Add all declaring spec generic types
            TypeSpec declaringSpec = declaringType as TypeSpec;

            if (declaringSpec != null)
            {
                var genericInstSig = declaringSpec.TryGetGenericInstSig();
                foreach (var garg in genericInstSig.GenericArguments)
                {
                    typeGenerics.Add(garg);
                }
            }

            // Add all method generic types
            if (data.HasGenericArguments)
            {
                foreach (var operand in data.GenericArguments)
                {
                    var gtype = this.ResolveType_NoLock(operand.Position);
                    methodGenerics.Add(gtype.ToTypeSig());
                }
            }

            // Todo: Combinations factoring in the possibility that return type might match
            // a generic type
            TypeSig         returnType  = ResolveType(data.ReturnType);
            IList <TypeSig> returnTypes = GenericUtils.PossibleTypeSigs(returnType, typeGenerics, methodGenerics);

            TypeSig[] paramTypes = new TypeSig[data.Parameters.Length];
            for (Int32 i = 0; i < paramTypes.Length; i++)
            {
                paramTypes[i] = ResolveType(data.Parameters[i]);
            }

            UInt32 genericTypeCount = (UInt32)data.GenericArguments.Length;

            IList <MethodSig> signatures = new List <MethodSig>();
            var paramCombos = GenericUtils.CreateGenericParameterCombinations(paramTypes, typeGenerics, methodGenerics);

            foreach (var rType in returnTypes)
            {
                foreach (var combo in paramCombos)
                {
                    var paramCombo = combo.ToArray();

                    MethodSig methodSig;

                    if (genericTypeCount == 0)
                    {
                        if (data.IsStatic)
                        {
                            methodSig = MethodSig.CreateStatic(rType, paramCombo);
                        }
                        else
                        {
                            methodSig = MethodSig.CreateInstance(rType, paramCombo);
                        }
                    }
                    else
                    {
                        if (data.IsStatic)
                        {
                            methodSig = MethodSig.CreateStaticGeneric(genericTypeCount, rType, paramCombo);
                        }
                        else
                        {
                            methodSig = MethodSig.CreateInstanceGeneric(genericTypeCount, rType, paramCombo);
                        }
                    }

                    signatures.Add(methodSig);
                }
            }

            return(signatures);
        }