private void SerializeImport(BlobBuilder writer, UsedNamespaceOrType import) { if (import.TargetXmlNamespaceOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); Debug.Assert(import.TargetTypeOpt == null); // <import> ::= ImportXmlNamespace <alias> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportXmlNamespace); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.AliasOpt))); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.TargetXmlNamespaceOpt))); } else if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); if (import.AliasOpt != null) { // <import> ::= AliasType <alias> <target-type> writer.WriteByte((byte)ImportDefinitionKind.AliasType); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.AliasOpt))); } else { // <import> ::= ImportType <target-type> writer.WriteByte((byte)ImportDefinitionKind.ImportType); } writer.WriteCompressedInteger(CodedIndex.TypeDefOrRefOrSpec(GetTypeHandle(import.TargetTypeOpt))); // TODO: index in release build } else if (import.TargetNamespaceOpt != null) { if (import.TargetAssemblyOpt != null) { if (import.AliasOpt != null) { // <import> ::= AliasAssemblyNamespace <alias> <target-assembly> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.AliasAssemblyNamespace); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.AliasOpt))); } else { // <import> ::= ImportAssemblyNamespace <target-assembly> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportAssemblyNamespace); } writer.WriteCompressedInteger(MetadataTokens.GetRowNumber(GetAssemblyReferenceHandle(import.TargetAssemblyOpt))); } else { if (import.AliasOpt != null) { // <import> ::= AliasNamespace <alias> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.AliasNamespace); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.AliasOpt))); } else { // <import> ::= ImportNamespace <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportNamespace); } } // TODO: cache? string namespaceName = TypeNameSerializer.BuildQualifiedNamespaceName(import.TargetNamespaceOpt); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(namespaceName))); } else { // <import> ::= ImportReferenceAlias <alias> Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetAssemblyOpt == null); writer.WriteByte((byte)ImportDefinitionKind.ImportAssemblyReferenceAlias); writer.WriteCompressedInteger(MetadataTokens.GetHeapOffset(_debugMetadataOpt.GetOrAddBlobUTF8(import.AliasOpt))); } }
private string TryEncodeImport(UsedNamespaceOrType import, HashSet<string> declaredExternAliasesOpt, bool isProjectLevel) { // NOTE: Dev12 has related cases "I" and "O" in EMITTER::ComputeDebugNamespace, // but they were probably implementation details that do not affect Roslyn. if (Module.GenerateVisualBasicStylePdb) { // VB doesn't support extern aliases Debug.Assert(import.TargetAssemblyOpt == null); Debug.Assert(declaredExternAliasesOpt == null); if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); // Native compiler doesn't write imports with generic types to PDB. if (import.TargetTypeOpt.IsTypeSpecification()) { return null; } string typeName = GetOrCreateSerializedTypeName(import.TargetTypeOpt); if (import.AliasOpt != null) { return (isProjectLevel ? "@PA:" : "@FA:") + import.AliasOpt + "=" + typeName; } else { return (isProjectLevel ? "@PT:" : "@FT:") + typeName; } } if (import.TargetNamespaceOpt != null) { string namespaceName = GetOrCreateSerializedNamespaceName(import.TargetNamespaceOpt); if (import.AliasOpt == null) { return (isProjectLevel ? "@P:" : "@F:") + namespaceName; } else { return (isProjectLevel ? "@PA:" : "@FA:") + import.AliasOpt + "=" + namespaceName; } } Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetXmlNamespaceOpt != null); return (isProjectLevel ? "@PX:" : "@FX:") + import.AliasOpt + "=" + import.TargetXmlNamespaceOpt; } Debug.Assert(import.TargetXmlNamespaceOpt == null); if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); string typeName = GetOrCreateSerializedTypeName(import.TargetTypeOpt); return (import.AliasOpt != null) ? "A" + import.AliasOpt + " T" + typeName : "T" + typeName; } if (import.TargetNamespaceOpt != null) { string namespaceName = GetOrCreateSerializedNamespaceName(import.TargetNamespaceOpt); if (import.AliasOpt != null) { return (import.TargetAssemblyOpt != null) ? "A" + import.AliasOpt + " E" + namespaceName + " " + GetAssemblyReferenceAlias(import.TargetAssemblyOpt, declaredExternAliasesOpt) : "A" + import.AliasOpt + " U" + namespaceName; } else { return (import.TargetAssemblyOpt != null) ? "E" + namespaceName + " " + GetAssemblyReferenceAlias(import.TargetAssemblyOpt, declaredExternAliasesOpt) : "U" + namespaceName; } } Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetAssemblyOpt == null); return "X" + import.AliasOpt; }
private string TryEncodeImport(UsedNamespaceOrType import, HashSet <string> declaredExternAliasesOpt, bool isProjectLevel) { // NOTE: Dev12 has related cases "I" and "O" in EMITTER::ComputeDebugNamespace, // but they were probably implementation details that do not affect roslyn. if (Module.GenerateVisualBasicStylePdb) { // VB doesn't support extern aliases Debug.Assert(import.TargetAssemblyOpt == null); Debug.Assert(declaredExternAliasesOpt == null); if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); // Native compiler doesn't write imports with generic types to PDB. if (import.TargetTypeOpt.IsTypeSpecification()) { return(null); } string typeName = GetOrCreateSerializedTypeName(import.TargetTypeOpt); if (import.AliasOpt != null) { return((isProjectLevel ? "@PA:" : "@FA:") + import.AliasOpt + "=" + typeName); } else { return((isProjectLevel ? "@PT:" : "@FT:") + typeName); } } if (import.TargetNamespaceOpt != null) { string namespaceName = GetOrCreateSerializedNamespaceName(import.TargetNamespaceOpt); if (import.AliasOpt == null) { return((isProjectLevel ? "@P:" : "@F:") + namespaceName); } else { return((isProjectLevel ? "@PA:" : "@FA:") + import.AliasOpt + "=" + namespaceName); } } Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetXmlNamespaceOpt != null); return((isProjectLevel ? "@PX:" : "@FX:") + import.AliasOpt + "=" + import.TargetXmlNamespaceOpt); } Debug.Assert(import.TargetXmlNamespaceOpt == null); if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); string typeName = GetOrCreateSerializedTypeName(import.TargetTypeOpt); return((import.AliasOpt != null) ? "A" + import.AliasOpt + " T" + typeName : "T" + typeName); } if (import.TargetNamespaceOpt != null) { string namespaceName = GetOrCreateSerializedNamespaceName(import.TargetNamespaceOpt); if (import.AliasOpt != null) { return((import.TargetAssemblyOpt != null) ? "A" + import.AliasOpt + " E" + namespaceName + " " + GetAssemblyReferenceAlias(import.TargetAssemblyOpt, declaredExternAliasesOpt) : "A" + import.AliasOpt + " U" + namespaceName); } else { return((import.TargetAssemblyOpt != null) ? "E" + namespaceName + " " + GetAssemblyReferenceAlias(import.TargetAssemblyOpt, declaredExternAliasesOpt) : "U" + namespaceName); } } Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetAssemblyOpt == null); return("X" + import.AliasOpt); }
private void SerializeImport(BlobBuilder writer, UsedNamespaceOrType import) { if (import.TargetXmlNamespaceOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); Debug.Assert(import.TargetTypeOpt == null); // <import> ::= ImportXmlNamespace <alias> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportXmlNamespace); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.AliasOpt))); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.TargetXmlNamespaceOpt))); } else if (import.TargetTypeOpt != null) { Debug.Assert(import.TargetNamespaceOpt == null); Debug.Assert(import.TargetAssemblyOpt == null); if (import.AliasOpt != null) { // <import> ::= AliasType <alias> <target-type> writer.WriteByte((byte)ImportDefinitionKind.AliasType); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.AliasOpt))); } else { // <import> ::= ImportType <target-type> writer.WriteByte((byte)ImportDefinitionKind.ImportType); } writer.WriteCompressedInteger(GetTypeDefOrRefCodedIndex(import.TargetTypeOpt, treatRefAsPotentialTypeSpec: true)); // TODO: index in release build } else if (import.TargetNamespaceOpt != null) { if (import.TargetAssemblyOpt != null) { if (import.AliasOpt != null) { // <import> ::= AliasAssemblyNamespace <alias> <target-assembly> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.AliasAssemblyNamespace); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.AliasOpt))); } else { // <import> ::= ImportAssemblyNamespace <target-assembly> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportAssemblyNamespace); } writer.WriteCompressedInteger((uint)GetAssemblyRefIndex(import.TargetAssemblyOpt)); } else { if (import.AliasOpt != null) { // <import> ::= AliasNamespace <alias> <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.AliasNamespace); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.AliasOpt))); } else { // <import> ::= ImportNamespace <target-namespace> writer.WriteByte((byte)ImportDefinitionKind.ImportNamespace); } } // TODO: cache? string namespaceName = TypeNameSerializer.BuildQualifiedNamespaceName(import.TargetNamespaceOpt); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(namespaceName))); } else { // <import> ::= ImportReferenceAlias <alias> Debug.Assert(import.AliasOpt != null); Debug.Assert(import.TargetAssemblyOpt == null); writer.WriteByte((byte)ImportDefinitionKind.ImportAssemblyReferenceAlias); writer.WriteCompressedInteger((uint)_debugHeapsOpt.ResolveBlobIndex(_debugHeapsOpt.GetBlobIndexUtf8(import.AliasOpt))); } }