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