diff --git a/buildSrc/src/main/kotlin/GradleCommon.kt b/buildSrc/src/main/kotlin/GradleCommon.kt index 1197f63854d..de9e8d6e76b 100644 --- a/buildSrc/src/main/kotlin/GradleCommon.kt +++ b/buildSrc/src/main/kotlin/GradleCommon.kt @@ -114,7 +114,7 @@ fun Project.createGradleCommonSourceSet(): SourceSet { dependencies { compileOnlyConfigurationName(kotlinStdlib()) - "commonGradleApiCompileOnly"("dev.gradleplugins:gradle-api:7.2") + "commonGradleApiCompileOnly"("dev.gradleplugins:gradle-api:7.5") if (this@createGradleCommonSourceSet.name != "kotlin-gradle-plugin-api" && this@createGradleCommonSourceSet.name != "android-test-fixes" ) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt index 3765d77bb5d..92bbeeeabc9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GenerateProjectStructureMetadata.kt @@ -11,7 +11,6 @@ import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction -import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCache import java.io.File import javax.inject.Inject diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/HierarchyAttributeContainer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/HierarchyAttributeContainer.kt index 80d503b27d5..c563e0a01d4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/HierarchyAttributeContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/HierarchyAttributeContainer.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.AttributeContainer +import org.gradle.api.provider.Provider import java.util.* // TODO better implementation: attribute invariants (no attrs with same name and different types allowed), thread safety? @@ -32,26 +33,44 @@ class HierarchyAttributeContainer( val filterParentAttributes: (Attribute<*>) -> Boolean = { true } ) : AttributeContainer { private val attributesMap = Collections.synchronizedMap(mutableMapOf, Any>()) + private val lazyAttributesMap = Collections.synchronizedMap(mutableMapOf, Provider>()) private fun getFilteredParentAttribute(key: Attribute<*>) = if (parent != null && filterParentAttributes(key)) parent.getAttribute(key) else null override fun contains(key: Attribute<*>): Boolean = - attributesMap.contains(key) || getFilteredParentAttribute(key) != null + lazyAttributesMap.contains(key) || + attributesMap.contains(key) || + getFilteredParentAttribute(key) != null @Suppress("UNCHECKED_CAST") - override fun getAttribute(key: Attribute): T? = - attributesMap.get(key as Attribute<*>) as T? ?: getFilteredParentAttribute(key) as T? + override fun getAttribute(key: Attribute): T? = lazyAttributesMap[key]?.get() as T? + ?: attributesMap[key] as T? + ?: getFilteredParentAttribute(key) as T? - override fun isEmpty(): Boolean = attributesMap.isEmpty() && (parent?.keySet().orEmpty().filter(filterParentAttributes).isEmpty()) + override fun isEmpty(): Boolean = lazyAttributesMap.isEmpty() && + attributesMap.isEmpty() && + (parent?.keySet().orEmpty().filter(filterParentAttributes).isEmpty()) - override fun keySet(): Set> = attributesMap.keys + parent?.keySet().orEmpty().filter(filterParentAttributes) + override fun keySet(): Set> = lazyAttributesMap.keys + + attributesMap.keys + + parent?.keySet().orEmpty().filter(filterParentAttributes) override fun attribute(key: Attribute, value: T): AttributeContainer { val checkedValue = requireNotNull(value as Any?) { "null values for attributes are not supported" } attributesMap[key] = checkedValue + lazyAttributesMap.remove(key) return this } override fun getAttributes(): AttributeContainer = this + + override fun attributeProvider( + key: Attribute, + provider: Provider + ): AttributeContainer { + lazyAttributesMap[key] = provider + attributesMap.remove(key) + return this + } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt index 2a6986b12e9..953973cb28b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTask.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigur import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvider import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies import org.jetbrains.kotlin.gradle.utils.getValue -import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCache +import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat import java.io.File import javax.inject.Inject @@ -36,7 +36,9 @@ open class MetadataDependencyTransformationTask ) : DefaultTask() { init { - notCompatibleWithConfigurationCache("Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info") + notCompatibleWithConfigurationCacheCompat( + "Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info" + ) } @get:OutputDirectory diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt index 3f8770c8df1..e167b768ad3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/internal/CInteropMetadataDependencyTransformationTask.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCache +import org.jetbrains.kotlin.gradle.utils.notCompatibleWithConfigurationCacheCompat import org.jetbrains.kotlin.gradle.utils.outputFilesProvider import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION import org.jetbrains.kotlin.project.model.KpmModuleIdentifier @@ -112,7 +112,9 @@ internal open class CInteropMetadataDependencyTransformationTask @Inject constru ) : DefaultTask() { init { - notCompatibleWithConfigurationCache("Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info") + notCompatibleWithConfigurationCacheCompat( + "Task $name does not support Gradle Configuration Cache. Check KT-49933 for more info" + ) } sealed class OutputLibraryFilesDiscovery : Serializable { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt index 11748a14e6a..c35d48fb8cc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/configurationCache.kt @@ -28,7 +28,7 @@ internal fun Project.readSystemPropertyAtConfigurationTime(key: String): Provide internal fun unavailableValueError(propertyName: String): Nothing = error("'$propertyName' should be available at configuration time but unavailable on configuration cache reuse") -fun Task.notCompatibleWithConfigurationCache(reason: String) { +fun Task.notCompatibleWithConfigurationCacheCompat(reason: String) { val reportConfigurationCacheWarnings = try { val startParameters = project.gradle.startParameter as? StartParameterInternal startParameters?.run { isConfigurationCache && !isConfigurationCacheQuiet } ?: false @@ -43,14 +43,5 @@ fun Task.notCompatibleWithConfigurationCache(reason: String) { return } - try { - val taskClass = Task::class.java - val method = taskClass.getMethod("notCompatibleWithConfigurationCache", String::class.java) - - method.invoke(this, reason) - } catch (e: ReflectiveOperationException) { - if (reportConfigurationCacheWarnings) { - logger.warn("Reflection issue - task $name is not compatible with configuration cache: $reason", e) - } - } + notCompatibleWithConfigurationCache(reason) } \ No newline at end of file