/// <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)); }