From 20ed029ba5401dc4c2b73e42d1909ecad4a4af3c Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Fri, 18 Nov 2022 20:07:38 +0100 Subject: [PATCH] [Gradle, IC] Add gradle property to control precise compilation outputs backup #KT-49785 In Progress --- .../daemon/common/CompilationOptions.kt | 9 +++++---- .../kotlin/daemon/CompileServiceImpl.kt | 6 ++++-- .../incremental/IncrementalCompilerRunner.kt | 11 +++++++++-- .../IncrementalJsCompilerRunner.kt | 8 +++++--- .../IncrementalJvmCompilerRunner.kt | 6 ++++-- .../GradleKotlinCompilerWork.kt | 3 ++- .../IncrementalCompilationEnvironment.kt | 5 +++-- .../gradle/plugin/PropertiesProvider.kt | 5 +++++ .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 19 +++++++++++++++---- .../AbstractKotlinCompileConfig.kt | 4 ++++ 10 files changed, 56 insertions(+), 20 deletions(-) diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt index 92707920892..192d1dc8beb 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/CompilationOptions.kt @@ -43,7 +43,7 @@ open class CompilationOptions( "targetPlatform=$targetPlatform, " + "reportCategories=${Arrays.toString(reportCategories)}, " + "reportSeverity=$reportSeverity, " + - "requestedCompilationResults=${Arrays.toString(requestedCompilationResults)}" + + "requestedCompilationResults=${Arrays.toString(requestedCompilationResults)}, " + "kotlinScriptExtensions=${Arrays.toString(kotlinScriptExtensions)}" + ")" } @@ -71,7 +71,8 @@ class IncrementalCompilationOptions( val multiModuleICSettings: MultiModuleICSettings, val modulesInfo: IncrementalModuleInfo, kotlinScriptExtensions: Array? = null, - val withAbiSnapshot: Boolean = false + val withAbiSnapshot: Boolean = false, + val preciseCompilationResultsBackup: Boolean = false, ) : CompilationOptions( compilerMode, targetPlatform, @@ -81,7 +82,7 @@ class IncrementalCompilationOptions( kotlinScriptExtensions ) { companion object { - const val serialVersionUID: Long = 0 + const val serialVersionUID: Long = 1 } override fun toString(): String { @@ -93,7 +94,7 @@ class IncrementalCompilationOptions( "classpathChanges=${classpathChanges::class.simpleName}, " + "workingDir=$workingDir, " + "multiModuleICSettings=$multiModuleICSettings, " + - "usePreciseJavaTracking=$usePreciseJavaTracking" + + "usePreciseJavaTracking=$usePreciseJavaTracking, " + "outputFiles=$outputFiles" + ")" } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt index c9355ea5024..c20e008bcc1 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/CompileServiceImpl.kt @@ -557,7 +557,8 @@ abstract class CompileServiceImplBase( buildHistoryFile = incrementalCompilationOptions.multiModuleICSettings.buildHistoryFile, scopeExpansion = if (args.isIrBackendEnabled()) CompileScopeExpansionMode.ALWAYS else CompileScopeExpansionMode.NEVER, modulesApiHistory = modulesApiHistory, - withAbiSnapshot = incrementalCompilationOptions.withAbiSnapshot + withAbiSnapshot = incrementalCompilationOptions.withAbiSnapshot, + preciseCompilationResultsBackup = incrementalCompilationOptions.preciseCompilationResultsBackup, ) return try { compiler.compile(allKotlinFiles, args, compilerMessageCollector, changedFiles) @@ -616,7 +617,8 @@ abstract class CompileServiceImplBase( modulesApiHistory = modulesApiHistory, kotlinSourceFilesExtensions = allKotlinExtensions, classpathChanges = incrementalCompilationOptions.classpathChanges, - withAbiSnapshot = incrementalCompilationOptions.withAbiSnapshot + withAbiSnapshot = incrementalCompilationOptions.withAbiSnapshot, + preciseCompilationResultsBackup = incrementalCompilationOptions.preciseCompilationResultsBackup, ) return try { compiler.compile(allKotlinFiles, k2jvmArgs, compilerMessageCollector, changedFiles, projectRoot) diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt index 49b6be2c807..7bee2896d4f 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalCompilerRunner.kt @@ -70,7 +70,8 @@ abstract class IncrementalCompilerRunner< */ private val outputDirs: Collection?, - protected val withAbiSnapshot: Boolean = false + protected val withAbiSnapshot: Boolean = false, + private val preciseCompilationResultsBackup: Boolean = false, ) { protected val cacheDirectory = File(workingDir, cacheDirName) @@ -382,7 +383,7 @@ abstract class IncrementalCompilerRunner< performWorkBeforeCompilation(compilationMode, args) val allKotlinFiles = allSourceFiles.filter { it.isKotlinFile(kotlinSourceFilesExtensions) } - val exitCode = RecoverableCompilationTransaction(reporter, Files.createTempDirectory("kotlin-backups")).use { transaction -> + val exitCode = createTransaction().use { transaction -> doCompile(compilationMode, allKotlinFiles, args, caches, abiSnapshotData, messageCollector, transaction) } @@ -390,6 +391,12 @@ abstract class IncrementalCompilerRunner< return exitCode } + private fun createTransaction() = if (preciseCompilationResultsBackup) { + RecoverableCompilationTransaction(reporter, Files.createTempDirectory("kotlin-backups")) + } else { + DummyCompilationTransaction() + } + protected open fun performWorkBeforeCompilation(compilationMode: CompilationMode, args: Args) {} protected open fun performWorkAfterCompilation(compilationMode: CompilationMode, exitCode: ExitCode, caches: CacheManager) { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt index a4caa0d76ef..f2b5f073c14 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunner.kt @@ -87,14 +87,16 @@ class IncrementalJsCompilerRunner( buildHistoryFile: File, private val modulesApiHistory: ModulesApiHistory, private val scopeExpansion: CompileScopeExpansionMode = CompileScopeExpansionMode.NEVER, - withAbiSnapshot: Boolean = false + withAbiSnapshot: Boolean = false, + preciseCompilationResultsBackup: Boolean = false, ) : IncrementalCompilerRunner( workingDir, "caches-js", reporter, buildHistoryFile = buildHistoryFile, outputDirs = null, - withAbiSnapshot = withAbiSnapshot + withAbiSnapshot = withAbiSnapshot, + preciseCompilationResultsBackup = preciseCompilationResultsBackup, ) { override fun createCacheManager(args: K2JSCompilerArguments, projectDir: File?): IncrementalJsCachesManager { @@ -105,7 +107,7 @@ class IncrementalJsCompilerRunner( reporter, serializerProtocol, storeFullFqNamesInLookupCache = withAbiSnapshot - ) + ) } override fun destinationDir(args: K2JSCompilerArguments): File { diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index 40c5b791b59..12abb07e7e0 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -139,14 +139,16 @@ open class IncrementalJvmCompilerRunner( private val modulesApiHistory: ModulesApiHistory, override val kotlinSourceFilesExtensions: List = DEFAULT_KOTLIN_SOURCE_FILES_EXTENSIONS, private val classpathChanges: ClasspathChanges, - withAbiSnapshot: Boolean = false + withAbiSnapshot: Boolean = false, + preciseCompilationResultsBackup: Boolean = false, ) : IncrementalCompilerRunner( workingDir, "caches-jvm", reporter, buildHistoryFile = buildHistoryFile, outputDirs = outputDirs, - withAbiSnapshot = withAbiSnapshot + withAbiSnapshot = withAbiSnapshot, + preciseCompilationResultsBackup = preciseCompilationResultsBackup, ) { override fun createCacheManager(args: K2JVMCompilerArguments, projectDir: File?): IncrementalJvmCachesManager = IncrementalJvmCachesManager( 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 f189ae56f56..eacf1cb673f 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 @@ -294,7 +294,8 @@ internal class GradleKotlinCompilerWork @Inject constructor( multiModuleICSettings = icEnv.multiModuleICSettings, modulesInfo = incrementalModuleInfo!!, kotlinScriptExtensions = kotlinScriptExtensions, - withAbiSnapshot = icEnv.withAbiSnapshot + withAbiSnapshot = icEnv.withAbiSnapshot, + preciseCompilationResultsBackup = icEnv.preciseCompilationResultsBackup, ) log.info("Options for KOTLIN DAEMON: $compilationOptions") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt index 08335e1fc6d..3ded9ded099 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt @@ -18,9 +18,10 @@ internal class IncrementalCompilationEnvironment( val usePreciseJavaTracking: Boolean = false, val disableMultiModuleIC: Boolean = false, val multiModuleICSettings: MultiModuleICSettings, - val withAbiSnapshot: Boolean = false + val withAbiSnapshot: Boolean = false, + val preciseCompilationResultsBackup: Boolean = false, ) : Serializable { companion object { - const val serialVersionUID: Long = 1 + const val serialVersionUID: Long = 2 } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index c6c88d5799c..56e882edcf3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.dsl.NativeCacheOrchestration import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessageOutputStreamHandler.Companion.IGNORE_TCSM_OVERFLOW import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompilerProperty import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_ABI_SNAPSHOT +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_JS_KARMA_BROWSERS import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_GRADLE_PLUGIN_COMPATIBILITY_NO_WARN import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_ANDROID_SOURCE_SET_LAYOUT_ANDROID_STYLE_NO_WARN @@ -483,6 +484,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val kotlinDaemonUseFallbackStrategy: Boolean get() = booleanProperty("kotlin.daemon.useFallbackStrategy") ?: true + val preciseCompilationResultsBackup: Boolean + get() = booleanProperty(KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP) ?: false + /** * Retrieves a comma-separated list of browsers to use when running karma tests for [target] * @see KOTLIN_JS_KARMA_BROWSERS @@ -556,6 +560,7 @@ internal class PropertiesProvider private constructor(private val project: Proje const val KOTLIN_BUILD_REPORT_HTTP_URL = "kotlin.build.report.http.url" const val KOTLIN_OPTIONS_SUPPRESS_FREEARGS_MODIFICATION_WARNING = "kotlin.options.suppressFreeCompilerArgsModificationWarning" const val KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE = "kotlin.native.useXcodeMessageStyle" + const val KOTLIN_COMPILER_USE_PRECISE_COMPILATION_RESULTS_BACKUP = "kotlin.compiler.preciseCompilationResultsBackup" } companion object { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index f60db860518..37aed10d092 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -381,10 +381,19 @@ abstract class AbstractKotlinCompile @Inject constr private val systemPropertiesService = CompilerSystemPropertiesService.registerIfAbsent(project.gradle) + @get:Internal + internal abstract val preciseCompilationResultsBackup: Property + /** Task outputs that we don't want to include in [TaskOutputsBackup] (see [TaskOutputsBackup.outputsToRestore] for more info). */ @get:Internal protected open val taskOutputsBackupExcludes: List - get() = listOf(destinationDirectory.get().asFile) + get() { + val list = mutableListOf() + if (preciseCompilationResultsBackup.get()) { + list.add(destinationDirectory.get().asFile) + } + return list + } @TaskAction fun execute(inputChanges: InputChanges) { @@ -749,11 +758,12 @@ abstract class KotlinCompile @Inject constructor( usePreciseJavaTracking = usePreciseJavaTracking, disableMultiModuleIC = disableMultiModuleIC, multiModuleICSettings = multiModuleICSettings, - withAbiSnapshot = useKotlinAbiSnapshot.get() + withAbiSnapshot = useKotlinAbiSnapshot.get(), + preciseCompilationResultsBackup = preciseCompilationResultsBackup.get(), ) } else null - @Suppress("ConvertArgumentToSet", "DEPRECATION") + @Suppress("ConvertArgumentToSet") val environment = GradleCompilerEnvironment( defaultCompilerClasspath, gradleMessageCollector, outputItemCollector, // In the incremental compiler, outputFiles will be cleaned on rebuild. However, because classpathSnapshotDir is not included in @@ -1175,7 +1185,8 @@ abstract class Kotlin2JsCompile @Inject constructor( getChangedFiles(inputChanges, incrementalProps), ClasspathChanges.NotAvailableForJSCompiler, taskBuildCacheableOutputDirectory.get().asFile, - multiModuleICSettings = multiModuleICSettings + multiModuleICSettings = multiModuleICSettings, + preciseCompilationResultsBackup = preciseCompilationResultsBackup.get(), ) } else null 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 d3aeb6e668b..5a248ac5005 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 @@ -77,6 +77,10 @@ internal abstract class AbstractKotlinCompileConfig