[Gradle] Share KotlinMetadataLibrariesIndexFile impl for cinterop and regular metadata transformation

KT-49933
This commit is contained in:
Sebastian Sellmair
2023-01-18 13:59:35 +01:00
committed by Space Team
parent 70046ffc20
commit 755958f41c
4 changed files with 82 additions and 18 deletions
@@ -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> = file.readLines().map { File(it) }
fun write(files: Iterable<File>) {
val content = files.joinToString(System.lineSeparator()) { it.path }
file.writeText(content)
}
}
@@ -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<File>) {
val content = files.joinToString(System.lineSeparator())
transformedLibrariesFileIndex.get().asFile.writeText(content)
KotlinMetadataLibrariesIndexFile(transformedLibrariesFileIndex.get().asFile).write(files)
}
private fun writeVisibleSourceSets(visibleSourceSetsByComponentId: Map<String, Set<String>>) {
@@ -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()
}
}
@@ -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<File> = indexFile.readLines().mapTo(mutableSetOf()) { File(it) }
fun write(files: Iterable<File>) {
val content = files.joinToString(System.lineSeparator())
indexFile.writeText(content)
}
}
@@ -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<FileNotFoundException> {
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<File>) {
val index = KotlinMetadataLibrariesIndexFile(temporaryFolder.newFile())
index.write(files)
assertEquals(files.toList(), index.read())
}
}