Ejemplo n.º 1
0
        public static void AddTexts(TypeSig type, IList <TextRun> target)
        {
            if (type.IsSZArray)
            {
                if (type.Next != null)
                {
                    AddTexts(type.Next, target);
                    target.Add(new TextRun("[]"));
                    return;
                }
            }
            else if (type.IsArray)
            {
                if (type.Next != null)
                {
                    AddTexts(type.Next, target);
                    target.Add(new TextRun("["));
                    var arraySig = type.ToArraySig();
                    for (var i = 1; i < arraySig.Rank; i++)
                    {
                        target.Add(new TextRun(","));
                    }
                    target.Add(new TextRun("]"));
                    return;
                }
            }

            string text;
            string cssClass;

            var keyword = TypeSigAsKeyword(type);

            if (!string.IsNullOrEmpty(keyword))
            {
                text     = keyword;
                cssClass = "d-keyword";
            }
            else
            {
                text = type.TypeName;
                // Remove generic parameter count
                // ex) List`1 => List
                var generic = text.LastIndexOf('`');
                if (generic > 0)
                {
                    text = text.Substring(0, generic);
                }

                switch (type.ElementType)
                {
                case ElementType.ValueType:
                    cssClass = "d-valuetype";
                    break;

                case ElementType.Class:
                    var classSig = type.ToClassSig();
                    if (classSig.IsTypeDef)
                    {
                        var typeDef = classSig.TypeDef;
                        if (typeDef.IsInterface)
                        {
                            cssClass = "d-interface";
                        }
                        else if (typeDef.IsSealed)
                        {
                            cssClass = "d-sealedtype";
                        }
                        else
                        {
                            cssClass = "d-type";
                        }
                    }
                    else
                    {
                        cssClass = "d-type";
                    }
                    break;

                case ElementType.GenericInst:
                    var genericInstSig = type.ToGenericInstSig();
                    if (genericInstSig.GenericType.IsTypeDef)
                    {
                        var genericTypeSig = genericInstSig.GenericType.TypeDef.ToTypeSig();
                        AddTexts(genericTypeSig, target);
                    }
                    else
                    {
                        target.Add(new TextRun(text, "d-type"));
                    }
                    target.Add(new TextRun("<"));
                    var _isFirst = true;
                    foreach (var genericArgType in genericInstSig.GenericArguments)
                    {
                        if (_isFirst)
                        {
                            _isFirst = false;
                        }
                        else
                        {
                            target.Add(new TextRun(", "));
                        }
                        AddTexts(genericArgType, target);
                    }
                    target.Add(new TextRun(">"));
                    return;

                case ElementType.I:
                case ElementType.U:
                    cssClass = "d-valuetype";
                    break;

                case ElementType.Var:
                    cssClass = "d-typegenericparameter";
                    break;

                case ElementType.MVar:
                    cssClass = "d-methodgenericparameter";
                    break;

                default:
                    cssClass = string.Empty;
                    break;
                }
            }

            target.Add(new TextRun(text, cssClass));
        }