From e80988d98cd658ccdb92dbd56e05f4f3c7c0709c Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 22 Aug 2023 11:54:24 +0200 Subject: [PATCH] [Gradle] Don't collect module-info on using new IC/JVM approach Collecting 'moduleInfo' is required for the old history-file-based incremental compilation approach. And the way how it is being collected violates Gradle project-isolation feature as it accesses all Kotlin compile tasks from other Gradle subprojects. When the new IC based on classpath snapshot is enabled, the plugin will not collect 'moduleInfo' making it compatible with project isolation. ^KT-59826 Fixed --- .../kotlin/daemon/CompileServiceImpl.kt | 30 +++++++++++-------- .../gradle/BuildServiceDeclarationIT.kt | 12 ++++++-- .../kotlin/gradle/ProjectIsolationIT.kt | 3 +- .../GradleKotlinCompilerRunner.kt | 2 +- .../GradleKotlinCompilerWork.kt | 2 +- .../AbstractKotlinCompileConfig.kt | 8 ----- .../configuration/Kotlin2JsCompileConfig.kt | 9 ++++++ .../KotlinCompileCommonConfig.kt | 1 + .../configuration/KotlinCompileConfig.kt | 12 ++++++++ 9 files changed, 52 insertions(+), 27 deletions(-) diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index 9e31970eb2c..24f9f924465 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -616,20 +616,24 @@ abstract class CompileServiceImplBase( val rootProjectDir = incrementalCompilationOptions.rootProjectDir val buildDir = incrementalCompilationOptions.buildDir - val modulesApiHistory = incrementalCompilationOptions.multiModuleICSettings?.run { - reporter.info { "Use module detection: $useModuleDetection" } - val modulesInfo = incrementalCompilationOptions.modulesInfo - ?: error("The build is configured to use the history-file based IC approach, but doesn't provide the modulesInfo") - check(rootProjectDir != null) { - "rootProjectDir is expected to be non null when the history-file based IC approach is used" - } + val modulesApiHistory = if (incrementalCompilationOptions.classpathChanges is ClasspathChanges.ClasspathSnapshotEnabled) { + EmptyModulesApiHistory + } else { + incrementalCompilationOptions.multiModuleICSettings?.run { + reporter.info { "Use module detection: $useModuleDetection" } + val modulesInfo = incrementalCompilationOptions.modulesInfo + ?: error("The build is configured to use the history-file based IC approach, but doesn't provide the modulesInfo") + check(rootProjectDir != null) { + "rootProjectDir is expected to be non null when the history-file based IC approach is used" + } - if (!useModuleDetection) { - ModulesApiHistoryJvm(rootProjectDir, modulesInfo) - } else { - ModulesApiHistoryAndroid(rootProjectDir, modulesInfo) - } - } ?: EmptyModulesApiHistory + if (!useModuleDetection) { + ModulesApiHistoryJvm(rootProjectDir, modulesInfo) + } else { + ModulesApiHistoryAndroid(rootProjectDir, modulesInfo) + } + } ?: EmptyModulesApiHistory + } val useK2 = k2jvmArgs.useK2 || LanguageVersion.fromVersionString(k2jvmArgs.languageVersion)?.usesK2 == true // TODO: This should be reverted after implementing of fir-based java tracker (KT-57147). diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildServiceDeclarationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildServiceDeclarationIT.kt index 2d74bf1868c..5b9d1b31890 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildServiceDeclarationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BuildServiceDeclarationIT.kt @@ -24,7 +24,11 @@ class BuildServiceDeclarationIT : KGPBaseTest() { @GradleTest @JvmGradlePluginTests fun testJvmProject(gradleVersion: GradleVersion) { - project("kotlinJavaProject", gradleVersion) { + project( + "kotlinJavaProject", + gradleVersion, + buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Fail) + ) { enableStableConfigurationCachePreview() build("build") { assertOutputDoesNotContainBuildServiceDeclarationWarnings() @@ -72,7 +76,11 @@ class BuildServiceDeclarationIT : KGPBaseTest() { @GradleTest @OtherGradlePluginTests fun testKaptProject(gradleVersion: GradleVersion) { - project("kapt2/simple", gradleVersion) { + project( + "kapt2/simple", + gradleVersion, + buildOptions = defaultBuildOptions.copy(warningMode = WarningMode.Fail) + ) { enableStableConfigurationCachePreview() build("build") { assertOutputDoesNotContainBuildServiceDeclarationWarnings() diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ProjectIsolationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ProjectIsolationIT.kt index 1ec66ba372f..8d06fa2bcf1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ProjectIsolationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/ProjectIsolationIT.kt @@ -14,11 +14,10 @@ class ProjectIsolationIT : KGPBaseTest() { override val defaultBuildOptions: BuildOptions get() = super.defaultBuildOptions.copy(configurationCache = true, projectIsolation = true) - @DisplayName("Should be compatible with project isolation") + @DisplayName("JVM project should be compatible with project isolation") @JvmGradlePluginTests @GradleTestVersions( minVersion = TestVersions.Gradle.G_7_1, - maxVersion = TestVersions.Gradle.G_7_6 ) @GradleTest fun testProjectIsolationInJvmSimple(gradleVersion: GradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 9177a730206..81644d615fc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -209,7 +209,7 @@ internal open class GradleCompilerRunner( } val incrementalCompilationEnvironment = environment.incrementalCompilationEnvironment - val modulesInfo = incrementalCompilationEnvironment?.let { incrementalModuleInfoProvider.get().info } + val modulesInfo = incrementalCompilationEnvironment?.let { incrementalModuleInfoProvider.orNull?.info } val workArgs = GradleKotlinCompilerWorkArguments( projectFiles = ProjectFilesForCompilation( loggerProvider, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt index 941432fd4b3..9299e1b6eac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt @@ -327,7 +327,7 @@ internal class GradleKotlinCompilerWork @Inject constructor( usePreciseJavaTracking = icEnv.usePreciseJavaTracking, outputFiles = outputFiles, multiModuleICSettings = icEnv.multiModuleICSettings, - modulesInfo = incrementalModuleInfo!!, + modulesInfo = incrementalModuleInfo, rootProjectDir = icEnv.rootProjectDir, buildDir = icEnv.buildDir, kotlinScriptExtensions = kotlinScriptExtensions, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt index f8980faba71..20ae1df3074 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/AbstractKotlinCompileConfig.kt @@ -13,11 +13,9 @@ import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderFactory import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.compilerRunner.CompilerSystemPropertiesService -import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension import org.jetbrains.kotlin.gradle.dsl.topLevelExtension -import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider @@ -27,7 +25,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.plugin.mpp.internal import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.KOTLIN_BUILD_DIR_NAME -import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention /** * Configuration for the base compile task, [org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile]. @@ -42,10 +39,6 @@ internal abstract class AbstractKotlinCompileConfig task.kotlinDaemonJvmArguments.set(providers.provider { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt index 724c52ab400..1bbc0bcd746 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/Kotlin2JsCompileConfig.kt @@ -5,6 +5,8 @@ package org.jetbrains.kotlin.gradle.tasks.configuration +import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner +import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType @@ -12,6 +14,7 @@ import org.jetbrains.kotlin.gradle.targets.js.internal.LibraryFilterCachingServi import org.jetbrains.kotlin.gradle.targets.js.ir.* import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.utils.klibModuleName +import org.jetbrains.kotlin.gradle.utils.providerWithLazyConvention import java.io.File internal typealias Kotlin2JsCompileConfig = BaseKotlin2JsCompileConfig @@ -23,6 +26,11 @@ internal open class BaseKotlin2JsCompileConfig( init { val libraryFilterCachingService = LibraryFilterCachingService.registerIfAbsent(project) + val incrementalModuleInfoProvider = IncrementalModuleInfoBuildService.registerIfAbsent( + project, + objectFactory.providerWithLazyConvention { GradleCompilerRunner.buildModulesInfo(project.gradle) }, + ) + configureTask { task -> task.incremental = propertiesProvider.incrementalJs ?: true task.incrementalJsKlib = propertiesProvider.incrementalJsKlib ?: true @@ -65,6 +73,7 @@ internal open class BaseKotlin2JsCompileConfig( ) task.libraryFilterCacheService.value(libraryFilterCachingService).disallowChanges() + task.incrementalModuleInfoProvider.value(incrementalModuleInfoProvider).disallowChanges() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileCommonConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileCommonConfig.kt index 92a95cc66cd..2afab2c20df 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileCommonConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileCommonConfig.kt @@ -23,6 +23,7 @@ internal class KotlinCompileCommonConfig( ).disallowChanges() task.refinesMetadataPaths.from(compilationInfo.refinesPaths).disallowChanges() task.moduleName.set(providers.provider { compilationInfo.moduleName }) + task.incrementalModuleInfoProvider.disallowChanges() } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt index cbdc09ac840..a628b0ca339 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/configuration/KotlinCompileConfig.kt @@ -12,9 +12,11 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.gradle.api.artifacts.transform.TransformSpec import org.gradle.api.attributes.Attribute import org.gradle.api.provider.Provider +import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension import org.jetbrains.kotlin.gradle.dsl.KotlinTopLevelExtension +import org.jetbrains.kotlin.gradle.incremental.IncrementalModuleInfoBuildService import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService import org.jetbrains.kotlin.gradle.internal.KOTLIN_BUILD_TOOLS_API_IMPL import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP @@ -51,6 +53,16 @@ internal open class BaseKotlinCompileConfig : AbstractKotl ).markResolvable() } else null + if (useClasspathSnapshot) { + taskProvider.configure { it.incrementalModuleInfoProvider.disallowChanges() } + } else { + val incrementalModuleInfoProvider = IncrementalModuleInfoBuildService.registerIfAbsent( + project, + objectFactory.providerWithLazyConvention { GradleCompilerRunner.buildModulesInfo(project.gradle) }, + ) + taskProvider.configure { it.incrementalModuleInfoProvider.value(incrementalModuleInfoProvider).disallowChanges() } + } + taskProvider.configure { task -> task.incremental = propertiesProvider.incrementalJvm ?: true task.usePreciseJavaTracking = propertiesProvider.usePreciseJavaTracking ?: true