private string SerializeVisualBasicImportTypeReference(ITypeReference typeReference) { Debug.Assert(!(typeReference is IArrayTypeReference)); Debug.Assert(!(typeReference is IPointerTypeReference)); Debug.Assert(!(typeReference is IManagedPointerTypeReference)); Debug.Assert(!typeReference.IsTypeSpecification()); var result = PooledStringBuilder.GetInstance(); ArrayBuilder <string> nestedNamesReversed; INestedTypeReference nestedType = typeReference.AsNestedTypeReference; if (nestedType != null) { nestedNamesReversed = ArrayBuilder <string> .GetInstance(); while (nestedType != null) { nestedNamesReversed.Add(nestedType.Name); typeReference = nestedType.GetContainingType(_metadataWriter.Context); nestedType = typeReference.AsNestedTypeReference; } } else { nestedNamesReversed = null; } INamespaceTypeReference namespaceType = typeReference.AsNamespaceTypeReference; Debug.Assert(namespaceType != null); string namespaceName = namespaceType.NamespaceName; if (namespaceName.Length != 0) { result.Builder.Append(namespaceName); result.Builder.Append('.'); } result.Builder.Append(namespaceType.Name); if (nestedNamesReversed != null) { for (int i = nestedNamesReversed.Count - 1; i >= 0; i--) { result.Builder.Append('.'); result.Builder.Append(nestedNamesReversed[i]); } nestedNamesReversed.Free(); } return(result.ToStringAndFree()); }
private string SerializeVisualBasicImportTypeReference(ITypeReference typeReference) { Debug.Assert(!(typeReference is IArrayTypeReference)); Debug.Assert(!(typeReference is IPointerTypeReference)); Debug.Assert(!(typeReference is IManagedPointerTypeReference)); Debug.Assert(!typeReference.IsTypeSpecification()); var result = PooledStringBuilder.GetInstance(); ArrayBuilder<string> nestedNamesReversed; INestedTypeReference nestedType = typeReference.AsNestedTypeReference; if (nestedType != null) { nestedNamesReversed = ArrayBuilder<string>.GetInstance(); while (nestedType != null) { nestedNamesReversed.Add(nestedType.Name); typeReference = nestedType.GetContainingType(_metadataWriter.Context); nestedType = typeReference.AsNestedTypeReference; } } else { nestedNamesReversed = null; } INamespaceTypeReference namespaceType = typeReference.AsNamespaceTypeReference; Debug.Assert(namespaceType != null); string namespaceName = namespaceType.NamespaceName; if (namespaceName.Length != 0) { result.Builder.Append(namespaceName); result.Builder.Append('.'); } result.Builder.Append(namespaceType.Name); if (nestedNamesReversed != null) { for (int i = nestedNamesReversed.Count - 1; i >= 0; i--) { result.Builder.Append('.'); result.Builder.Append(nestedNamesReversed[i]); } nestedNamesReversed.Free(); } return result.ToStringAndFree(); }
internal static string GetSerializedTypeName(this ITypeReference typeReference, EmitContext context, ref bool isAssemblyQualified) { var pooled = PooledStringBuilder.GetInstance(); StringBuilder sb = pooled.Builder; IArrayTypeReference arrType = typeReference as IArrayTypeReference; if (arrType != null) { typeReference = arrType.GetElementType(context); bool isAssemQual = false; AppendSerializedTypeName(sb, typeReference, ref isAssemQual, context); if (arrType.IsSZArray) { sb.Append("[]"); } else { sb.Append('['); if (arrType.Rank == 1) { sb.Append('*'); } sb.Append(',', (int)arrType.Rank - 1); sb.Append(']'); } goto done; } IPointerTypeReference pointer = typeReference as IPointerTypeReference; if (pointer != null) { typeReference = pointer.GetTargetType(context); bool isAssemQual = false; AppendSerializedTypeName(sb, typeReference, ref isAssemQual, context); sb.Append('*'); goto done; } INamespaceTypeReference namespaceType = typeReference.AsNamespaceTypeReference; if (namespaceType != null) { var name = namespaceType.NamespaceName; if (name.Length != 0) { sb.Append(name); sb.Append('.'); } sb.Append(GetMangledAndEscapedName(namespaceType)); goto done; } if (typeReference.IsTypeSpecification()) { ITypeReference uninstantiatedTypeReference = typeReference.GetUninstantiatedGenericType(context); ArrayBuilder <ITypeReference> consolidatedTypeArguments = ArrayBuilder <ITypeReference> .GetInstance(); typeReference.GetConsolidatedTypeArguments(consolidatedTypeArguments, context); bool uninstantiatedTypeIsAssemblyQualified = false; sb.Append(GetSerializedTypeName(uninstantiatedTypeReference, context, ref uninstantiatedTypeIsAssemblyQualified)); sb.Append('['); bool first = true; foreach (ITypeReference argument in consolidatedTypeArguments) { if (first) { first = false; } else { sb.Append(','); } bool isAssemQual = true; AppendSerializedTypeName(sb, argument, ref isAssemQual, context); } consolidatedTypeArguments.Free(); sb.Append(']'); goto done; } INestedTypeReference nestedType = typeReference.AsNestedTypeReference; if (nestedType != null) { bool nestedTypeIsAssemblyQualified = false; sb.Append(GetSerializedTypeName(nestedType.GetContainingType(context), context, ref nestedTypeIsAssemblyQualified)); sb.Append('+'); sb.Append(GetMangledAndEscapedName(nestedType)); goto done; } // TODO: error done: if (isAssemblyQualified) { AppendAssemblyQualifierIfNecessary(sb, UnwrapTypeReference(typeReference, context), out isAssemblyQualified, context); } return(pooled.ToStringAndFree()); }