예제 #1
0
        /// <summary>
        /// Adds a type to the type library.
        /// </summary>
        /// <param name="td">type to add</param>
        /// <returns>equivalent type descriptor which is contained inside the library</returns>
        public TypeDescriptor AddType(TypeDescriptor td)
        {
            if (td.HasIntrinsicTypeOverride ||
                td.CILType.IsPrimitive ||
                td.CILType.IsPointer ||
                td.CILType.IsByRef ||
                (!td.CILType.IsValueType && !td.CILType.IsArray) ||
                td.CILType.Equals(typeof(void)))
            {
                return(td);
            }

            //FIXME
            //if (!td.IsStatic)
            //    throw new InvalidOperationException("Only static types are allowed in a type library");

            Queue <TypeDescriptor> q = new Queue <TypeDescriptor>();

            q.Enqueue(td);
            while (q.Count > 0)
            {
                TypeDescriptor qtd = q.Dequeue();
                if (qtd.IsConstrained)
                {
                    Canonicalize(qtd.MakeUnconstrainedType());
                }
                else
                {
                    Canonicalize(qtd);
                }

                foreach (TypeDescriptor dep in qtd.GetDependentTypes())
                {
                    q.Enqueue(dep);
                }
            }

            return(Canonicalize(td));
        }