Example #1
0
        private TypeSig Import(TypeSig typeSig)
        {
            if (typeSig.DefinitionAssembly != null && SourceAssemblies.Contains(typeSig.DefinitionAssembly.Name))
            {
                var baseTypeSig = typeSig;

                if (typeSig.IsSZArray || typeSig.IsByRef || typeSig.IsArray)
                {
                    baseTypeSig = typeSig.Next;
                }
                else if (typeSig.IsFunctionPointer || typeSig.IsPointer || typeSig.IsPinned || typeSig.IsModuleSig || typeSig.IsGenericParameter ||
                         typeSig.IsGenericTypeParameter || typeSig.IsGenericInstanceType || typeSig.IsGenericMethodParameter || typeSig.IsValueArray)
                {
                    throw new NotImplementedException();
                }

                TypeSig importedTypeSig;
                if (baseTypeSig.IsGenericInstanceType)
                {
                    importedTypeSig = RemapGenericInstSig(baseTypeSig.ToGenericInstSig());
                }
                else
                {
                    var name = baseTypeSig.FullName;

                    var targetTypeDef = TargetModule.FindThrow(name, false);

                    importedTypeSig = Module.Import(targetTypeDef).ToTypeSig();

                    if (Options.Resolve)
                    {
                        importedTypeSig.ToTypeDefOrRef().ResolveTypeDefThrow();
                    }
                }

                if (typeSig.IsSZArray)
                {
                    return(new SZArraySig(importedTypeSig));
                }
                else if (typeSig.IsByRef)
                {
                    return(new ByRefSig(importedTypeSig));
                }
                else if (typeSig.IsArray)
                {
                    var arraySig = typeSig.ToArraySig();

                    return(new ArraySig(importedTypeSig, arraySig.Rank, arraySig.Sizes, arraySig.LowerBounds));
                }
                else
                {
                    return(importedTypeSig);
                }
            }

            return(typeSig);
        }
Example #2
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));
        }