private static BlobHandle SerializeModuleImportScope( MetadataBuilder metadataBuilder, IEnumerable <ImportInfo> csExternAliasImports, IEnumerable <ImportInfo> vbProjectLevelImports, string vbDefaultNamespace, MetadataModel metadataModel) { // module-level import scope: var builder = new BlobBuilder(); var encoder = new ImportDefinitionEncoder(metadataBuilder, builder); if (vbDefaultNamespace != null) { SerializeModuleDefaultNamespace(metadataBuilder, vbDefaultNamespace); } foreach (var import in csExternAliasImports) { SerializeImport(encoder, import, metadataModel); } foreach (var import in vbProjectLevelImports) { SerializeImport(encoder, import, metadataModel); } return(metadataBuilder.GetOrAddBlob(builder)); }
private static BlobHandle SerializeImportsBlob(MetadataBuilder metadataBuilder, ImmutableArray <ImportInfo> imports, MetadataModel metadataModel) { var builder = new BlobBuilder(); var encoder = new ImportDefinitionEncoder(metadataBuilder, builder); foreach (var import in imports) { SerializeImport(encoder, import, metadataModel); } return(metadataBuilder.GetOrAddBlob(builder)); }
private static void SerializeImport(ImportDefinitionEncoder encoder, ImportInfo import, MetadataModel metadataModel) { var assemblyRef = default(AssemblyReferenceHandle); EntityHandle type; switch (import.Kind) { case ImportTargetKind.Assembly: // alias: assembly alias // target: assembly name for module-level extern alias definition, or null for file level extern alias import if (import.Target == null) { // TODO: skip if the alias isn't defined in an ancestor scope? encoder.ImportAssemblyReferenceAlias(import.Alias); break; } if (!metadataModel.TryResolveAssemblyReference(import.Target, out assemblyRef)) { // no type from the assembly is used, the AssemblyRef is not present in the metadata break; } encoder.AliasAssemblyReference(assemblyRef, import.Alias); break; case ImportTargetKind.Namespace: if (import.ExternAlias != null && !metadataModel.TryResolveAssemblyReference(import.ExternAlias, out assemblyRef)) { // no type from the assembly is used, the AssemblyRef is not present in the metadata break; } encoder.Namespace(import.Target, import.Alias, assemblyRef); break; case ImportTargetKind.Type: if (!metadataModel.TryResolveType(import.Target, out type)) { // the type is not used in the source, the metadata is missing a TypeRef. break; } encoder.Type(type, import.Alias); break; case ImportTargetKind.NamespaceOrType: if (metadataModel.TryResolveType(import.Target, out type)) { encoder.Type(type, import.Alias); } else { encoder.Namespace(import.Target, import.Alias); } break; case ImportTargetKind.XmlNamespace: encoder.XmlNamespace(import.Alias, import.Target); break; case ImportTargetKind.DefaultNamespace: // alraedy handled throw ExceptionUtilities.Unreachable; case ImportTargetKind.CurrentNamespace: case ImportTargetKind.MethodToken: case ImportTargetKind.Defunct: break; } }