diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt index d31233a5f1e..e041aea3f0d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt @@ -30,11 +30,26 @@ class KlibBasedMppIT : BaseGradleIT() { """.trimIndent()) } + @Test + fun testPublishingAndConsumptionWithEmptySourceSet() = testBuildWithDependency { + // KT-36674 + projectDir.resolve("$dependencyModuleName/src/$hostSpecificSourceSet").run { + assertTrue { isDirectory } + deleteRecursively() + } + publishProjectDepAndAddDependency(validateHostSpecificPublication = false) + } + @Test fun testBuildWithPublishedDependency() = testBuildWithDependency { + publishProjectDepAndAddDependency(validateHostSpecificPublication = true) + } + + private fun Project.publishProjectDepAndAddDependency(validateHostSpecificPublication: Boolean) { build(":$dependencyModuleName:publish") { assertSuccessful() - checkPublishedHostSpecificMetadata(this@build) + if (validateHostSpecificPublication) + checkPublishedHostSpecificMetadata(this@build) } gradleBuildScript().appendText("\n" + """ diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt index 63d9221bfce..dddbe39e467 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GranularMetadataTransformation.kt @@ -371,30 +371,32 @@ private class JarArtifactMppDependencyMetadataExtractor( artifactBySourceSet.forEach { (sourceSetName, artifact) -> ZipFile(artifact).use { zip -> - val entries = zip.entries().asSequence().filter { it.name.startsWith("$sourceSetName/") } + val entries = zip.entries().asSequence().filter { it.name.startsWith("$sourceSetName/") }.toList() // TODO: once IJ supports non-JAR metadata dependencies, extract to a directory, not a JAR // Also, if both IJ and the CLI compiler can read metadata from a path inside a JAR, then no operations will be needed - val extension = - projectStructureMetadata.sourceSetBinaryLayout[sourceSetName]?.archiveExtension + + if (entries.any()) { + val extension = projectStructureMetadata.sourceSetBinaryLayout[sourceSetName]?.archiveExtension ?: SourceSetMetadataLayout.METADATA.archiveExtension - val extractToJarFile = transformedModuleRoot.resolve("$moduleString-$sourceSetName.$extension") - resultFiles[sourceSetName] = project.files(extractToJarFile) + val extractToJarFile = transformedModuleRoot.resolve("$moduleString-$sourceSetName.$extension") + resultFiles[sourceSetName] = project.files(extractToJarFile) - if (doProcessFiles) { - ZipOutputStream(extractToJarFile.outputStream()).use { resultZipOutput -> - for (entry in entries) { - if (entry.isDirectory) - continue + if (doProcessFiles) { + ZipOutputStream(extractToJarFile.outputStream()).use { resultZipOutput -> + for (entry in entries) { + if (entry.isDirectory) + continue - // Drop the source set name from the entry path - val resultEntry = ZipEntry(entry.name.substringAfter("/")) + // Drop the source set name from the entry path + val resultEntry = ZipEntry(entry.name.substringAfter("/")) - zip.getInputStream(entry).use { inputStream -> - resultZipOutput.putNextEntry(resultEntry) - inputStream.copyTo(resultZipOutput) - resultZipOutput.closeEntry() + zip.getInputStream(entry).use { inputStream -> + resultZipOutput.putNextEntry(resultEntry) + inputStream.copyTo(resultZipOutput) + resultZipOutput.closeEntry() + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt index b8d21acc6d8..5b43a10eb45 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/metadata/KotlinMetadataTargetConfigurator.kt @@ -532,9 +532,9 @@ internal fun getPublishedPlatformCompilations(project: Project): Map): FileCollection = project.files(project.provider { - from.map { - if (it.extension in extensions) - project.zipTree(it) - else it + from.mapNotNull { + if (it.extension in extensions) { + if (it.exists()) project.zipTree(it) else null + } else it } }).builtBy(from) \ No newline at end of file