From c8b9a3a6f0d9daf934875ab9c8b1b87fe2fe141f Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Sat, 5 Jun 2021 12:56:20 +0200 Subject: [PATCH] Disallow unsafe reads of KPM PluginData from Compile Task --- .../kotlin/gradle/KpmCompilerPluginIT.kt | 6 ++++++ .../gradle/mpp/KpmCompilerPluginTest.kt | 20 +++++++++++++++++++ .../mpp/pm20/GradleKpmCompilerPlugin.kt | 2 +- 3 files changed, 27 insertions(+), 1 deletion(-) 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 c93d90cbab7..d3b669edfff 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 @@ -10,6 +10,12 @@ import kotlin.test.assertTrue class KpmCompilerPluginIT : BaseGradleIT() { + /** + * Gradle implementation of KPM uses features of 6.4+ version + */ + override val defaultGradleVersion: GradleVersionRequired + get() = GradleVersionRequired.AtLeast("6.4") + @Test fun testTransientPluginOptions() { val project = transformProjectWithPluginsDsl("kpmTransientPluginOptions") diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt index 51327dce35a..d92ccd1b85f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/mpp/KpmCompilerPluginTest.kt @@ -118,6 +118,26 @@ class KpmCompilerPluginTest { assertEquals(1, pluginDataObtainCount) } + @Test + fun `it should not be possible to read plugin data during configuration phase`() { + val project = buildProjectWithKPM { + plugins.apply(TestPluginWithListeners::class.java) + + projectModel { + main { + jvm + } + } + + // Getting task shouldn't fail due to laziness + val task = tasks.getByName("compileKotlinJvm") as AbstractKotlinCompile<*> + // But trying to get pluginData during "configuration" should fail + assertFailsWith { task.kotlinPluginData!!.get() } + } + + project.evaluate() + } + private fun Project.pluginDataOfTask(taskName: String) = this .tasks .getByName(taskName) 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 ba24bb92c41..9906b7a982f 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 @@ -42,7 +42,7 @@ private fun Project.compilerPluginDataProvider( val builder = CompilerPluginOptionsBuilder(project, configurationName) builder += pluginDataList() builder.build() - }.apply { finalizeValueOnRead() } + }.apply { disallowUnsafeRead() } } internal class CompilerPluginOptionsBuilder(