From 52abecab4353982359840d872ff369be641ba355 Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Sat, 5 Jun 2021 12:30:55 +0200 Subject: [PATCH] Rename sensitive flag to isTransient and inverse logic, add file outputs isTransient with default value as false makes it a bit more readable Some Compiler Plugins can use file outputs properties to dump some data there and gradle can support incremental build with file outputs. --- .../kotlin/gradle/KpmCompilerPluginIT.kt | 30 +++++++++---------- .../gradle.properties | 2 -- .../settings.gradle.kts | 12 -------- .../src/jvmMain/kotlin/Foo.kt | 4 --- .../build.gradle.kts | 21 +++++++------ .../gradle.properties | 2 ++ .../settings.gradle.kts | 13 ++++++++ .../src/jvmMain/kotlin/Foo.kt | 4 +++ .../mpp/pm20/GradleKpmCompilerPlugin.kt | 27 +++++++++++------ .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 23 ++++++++------ .../src/main/kotlin/KpmCompilerPlugin.kt | 16 ++++++---- 11 files changed, 87 insertions(+), 67 deletions(-) delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/gradle.properties delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/settings.gradle.kts delete mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/src/jvmMain/kotlin/Foo.kt rename libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/{kpmSensitivePluginOptions => kpmTransientPluginOptions}/build.gradle.kts (61%) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/src/jvmMain/kotlin/Foo.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KpmCompilerPluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KpmCompilerPluginIT.kt index df2768d0d07..c93d90cbab7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KpmCompilerPluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KpmCompilerPluginIT.kt @@ -11,13 +11,13 @@ import kotlin.test.assertTrue class KpmCompilerPluginIT : BaseGradleIT() { @Test - fun testSensitivePluginOptions() { - val project = transformProjectWithPluginsDsl("kpmSensitivePluginOptions") - fun updatePluginOptions(sensitiveValue: String, insensitiveValue: String) { + fun testTransientPluginOptions() { + val project = transformProjectWithPluginsDsl("kpmTransientPluginOptions") + fun updatePluginOptions(regularOptionValue: String, transientOptionValue: String) { project.gradleProperties().writeText( """ - test-plugin.sensitive=$sensitiveValue - test-plugin.insensitive=$insensitiveValue + test-plugin.regular=$regularOptionValue + test-plugin.transient=$transientOptionValue """.trimIndent() ) } @@ -28,36 +28,36 @@ class KpmCompilerPluginIT : BaseGradleIT() { assertTasksExecuted(":compileKotlinJvm") compilerArgs(":compileKotlinJvm").also { args -> assertTrue( - args.contains("plugin:test-plugin:sensitive=XXX"), - "Expected sensitive plugin option in compilation args" + args.contains("plugin:test-plugin:regular=XXX"), + "Expected regular plugin option in compilation args" ) assertTrue( - args.contains("plugin:test-plugin:insensitive=YYY"), - "Expected insensitive plugin option in compilation args" + args.contains("plugin:test-plugin:transient=YYY"), + "Expected transient plugin option in compilation args" ) } } - // When insensitive plugin option change + // When transient plugin option change updatePluginOptions("XXX", "ZZZ") project.build("compileKotlin") { assertSuccessful() assertTasksUpToDate(":compileKotlinJvm") } - // When sensitive plugin option change + // When regular plugin option change updatePluginOptions("ZZZ", "ZZZ") project.build("compileKotlin") { assertSuccessful() assertTasksExecuted(":compileKotlinJvm") compilerArgs(":compileKotlinJvm").also { args -> assertTrue( - args.contains("plugin:test-plugin:sensitive=ZZZ"), - "Expected sensitive plugin option in compilation args" + args.contains("plugin:test-plugin:regular=ZZZ"), + "Expected regular plugin option in compilation args" ) assertTrue( - args.contains("plugin:test-plugin:insensitive=ZZZ"), - "Expected insensitive plugin option in compilation args" + args.contains("plugin:test-plugin:transient=ZZZ"), + "Expected transient plugin option in compilation args" ) } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/gradle.properties deleted file mode 100644 index e58db95cd08..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -test-plugin.sensitive=SENSITIVE_VALUE -test-plugin.insensitive=INSENSITIVE_VALUE \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/settings.gradle.kts deleted file mode 100644 index d560b7f93ac..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/settings.gradle.kts +++ /dev/null @@ -1,12 +0,0 @@ -pluginManagement { - repositories { - mavenLocal() - mavenCentral() - } - - plugins { - kotlin("multiplatform.pm20").version("1.5.255-SNAPSHOT") - } -} - -rootProject.name = "kpmSensitivePluginOptions" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/src/jvmMain/kotlin/Foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/src/jvmMain/kotlin/Foo.kt deleted file mode 100644 index 093a55c5c30..00000000000 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/src/jvmMain/kotlin/Foo.kt +++ /dev/null @@ -1,4 +0,0 @@ -package testProject.kpmSensitivePluginOptions - -class Foo { -} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts similarity index 61% rename from libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/build.gradle.kts rename to libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts index 9cc675e2825..1676423befe 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmSensitivePluginOptions/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/build.gradle.kts @@ -1,5 +1,4 @@ import org.gradle.api.Project -import org.gradle.api.plugins.ExtraPropertiesExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.project.model.* @@ -12,7 +11,7 @@ repositories { mavenLocal() } -plugins.apply(GradleKpmPluginWithSensitivePluginOptions::class.java) +plugins.apply(GradleKpmPluginWithTransientPluginOptions::class.java) configure { main { @@ -20,17 +19,17 @@ configure { } } -class KpmPluginWithSensitivePluginOptions( - private val sensitiveOptionValue: String, - private val insensitiveOptionValue: String +class KpmPluginWithTransientPluginOptions( + private val regularOptionValue: String, + private val transientOptionValue: String ) : KpmCompilerPlugin { private fun pluginData() = PluginData( pluginId = "test-plugin", // allopen artifact is used to avoid boilerplate with cooking custom compiler plugin artifact = PluginData.ArtifactCoordinates("org.jetbrains.kotlin", "kotlin-allopen"), options = listOf( - StringOption("sensitive", sensitiveOptionValue, true), - StringOption("insensitive", insensitiveOptionValue, false) + StringOption("regular", regularOptionValue, isTransient = false), + StringOption("transient", transientOptionValue, isTransient = true) ) ) @@ -39,7 +38,7 @@ class KpmPluginWithSensitivePluginOptions( override fun forPlatformCompilation(variant: KotlinModuleVariant) = pluginData() } -class GradleKpmPluginWithSensitivePluginOptions : GradleKpmCompilerPlugin { +class GradleKpmPluginWithTransientPluginOptions : GradleKpmCompilerPlugin { private lateinit var project: Project override fun apply(target: Project) { @@ -47,9 +46,9 @@ class GradleKpmPluginWithSensitivePluginOptions : GradleKpmCompilerPlugin { } override val kpmCompilerPlugin by lazy { - KpmPluginWithSensitivePluginOptions( - sensitiveOptionValue = project.property("test-plugin.sensitive") as String, - insensitiveOptionValue = project.property("test-plugin.insensitive") as String + KpmPluginWithTransientPluginOptions( + regularOptionValue = project.property("test-plugin.regular") as String, + transientOptionValue = project.property("test-plugin.transient") as String ) } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/gradle.properties new file mode 100644 index 00000000000..ff37b84ba98 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/gradle.properties @@ -0,0 +1,2 @@ +test-plugin.regular=REGULAR_VALUE +test-plugin.transient=TRANSIENT_VALUE \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/settings.gradle.kts new file mode 100644 index 00000000000..f57c1dd5472 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/settings.gradle.kts @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + } + + plugins { + val kotlin_version: String by settings + kotlin("multiplatform.pm20").version(kotlin_version) + } +} + +rootProject.name = "kpmTransientPluginOptions" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/src/jvmMain/kotlin/Foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/src/jvmMain/kotlin/Foo.kt new file mode 100644 index 00000000000..e539aaf0fad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kpmTransientPluginOptions/src/jvmMain/kotlin/Foo.kt @@ -0,0 +1,4 @@ +package testProject.kpmTransientPluginOptions + +class Foo { +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt index 98597e9da7e..ba24bb92c41 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/GradleKpmCompilerPlugin.kt @@ -53,6 +53,7 @@ internal class CompilerPluginOptionsBuilder( private val artifacts = mutableListOf() private val gradleInputs = mutableMapOf>() private val gradleInputFiles = mutableSetOf() + private val gradleOutputFiles = mutableSetOf() operator fun plusAssign(pluginData: PluginData) { artifacts += pluginData.artifact.toGradleCoordinates() @@ -60,8 +61,8 @@ internal class CompilerPluginOptionsBuilder( for (option in pluginData.options) { pluginOptions.addPluginArgument(pluginData.pluginId, option.toSubpluginOption()) - if (option.sensitive) { - addToInputs(pluginData.pluginId, option) + if (!option.isTransient) { + addToInputsOutputs(pluginData.pluginId, option) } } } @@ -72,9 +73,14 @@ internal class CompilerPluginOptionsBuilder( } } - private fun addToInputs(pluginId: String, option: PluginOption) { - when(option) { - is FilesOption -> gradleInputFiles += option.files + private fun addToInputsOutputs(pluginId: String, option: PluginOption) { + when (option) { + is FilesOption -> + if (option.isOutput) { + gradleOutputFiles += option.files + } else { + gradleInputFiles += option.files + } is StringOption -> gradleInputs .getOrPut("${pluginId}.${option.key}") { mutableListOf() } .add(option.value) @@ -93,12 +99,15 @@ internal class CompilerPluginOptionsBuilder( return KotlinCompilerPluginData( classpath = pluginClasspathConfiguration, options = pluginOptions, - inputs = gradleInputs.flattenWithIndex(), - inputFiles = gradleInputFiles + inputsOutputsState = KotlinCompilerPluginData.InputsOutputsState( + inputs = gradleInputs.flattenWithIndex(), + inputFiles = gradleInputFiles, + outputFiles = gradleOutputFiles + ) ) } - private fun Map>.flattenWithIndex(): Map { + private fun Map>.flattenWithIndex(): Map { val result = mutableMapOf() for ((key, values) in this) { @@ -116,5 +125,5 @@ internal class CompilerPluginOptionsBuilder( } private fun PluginData.ArtifactCoordinates.toGradleCoordinates(): String = - "$group:$artifact:${version ?: project.getKotlinPluginVersion()}" + listOfNotNull(group, artifact, version).joinToString(":") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 23571c300f3..d46ec991bce 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -788,14 +788,19 @@ data class KotlinCompilerPluginData( /** * Used only for Up-to-date checks */ - @get:Input - val inputs: Map, + @get:Nested + val inputsOutputsState: InputsOutputsState +) { + data class InputsOutputsState( + @get:Input + val inputs: Map, - /** - * Used only for Up-to-date checks - */ - @get:InputFiles - @get:PathSensitive(PathSensitivity.RELATIVE) - val inputFiles: Set -) + @get:InputFiles + @get:PathSensitive(PathSensitivity.RELATIVE) + val inputFiles: Set, + + @get:OutputFiles + val outputFiles: Set + ) +} diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/KpmCompilerPlugin.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/KpmCompilerPlugin.kt index 0b913a83170..6614d505e1d 100644 --- a/libraries/tools/kotlin-project-model/src/main/kotlin/KpmCompilerPlugin.kt +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/KpmCompilerPlugin.kt @@ -53,22 +53,28 @@ 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 + * Indicates whether value of [PluginOption] should be stored for incremental build checks. + * Value changes of non-transient [PluginOption] will invalidate incremental caches. */ - abstract val sensitive: Boolean + abstract val isTransient: Boolean } data class StringOption( override val key: String, val value: String, - override val sensitive: Boolean = true + override val isTransient: Boolean = false ) : PluginOption() data class FilesOption( override val key: String, val files: List, - override val sensitive: Boolean = true + /** + * Indicates whether FilesOption is used as input or output during compilation + * false means input + * true means output + */ + val isOutput: Boolean = false, + override val isTransient: Boolean = false ) : PluginOption() // TODO: It should be part of "Compilation Process": KotlinModule.compilationRequestFor(METADATA | PLATFORM) -> CompilationRequest