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