Exemple #1
0
        /// <summary>
        /// Resolve any generic types used in this type.
        /// </summary>
        /// <param name="selfReference"></param>
        /// <param name="typeParams"></param>
        /// <param name="methodParams"></param>
        public void Resolve(ref IRType selfReference, GenericParameterCollection typeParams, GenericParameterCollection methodParams)
        {
            if (!Resolved)
            {
                if (IsGeneric)
                {
                    if (IsTemporaryVar)
                    {
                        selfReference = typeParams[this.TemporaryVarOrMVarIndex];
                    }
                    else if (IsTemporaryMVar)
                    {
                        selfReference = methodParams[this.TemporaryVarOrMVarIndex];
                    }
                    else if (IsArrayType)
                    {
                        IRType elemType = ArrayType;
                        elemType.Resolve(ref elemType, typeParams, methodParams);
                        selfReference = Assembly.AppDomain.GetArrayType(elemType);
                    }
                    else if (this.GenericParameters.Resolved)
                    {
                        IRType tp = null;
                        if (!GenericTypes.TryGetValue(this, out tp))
                        {
                            tp = this.GenericType.Clone();
                            tp.GenericParameters.Substitute(typeParams, methodParams);
                            GenericTypes[tp] = tp;

                            for (int i = 0; i < tp.GenericParameters.Count; i++)
                            {
                                tp.GenericParameters[i] = this.GenericParameters[i];
                            }
                            for (int i = 0; i < tp.Methods.Count; i++)
                            {
                                tp.Methods[i] = tp.Methods[i].Resolved ? tp.Methods[i] : tp.Methods[i].Clone(tp);
                            }

                            tp.Substitute(typeParams, methodParams);
                        }
                        selfReference = tp;
                    }
                    else
                    {
#warning Need to do the rest of this resolution.
                    }
                }
                else
                {
                    Substitute(GenericParameterCollection.Empty, GenericParameterCollection.Empty);
                }
            }
        }