[Gradle] Introduce ConfigurationTimePropertiesAccessor

#KT-53823 In Progress
This commit is contained in:
Alexander Likhachev
2022-09-14 02:21:18 +02:00
committed by Space
parent ad44ee8904
commit 9d8df8eb5e
8 changed files with 118 additions and 0 deletions
@@ -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)
@@ -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 <T> Provider<T>.usedAtConfigurationTime(): Provider<T>
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 <T> Provider<T>.usedAtConfigurationTime(): Provider<T> = this
}
internal val Gradle.configurationTimePropertiesAccessor
get() = gradle
.variantImplementationFactory<ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory>()
.getInstance()
internal fun <T> Provider<T>.usedAtConfigurationTime(accessor: ConfigurationTimePropertiesAccessor) = with(accessor) {
usedAtConfigurationTime()
}
@@ -143,4 +143,6 @@ private fun Project.registerVariantImplementations() {
BasePluginConfigurationG70.BasePluginConfigurationVariantFactoryG70()
factories[IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class] =
IdeaSyncDetectorG70.IdeaSyncDetectorVariantFactoryG70()
factories[ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class] =
ConfigurationTimePropertiesAccessorG70.ConfigurationTimePropertiesAccessorVariantFactoryG70()
}
@@ -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 <T> Provider<T>.usedAtConfigurationTime(): Provider<T> = forUseAtConfigurationTime()
}
@@ -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()
}
@@ -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 <T> Provider<T>.usedAtConfigurationTime(): Provider<T> = forUseAtConfigurationTime()
}
@@ -149,4 +149,6 @@ private fun Project.registerVariantImplementations() {
BasePluginConfigurationG6.BasePluginConfigurationVariantFactoryG6()
factories[IdeaSyncDetector.IdeaSyncDetectorVariantFactory::class] =
IdeaSyncDetectorG6.IdeaSyncDetectorVariantFactoryG6()
factories[ConfigurationTimePropertiesAccessor.ConfigurationTimePropertiesAccessorVariantFactory::class] =
ConfigurationTimePropertiesAccessorG6.ConfigurationTimePropertiesAccessorVariantFactoryG6()
}
@@ -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 <T> Provider<T>.usedAtConfigurationTime(): Provider<T> = forUseAtConfigurationTime()
}