From 755958f41ca416825cacd688c0c034ceda9a9d84 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Wed, 18 Jan 2023 13:59:35 +0100 Subject: [PATCH] [Gradle] Share KotlinMetadataLibrariesIndexFile impl for cinterop and regular metadata transformation KT-49933 --- .../mpp/KotlinMetadataLibrariesIndexFile.kt | 22 ++++++++ .../MetadataDependencyTransformationTask.kt | 7 ++- ...ropMetadataDependencyTransformationTask.kt | 17 ++---- .../KotlinMetadataLibrariesIndexFileTest.kt | 54 +++++++++++++++++++ 4 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataLibrariesIndexFile.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataLibrariesIndexFileTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataLibrariesIndexFile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataLibrariesIndexFile.kt new file mode 100644 index 00000000000..a28234c27a1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMetadataLibrariesIndexFile.kt @@ -0,0 +1,22 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropMetadataDependencyTransformationTask +import java.io.File + +/** + * Files used by the [MetadataDependencyTransformationTask] and [CInteropMetadataDependencyTransformationTask] to + * store the resulting 'metadata path' in this index file. + */ +internal class KotlinMetadataLibrariesIndexFile(private val file: File) { + fun read(): List = file.readLines().map { File(it) } + + fun write(files: Iterable) { + val content = files.joinToString(System.lineSeparator()) { it.path } + file.writeText(content) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index fe8906b0117..fa577a59806 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -99,7 +99,7 @@ open class MetadataDependencyTransformationTask @get:OutputFile internal val transformedLibrariesFileIndex: RegularFileProperty = objectFactory .fileProperty() - .apply { set(outputsDir.resolve("${kotlinSourceSet.name}.transformedLibraries")) } + .apply { set(outputsDir.resolve("${kotlinSourceSet.name}.libraries")) } @get:OutputFile internal val visibleSourceSetsFile: RegularFileProperty = objectFactory @@ -154,8 +154,7 @@ open class MetadataDependencyTransformationTask } private fun writeTransformedLibraries(files: List) { - val content = files.joinToString(System.lineSeparator()) - transformedLibrariesFileIndex.get().asFile.writeText(content) + KotlinMetadataLibrariesIndexFile(transformedLibrariesFileIndex.get().asFile).write(files) } private fun writeVisibleSourceSets(visibleSourceSetsByComponentId: Map>) { @@ -175,7 +174,7 @@ open class MetadataDependencyTransformationTask @get:Internal // Warning! ownTransformedLibraries is available only after Task Execution internal val ownTransformedLibraries: FileCollection = project.filesProvider { transformedLibrariesFileIndex.map { regularFile -> - regularFile.asFile.readLines().map { File(it) } + KotlinMetadataLibrariesIndexFile(regularFile.asFile).read() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt index 5a73f9391fa..b1cedef724f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt @@ -12,7 +12,6 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet @@ -197,12 +196,12 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru @get:OutputFile val outputLibrariesFileIndex: RegularFileProperty = objectFactory .fileProperty() - .apply { set(outputDirectory.resolve("${sourceSet.name}.transformedCinteropLibraries")) } + .apply { set(outputDirectory.resolve("${sourceSet.name}.cinteropLibraries")) } @get:Internal val outputLibraryFiles: FileCollection = project.filesProvider { outputLibrariesFileIndex.map { file -> - TransformedCinteropLibrariesFile(file.asFile).read() + KotlinMetadataLibrariesIndexFile(file.asFile).read() } } @@ -215,7 +214,7 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru outputLibraryFilesDiscovery.resolveOutputLibraryFiles(outputDirectory, chooseVisibleSourceSets) chooseVisibleSourceSets.forEach(::materializeMetadata) val transformedLibraries = outputLibraryFilesDiscovery.resolveOutputLibraryFiles(outputDirectory, chooseVisibleSourceSets) - TransformedCinteropLibrariesFile(outputLibrariesFileIndex.get().asFile).write(transformedLibraries) + KotlinMetadataLibrariesIndexFile(outputLibrariesFileIndex.get().asFile).write(transformedLibraries) } private fun materializeMetadata( @@ -242,13 +241,3 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru } } -private class TransformedCinteropLibrariesFile( - private val indexFile: File -) { - fun read(): Set = indexFile.readLines().mapTo(mutableSetOf()) { File(it) } - - fun write(files: Iterable) { - val content = files.joinToString(System.lineSeparator()) - indexFile.writeText(content) - } -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataLibrariesIndexFileTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataLibrariesIndexFileTest.kt new file mode 100644 index 00000000000..9fea15aeb97 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMetadataLibrariesIndexFileTest.kt @@ -0,0 +1,54 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.unitTests + +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataLibrariesIndexFile +import org.junit.Rule +import org.junit.rules.TemporaryFolder +import java.io.File +import java.io.FileNotFoundException +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith + +class KotlinMetadataLibrariesIndexFileTest { + + @get:Rule + val temporaryFolder = TemporaryFolder() + + @Test + fun `test - empty list`() { + testWriteRead(emptyList()) + } + + @Test + fun `test - absolute and relative files`() { + testWriteRead(listOf(File("relative"), File("absolute").absoluteFile)) + } + + @Test + fun `test - file does not exist - read`() { + assertFailsWith { + KotlinMetadataLibrariesIndexFile(temporaryFolder.newFolder().resolve("does-not-exist")).read() + } + } + + @Test + fun `test - file and parent file does not exist - write`() { + KotlinMetadataLibrariesIndexFile(temporaryFolder.newFolder().resolve("does-not-exist")).apply { + write(emptyList()) + assertEquals(emptyList(), read()) + } + } + + private fun testWriteRead(files: Iterable) { + val index = KotlinMetadataLibrariesIndexFile(temporaryFolder.newFile()) + index.write(files) + assertEquals(files.toList(), index.read()) + } +} \ No newline at end of file