From 9d8df8eb5e9363f997edfff314e7bad7fffcbb14 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Wed, 14 Sep 2022 02:21:18 +0200 Subject: [PATCH] [Gradle] Introduce ConfigurationTimePropertiesAccessor #KT-53823 In Progress --- .../gradle/plugin/KotlinPluginWrapper.kt | 5 +++ .../ConfigurationTimePropertiesAccessor.kt | 45 +++++++++++++++++++ .../kotlin/gradle/plugin/PluginWrappers.kt | 2 + .../ConfigurationTimePropertiesAccessorG70.kt | 20 +++++++++ .../kotlin/gradle/plugin/PluginWrappers.kt | 4 ++ .../ConfigurationTimePropertiesAccessorG71.kt | 20 +++++++++ .../kotlin/gradle/plugin/PluginWrappers.kt | 2 + .../ConfigurationTimePropertiesAccessorG6.kt | 20 +++++++++ 8 files changed, 118 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessor.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG70.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG71.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG6.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 8ae60237d14..77bcb14550a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -208,6 +208,11 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() { IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class, DefaultIdeaSyncDetectorVariantFactory() ) + + factories.putIfAbsent( + ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class, + DefaultConfigurationTimePropertiesAccessorVariantFactory() + ) } internal open fun createTestRegistry(project: Project) = KotlinTestsRegistry(project) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessor.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessor.kt new file mode 100644 index 00000000000..12afd5021e4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessor.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2022 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.internal + +import org.gradle.api.invocation.Gradle +import org.gradle.api.provider.Provider +import org.jetbrains.kotlin.gradle.plugin.VariantImplementationFactories +import org.jetbrains.kotlin.gradle.plugin.variantImplementationFactory + +/** + * Provides unified safe way to read environmental properties via [Provider] at configuration time in terms of Gradle configuration cache feature + * Gradle 6.5 - 7.3 was requiring to explicitly mark such reads to be able to invalidate configuration cache entries on the value change. + * Gradle 7.4+ is able to automatically detect such reads without explicit declaration, thus method to declare a read was deprecated + */ +internal interface ConfigurationTimePropertiesAccessor { + fun Provider.usedAtConfigurationTime(): Provider + + interface ConfigurationTimePropertiesAccessorVariantFactory : VariantImplementationFactories.VariantImplementationFactory { + fun getInstance(): ConfigurationTimePropertiesAccessor + } +} + +internal class DefaultConfigurationTimePropertiesAccessorVariantFactory : + ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory { + override fun getInstance(): ConfigurationTimePropertiesAccessor = DefaultConfigurationTimePropertiesAccessor() +} + +/** + * No-op implementation for fresh Gradle versions since no declaration is required + */ +internal class DefaultConfigurationTimePropertiesAccessor : ConfigurationTimePropertiesAccessor { + override fun Provider.usedAtConfigurationTime(): Provider = this +} + +internal val Gradle.configurationTimePropertiesAccessor + get() = gradle + .variantImplementationFactory() + .getInstance() + +internal fun Provider.usedAtConfigurationTime(accessor: ConfigurationTimePropertiesAccessor) = with(accessor) { + usedAtConfigurationTime() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index e8f66febce2..a0fde6717fc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -143,4 +143,6 @@ private fun Project.registerVariantImplementations() { BasePluginConfigurationG70.BasePluginConfigurationVariantFactoryG70() factories[IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class] = IdeaSyncDetectorG70.IdeaSyncDetectorVariantFactoryG70() + factories[ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class] = + ConfigurationTimePropertiesAccessorG70.ConfigurationTimePropertiesAccessorVariantFactoryG70() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG70.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG70.kt new file mode 100644 index 00000000000..71ac1106262 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle70/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG70.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 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.internal + +import org.gradle.api.provider.Provider + +/** + * Declares environmental property read with [Provider.forUseAtConfigurationTime] + */ +internal class ConfigurationTimePropertiesAccessorG70 : ConfigurationTimePropertiesAccessor { + internal class ConfigurationTimePropertiesAccessorVariantFactoryG70 : + ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory { + override fun getInstance(): ConfigurationTimePropertiesAccessor = ConfigurationTimePropertiesAccessorG70() + } + + override fun Provider.usedAtConfigurationTime(): Provider = forUseAtConfigurationTime() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index a3c4cc4f4bf..9c9a9ad43e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -12,6 +12,8 @@ import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.gradle.api.model.ObjectFactory import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry +import org.jetbrains.kotlin.gradle.plugin.internal.ConfigurationTimePropertiesAccessor +import org.jetbrains.kotlin.gradle.plugin.internal.ConfigurationTimePropertiesAccessorG71 import org.jetbrains.kotlin.gradle.plugin.internal.IdeaSyncDetector import org.jetbrains.kotlin.gradle.plugin.internal.IdeaSyncDetectorG71 import javax.inject.Inject @@ -143,4 +145,6 @@ private fun Project.registerVariantImplementations() { val factories = VariantImplementationFactories.get(gradle) factories[IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class] = IdeaSyncDetectorG71.IdeaSyncDetectorVariantFactoryG71() + factories[ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class] = + ConfigurationTimePropertiesAccessorG71.ConfigurationTimePropertiesAccessorVariantFactoryG71() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG71.kt b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG71.kt new file mode 100644 index 00000000000..6117e752e5e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/gradle71/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG71.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 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.internal + +import org.gradle.api.provider.Provider + +/** + * Declares environmental property read with [Provider.forUseAtConfigurationTime] + */ +internal class ConfigurationTimePropertiesAccessorG71 : ConfigurationTimePropertiesAccessor { + internal class ConfigurationTimePropertiesAccessorVariantFactoryG71 : + ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory { + override fun getInstance(): ConfigurationTimePropertiesAccessor = ConfigurationTimePropertiesAccessorG71() + } + + override fun Provider.usedAtConfigurationTime(): Provider = forUseAtConfigurationTime() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt index 65877f2e316..72bcce16520 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/PluginWrappers.kt @@ -149,4 +149,6 @@ private fun Project.registerVariantImplementations() { BasePluginConfigurationG6.BasePluginConfigurationVariantFactoryG6() factories[IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class] = IdeaSyncDetectorG6.IdeaSyncDetectorVariantFactoryG6() + factories[ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class] = + ConfigurationTimePropertiesAccessorG6.ConfigurationTimePropertiesAccessorVariantFactoryG6() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG6.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG6.kt new file mode 100644 index 00000000000..e47c126778f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/internal/ConfigurationTimePropertiesAccessorG6.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 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.internal + +import org.gradle.api.provider.Provider + +/** + * Declares environmental property read with [Provider.forUseAtConfigurationTime] + */ +internal class ConfigurationTimePropertiesAccessorG6 : ConfigurationTimePropertiesAccessor { + internal class ConfigurationTimePropertiesAccessorVariantFactoryG6 : + ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory { + override fun getInstance(): ConfigurationTimePropertiesAccessor = ConfigurationTimePropertiesAccessorG6() + } + + override fun Provider.usedAtConfigurationTime(): Provider = forUseAtConfigurationTime() +} \ No newline at end of file