Store sensitive plugin options in Task inputs
This commit is contained in:
+1
-1
@@ -118,7 +118,7 @@ class KpmCompilerPluginTest {
|
|||||||
group = "test",
|
group = "test",
|
||||||
artifact = artifact
|
artifact = artifact
|
||||||
),
|
),
|
||||||
options = options.map { PluginData.PluginOption(it.key, it.value) }
|
options = options.map { StringOption(it.key, it.value) }
|
||||||
)
|
)
|
||||||
|
|
||||||
override fun forMetadataCompilation(fragment: KotlinModuleFragment) = metadataArtifact?.let(::pluginData)
|
override fun forMetadataCompilation(fragment: KotlinModuleFragment) = metadataArtifact?.let(::pluginData)
|
||||||
|
|||||||
+64
-22
@@ -7,12 +7,14 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.provider.Provider
|
import org.gradle.api.provider.Provider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.FilesSubpluginOption
|
||||||
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
|
import org.jetbrains.kotlin.gradle.plugin.SubpluginOption
|
||||||
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
||||||
import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions
|
import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerPluginData
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerPluginData
|
||||||
import org.jetbrains.kotlin.gradle.utils.newProperty
|
import org.jetbrains.kotlin.gradle.utils.newProperty
|
||||||
import org.jetbrains.kotlin.project.model.*
|
import org.jetbrains.kotlin.project.model.*
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
internal fun Project.compilerPluginProviderForMetadata(
|
internal fun Project.compilerPluginProviderForMetadata(
|
||||||
fragment: KotlinGradleFragment,
|
fragment: KotlinGradleFragment,
|
||||||
@@ -35,29 +37,69 @@ private fun Project.compilerPluginDataProvider(
|
|||||||
compilationData: KotlinCompilationData<*>,
|
compilationData: KotlinCompilationData<*>,
|
||||||
pluginDataList: () -> List<PluginData>
|
pluginDataList: () -> List<PluginData>
|
||||||
): Provider<KotlinCompilerPluginData> {
|
): Provider<KotlinCompilerPluginData> {
|
||||||
val configurationName = compilationData.pluginClasspathConfigurationName()
|
|
||||||
val pluginClasspathConfiguration =
|
|
||||||
configurations.maybeCreate(configurationName).apply {
|
|
||||||
isCanBeConsumed = false
|
|
||||||
isCanBeResolved = true
|
|
||||||
isVisible = false
|
|
||||||
}
|
|
||||||
|
|
||||||
val pluginOptions = CompilerPluginOptions()
|
|
||||||
return newProperty {
|
return newProperty {
|
||||||
for (pluginData in pluginDataList()) {
|
val configurationName = compilationData.pluginClasspathConfigurationName()
|
||||||
dependencies.add(pluginClasspathConfiguration.name, pluginData.artifact.toGradleCoordinates(project))
|
val builder = CompilerPluginOptionsBuilder(project, configurationName)
|
||||||
pluginData.options.forEach { (key, value) ->
|
builder += pluginDataList()
|
||||||
pluginOptions.addPluginArgument(pluginData.pluginId, SubpluginOption(key, value))
|
builder.build()
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
KotlinCompilerPluginData(
|
|
||||||
classpath = pluginClasspathConfiguration,
|
|
||||||
options = pluginOptions
|
|
||||||
)
|
|
||||||
}.apply { finalizeValueOnRead() }
|
}.apply { finalizeValueOnRead() }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PluginData.ArtifactCoordinates.toGradleCoordinates(project: Project): String =
|
internal class CompilerPluginOptionsBuilder(
|
||||||
"$group:$artifact:${version ?: project.getKotlinPluginVersion()}"
|
private val project: Project,
|
||||||
|
private val configurationName: String
|
||||||
|
) {
|
||||||
|
private val pluginOptions = CompilerPluginOptions()
|
||||||
|
private val artifacts = mutableListOf<String>()
|
||||||
|
private val gradleInputs = mutableMapOf<String, String>()
|
||||||
|
private val gradleInputFiles = mutableSetOf<File>()
|
||||||
|
|
||||||
|
operator fun plusAssign(pluginData: PluginData) {
|
||||||
|
artifacts += pluginData.artifact.toGradleCoordinates()
|
||||||
|
|
||||||
|
for (option in pluginData.options) {
|
||||||
|
pluginOptions.addPluginArgument(pluginData.pluginId, option.toSubpluginOption())
|
||||||
|
|
||||||
|
if (option.sensitive) {
|
||||||
|
addToInputs(pluginData.pluginId, option)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
operator fun plusAssign(pluginDataCollection: Collection<PluginData>) {
|
||||||
|
for (pluginData in pluginDataCollection) {
|
||||||
|
this += pluginData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addToInputs(pluginId: String, option: PluginOption) = when(option) {
|
||||||
|
is FilesOption -> gradleInputFiles += option.files
|
||||||
|
is StringOption -> gradleInputs["${pluginId}.${option.key}"] = option.value
|
||||||
|
}
|
||||||
|
|
||||||
|
fun build(): KotlinCompilerPluginData {
|
||||||
|
val pluginClasspathConfiguration =
|
||||||
|
project.configurations.maybeCreate(configurationName).apply {
|
||||||
|
isCanBeConsumed = false
|
||||||
|
isCanBeResolved = true
|
||||||
|
isVisible = false
|
||||||
|
}
|
||||||
|
artifacts.forEach { project.dependencies.add(configurationName, it) }
|
||||||
|
|
||||||
|
return KotlinCompilerPluginData(
|
||||||
|
classpath = pluginClasspathConfiguration,
|
||||||
|
options = pluginOptions,
|
||||||
|
inputs = gradleInputs,
|
||||||
|
inputFiles = gradleInputFiles
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun PluginOption.toSubpluginOption() = when (this) {
|
||||||
|
is FilesOption -> FilesSubpluginOption(key, files)
|
||||||
|
is StringOption -> SubpluginOption(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun PluginData.ArtifactCoordinates.toGradleCoordinates(): String =
|
||||||
|
"$group:$artifact:${version ?: project.getKotlinPluginVersion()}"
|
||||||
|
}
|
||||||
|
|||||||
+15
-1
@@ -783,5 +783,19 @@ data class KotlinCompilerPluginData(
|
|||||||
val classpath: FileCollection,
|
val classpath: FileCollection,
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
val options: CompilerPluginOptions
|
val options: CompilerPluginOptions,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used only for Up-to-date checks
|
||||||
|
*/
|
||||||
|
@get:Input
|
||||||
|
val inputs: Map<String, String>,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used only for Up-to-date checks
|
||||||
|
*/
|
||||||
|
@get:InputFiles
|
||||||
|
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||||
|
val inputFiles: Set<File>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.project.model
|
package org.jetbrains.kotlin.project.model
|
||||||
|
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adapts Kotlin Compiler Plugin for Multiplatform Kotlin Project Model
|
* Adapts Kotlin Compiler Plugin for Multiplatform Kotlin Project Model
|
||||||
* Build System uses this interface to identify applicable plugin artifacts and its options
|
* Build System uses this interface to identify applicable plugin artifacts and its options
|
||||||
@@ -45,13 +47,30 @@ data class PluginData(
|
|||||||
val artifact: String,
|
val artifact: String,
|
||||||
val version: String? = null
|
val version: String? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
data class PluginOption(
|
|
||||||
val key: String,
|
|
||||||
val value: String
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class PluginOption {
|
||||||
|
abstract val key: String
|
||||||
|
|
||||||
|
/**
|
||||||
|
* when true a value of given plugin option is sensitive for incremental compilation
|
||||||
|
* when false compilation task can be skipped even if value differs from previous one
|
||||||
|
*/
|
||||||
|
abstract val sensitive: Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
data class StringOption(
|
||||||
|
override val key: String,
|
||||||
|
val value: String,
|
||||||
|
override val sensitive: Boolean = true
|
||||||
|
) : PluginOption()
|
||||||
|
|
||||||
|
data class FilesOption(
|
||||||
|
override val key: String,
|
||||||
|
val files: List<File>,
|
||||||
|
override val sensitive: Boolean = true
|
||||||
|
) : PluginOption()
|
||||||
|
|
||||||
// TODO: It should be part of "Compilation Process": KotlinModule.compilationRequestFor(METADATA | PLATFORM) -> CompilationRequest
|
// TODO: It should be part of "Compilation Process": KotlinModule.compilationRequestFor(METADATA | PLATFORM) -> CompilationRequest
|
||||||
// But there is no such thing at the moment :)
|
// But there is no such thing at the moment :)
|
||||||
fun KotlinModuleFragment.metadataCompilationPluginData(): List<PluginData> =
|
fun KotlinModuleFragment.metadataCompilationPluginData(): List<PluginData> =
|
||||||
@@ -81,8 +100,7 @@ abstract class BasicKpmCompilerPlugin : KpmCompilerPlugin {
|
|||||||
|
|
||||||
protected abstract fun nativePluginArtifact(): PluginData.ArtifactCoordinates?
|
protected abstract fun nativePluginArtifact(): PluginData.ArtifactCoordinates?
|
||||||
|
|
||||||
protected abstract val pluginOptions: List<PluginData.PluginOption>
|
protected abstract val pluginOptions: List<PluginOption>
|
||||||
|
|
||||||
|
|
||||||
override fun forMetadataCompilation(fragment: KotlinModuleFragment) = pluginDataOrNull(commonPluginArtifact())
|
override fun forMetadataCompilation(fragment: KotlinModuleFragment) = pluginDataOrNull(commonPluginArtifact())
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user