diff --git a/libraries/kotlinx-metadata/klib/build.gradle.kts b/libraries/kotlinx-metadata/klib/build.gradle.kts index e1ebed69985..6d769026c27 100644 --- a/libraries/kotlinx-metadata/klib/build.gradle.kts +++ b/libraries/kotlinx-metadata/klib/build.gradle.kts @@ -28,6 +28,8 @@ configurations.getByName("testCompile").extendsFrom(shadows) dependencies { compile(kotlinStdlib()) shadows(project(":kotlinx-metadata")) + // TODO: Get rid of this heavyweight dependency. + shadows(project(":core:descriptors")) shadows(project(":core:metadata")) shadows(project(":compiler:serialization")) shadows(project(":kotlin-util-klib-metadata")) diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt index bd18db830ef..b0f1a7d6c71 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/KlibModuleMetadata.kt @@ -104,7 +104,7 @@ class KlibModuleMetadata( writeStrategy: KlibModuleFragmentWriteStrategy = KlibModuleFragmentWriteStrategy.DEFAULT ): SerializedKlibMetadata { val reverseIndex = ReverseSourceFileIndexWriteExtension() - val c = WriteContext(KlibMetadataStringTable(), listOf(reverseIndex)) + val groupedFragments = fragments .groupBy(KmModuleFragment::fqNameOrFail) @@ -119,9 +119,12 @@ class KlibModuleMetadata( ) val groupedProtos = groupedFragments.mapValues { (_, fragments) -> fragments.map { + val c = WriteContext(KlibMetadataStringTable(), listOf(reverseIndex)) KlibModuleFragmentWriter(c.strings as KlibMetadataStringTable, c.contextExtensions).also(it::accept).write() } } + // This context and string table is only required for module-level annotations. + val c = WriteContext(KlibMetadataStringTable(), listOf(reverseIndex)) return SerializedKlibMetadata( header.writeHeader(c).build().toByteArray(), groupedProtos.map { it.value.map(ProtoBuf.PackageFragment::toByteArray) }, diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriteUtils.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriteUtils.kt index 1a5c21a8cdd..da05a208803 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriteUtils.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriteUtils.kt @@ -18,10 +18,15 @@ internal fun UniqId.writeUniqId(): KlibMetadataProtoBuf.DescriptorUniqId.Builder index = this@writeUniqId.index } +private fun wrapModuleName(moduleName: String): String = + moduleName + .let { if (it.startsWith("<")) it else "<$it" } + .let { if (it.endsWith(">")) it else "$it>" } + internal fun KlibHeader.writeHeader(context: WriteContext): KlibMetadataProtoBuf.Header.Builder = KlibMetadataProtoBuf.Header.newBuilder().also { proto -> val (strings, qualifiedNames) = (context.strings as StringTableImpl).buildProto() - proto.moduleName = moduleName + proto.moduleName = wrapModuleName(moduleName) proto.qualifiedNames = qualifiedNames proto.strings = strings proto.addAllPackageFragmentName(packageFragmentName) diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt index 3c41c0ad853..813fe46bb3a 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/impl/klibWriters.kt @@ -34,6 +34,12 @@ class KlibModuleFragmentWriter( t.build() override fun visitEnd() { + + // TODO: This should be moved to ModuleFragmentWriter. + val (strings, qualifiedNames) = (c.strings as KlibMetadataStringTable).buildProto() + t.strings = strings + t.qualifiedNames = qualifiedNames + val isPackageEmpty = if (t.`package` == null) { true } else { diff --git a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt index 673c43ab34e..f86cdca26a7 100644 --- a/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt +++ b/libraries/kotlinx-metadata/klib/src/kotlinx/metadata/klib/klibExtensions.kt @@ -89,10 +89,10 @@ var KmModuleFragment.fqName: String? klibExtensions.fqName = value } -val KmModuleFragment.className: MutableList? +val KmModuleFragment.className: MutableList get() = klibExtensions.className -val KmModuleFragment.moduleFragmentFiles: MutableList? +val KmModuleFragment.moduleFragmentFiles: MutableList get() = klibExtensions.moduleFragmentFiles val KmTypeParameter.annotations: MutableList