From da4b56e9d188dfd2283e6a5937c65736ec85a0ac Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Mon, 27 Jan 2020 16:51:30 +0700 Subject: [PATCH] [Metadata] Emit ModuleFragment for each part of package name Some libraries (e.g. `klib contents`) expects this kind of behaviour. --- .../native/interop/gen/StubIrMetadataEmitter.kt | 16 +++++++++++++++- .../interop/gen/jvm/InteropLibraryCreation.kt | 10 +++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt index b75fb5a727e..6ae65fbe4ef 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrMetadataEmitter.kt @@ -21,7 +21,21 @@ class StubIrMetadataEmitter( } private fun emitModuleFragments(): List = - ModuleMetadataEmitter(context.configuration.pkgName, builderResult.stubs).emit().let(::listOf) + ModuleMetadataEmitter( + context.configuration.pkgName, + builderResult.stubs + ).emit().let { kmModuleFragment -> + // We need to create module fragment for each part of package name. + val pkgName = context.configuration.pkgName + val fakePackages = pkgName.mapIndexedNotNull { idx, char -> + if (char == '.') idx else null + }.map { dotPosition -> + KmModuleFragment().also { + it.fqName = pkgName.substring(0, dotPosition) + } + } + fakePackages + kmModuleFragment + } } /** diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt index 2c5af15c2a8..b5f0a5fb9df 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt @@ -88,6 +88,14 @@ class ChunkingWriteStrategy( } } } - return classFragments + packageFragments + val result = classFragments + packageFragments + return if (result.isEmpty()) { + // We still need to emit empty packages because they may + // represent parts of package declaration (e.g. platform.[]). + // Tooling (e.g. `klib contents`) expects this kind of behavior. + parts + } else { + result + } } } \ No newline at end of file