From 4678a003244b61adf967a1b5fb99bf2b2acdb46b Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 2 Nov 2018 02:08:43 +0300 Subject: [PATCH] Always clear local state directories for non-incremental build --- .../GradleCompilerEnvironment.kt | 1 + .../GradleKotlinCompilerRunner.kt | 3 +- .../GradleKotlinCompilerWork.kt | 32 ++++++++----------- .../IncrementalCompilationEnvironment.kt | 1 - .../internal/kapt/KaptWithKotlincTask.kt | 11 +++---- .../internal/kapt/KaptWithoutKotlincTask.kt | 4 +-- .../gradle/tasks/KotlinCompileCommon.kt | 5 ++- .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 18 +++++++---- .../kotlin/gradle/tasks/tasksUtils.kt | 24 ++++++++------ 9 files changed, 53 insertions(+), 46 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt index d479cb528f4..b3b47d49614 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerEnvironment.kt @@ -14,6 +14,7 @@ internal class GradleCompilerEnvironment( val compilerClasspath: List, messageCollector: GradleMessageCollector, outputItemsCollector: OutputItemsCollector, + val localStateDirectories: List, val incrementalCompilationEnvironment: IncrementalCompilationEnvironment? = null ) : CompilerEnvironment(Services.EMPTY, messageCollector, outputItemsCollector) { val toolsJar: File? by lazy { findToolsJar() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt index 2aa4c9092c8..2543b76778f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerRunner.kt @@ -134,7 +134,8 @@ internal open class GradleCompilerRunner(protected val project: Project) { isVerbose = compilerArgs.verbose, incrementalCompilationEnvironment = incrementalCompilationEnvironment, incrementalModuleInfo = modulesInfo, - buildFile = buildFile + buildFile = buildFile, + localStateDirectories = environment.localStateDirectories ) runCompilerAsync(workArgs) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt index d612ad06db5..0b9a4dab1bc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleKotlinCompilerWork.kt @@ -14,8 +14,8 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.gradle.plugin.kotlinDebug -import org.jetbrains.kotlin.gradle.plugin.kotlinInfo import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector +import org.jetbrains.kotlin.gradle.tasks.clearLocalStateDirectories import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError import org.jetbrains.kotlin.incremental.ChangedFiles import org.jetbrains.kotlin.incremental.DELETE_MODULE_FILE_PROPERTY @@ -52,7 +52,8 @@ internal class GradleKotlinCompilerWorkArguments( val isVerbose: Boolean, val incrementalCompilationEnvironment: IncrementalCompilationEnvironment?, val incrementalModuleInfo: IncrementalModuleInfo?, - val buildFile: File? + val buildFile: File?, + val localStateDirectories: List ) : Serializable { companion object { const val serialVersionUID: Long = 0 @@ -79,6 +80,7 @@ internal class GradleKotlinCompilerWork @Inject constructor( private val incrementalCompilationEnvironment = config.incrementalCompilationEnvironment private val incrementalModuleInfo = config.incrementalModuleInfo private val buildFile = config.buildFile + private val localStateDirectories = config.localStateDirectories private val log: KotlinLogger = SL4JKotlinLogger(LoggerFactory.getLogger("GradleKotlinCompilerWork")) @@ -88,8 +90,15 @@ internal class GradleKotlinCompilerWork @Inject constructor( get() = incrementalCompilationEnvironment != null override fun run() { + if (!isIncremental) { + clearLocalStateDirectories(log, localStateDirectories, "IC is disabled") + } + val exitCode = try { compileWithDaemonOrFallbackImpl() + } catch (e: Throwable) { + clearLocalStateDirectories(log, localStateDirectories, "exception when running compiler") + throw e } finally { if (buildFile != null && System.getProperty(DELETE_MODULE_FILE_PROPERTY) != "false") { buildFile.delete() @@ -102,28 +111,13 @@ internal class GradleKotlinCompilerWork @Inject constructor( } if (exitCode != ExitCode.OK) { - // for non-incremental compilation cleanup is always performed before compiler is called - cleanupOnError(incrementalCompilationEnvironment) + clearLocalStateDirectories(log, localStateDirectories, "exit code: $exitCode") } } throwGradleExceptionIfError(exitCode) } - private fun cleanupOnError(incrementalCompilationEnvironment: IncrementalCompilationEnvironment) { - val localStateDirs = incrementalCompilationEnvironment.localStateDirs - log.info("Deleting output directories on error: ${localStateDirs.joinToString()}") - for (dir in localStateDirs) { - if (dir.exists()) { - if (dir.deleteRecursively()) { - log.debug("Deleted $dir") - } else { - log.debug("Could not delete $dir") - } - } - } - } - private fun compileWithDaemonOrFallbackImpl(): ExitCode { with(log) { kotlinDebug { "Kotlin compiler class: ${compilerClassName}" } @@ -240,7 +234,7 @@ internal class GradleKotlinCompilerWork @Inject constructor( compilerMode = CompilerMode.INCREMENTAL_COMPILER, targetPlatform = targetPlatform, usePreciseJavaTracking = icEnv.usePreciseJavaTracking, - localStateDirs = icEnv.localStateDirs, + localStateDirs = localStateDirectories, multiModuleICSettings = icEnv.multiModuleICSettings, modulesInfo = incrementalModuleInfo!! ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt index b56258cfc88..c1a9df5a0e7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/IncrementalCompilationEnvironment.kt @@ -14,7 +14,6 @@ internal class IncrementalCompilationEnvironment( val changedFiles: ChangedFiles, val workingDir: File, val usePreciseJavaTracking: Boolean = false, - val localStateDirs: List = emptyList(), val disableMultiModuleIC: Boolean = false, val multiModuleICSettings: MultiModuleICSettings ) : Serializable { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt index 931799ad090..d0707647f5b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/KaptWithKotlincTask.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.gradle.plugin.PLUGIN_CLASSPATH_CONFIGURATION_NAME import org.jetbrains.kotlin.gradle.tasks.CompilerPluginOptions import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector -import org.jetbrains.kotlin.gradle.tasks.clearOutputDirectories +import org.jetbrains.kotlin.gradle.tasks.localStateDirectories import org.jetbrains.kotlin.gradle.utils.toSortedPathsArray open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput { @@ -55,15 +55,14 @@ open class KaptWithKotlincTask : KaptTask(), CompilerArgumentAwareWithInput(), Kotl if (hasFilesInTaskBuildDirectory()) changedFiles else ChangedFiles.Unknown(), taskBuildDirectory, usePreciseJavaTracking = usePreciseJavaTracking, - localStateDirs = outputDirectories, disableMultiModuleIC = disableMultiModuleIC(), multiModuleICSettings = multiModuleICSettings ) - } else { - clearOutputDirectories(reason = "IC is disabled for the task") - null - } + } else null - val environment = GradleCompilerEnvironment(computedCompilerClasspath, messageCollector, outputItemCollector, icEnv) + val environment = GradleCompilerEnvironment( + computedCompilerClasspath, messageCollector, outputItemCollector, + localStateDirectories = localStateDirectories(), + incrementalCompilationEnvironment = icEnv + ) compilerRunner.runJvmCompilerAsync( sourceRoots.kotlinSourceFiles, commonSourceSet.toList(), @@ -554,7 +554,11 @@ open class Kotlin2JsCompile() : AbstractKotlinCompile(), ) } else null - val environment = GradleCompilerEnvironment(computedCompilerClasspath, messageCollector, outputItemCollector, icEnv) + val environment = GradleCompilerEnvironment( + computedCompilerClasspath, messageCollector, outputItemCollector, + localStateDirectories = localStateDirectories(), + incrementalCompilationEnvironment = icEnv + ) compilerRunner.runJsCompilerAsync(sourceRoots.kotlinSourceFiles, commonSourceSet.toList(), args, environment) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/tasksUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/tasksUtils.kt index 8590b82a266..1f2dd65a34d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/tasksUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/tasksUtils.kt @@ -3,6 +3,8 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.GradleException import org.gradle.api.Task import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.compilerRunner.GradleKotlinLogger +import org.jetbrains.kotlin.compilerRunner.KotlinLogger import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.utils.outputsCompatible import java.io.File @@ -18,23 +20,27 @@ fun throwGradleExceptionIfError(exitCode: ExitCode) { } } -internal val T.outputDirectories: List - get() = outputsCompatible.files.files.filter { it.isDirectory } +internal fun T.localStateDirectories(): List = + outputsCompatible.files.files.filter { it.isDirectory } -internal fun T.clearOutputDirectories(reason: String? = null) { - logger.kotlinDebug { +internal fun T.clearLocalStateDirectories(reason: String? = null) { + clearLocalStateDirectories(GradleKotlinLogger(logger), localStateDirectories(), reason) +} + +internal fun clearLocalStateDirectories(log: KotlinLogger, localStateDirectories: List, reason: String?) { + log.kotlinDebug { val suffix = reason?.let { " ($it)" }.orEmpty() - "Clearing output directories for task '$path'$suffix:" + "Clearing output directories$suffix:" } - val outputDirectories = outputDirectories - for (dir in outputDirectories) { + for (dir in localStateDirectories) { + if (!dir.exists()) continue when { dir.isDirectory -> { dir.deleteRecursively() dir.mkdirs() - logger.kotlinDebug { " deleted $dir" } + log.kotlinDebug { " deleted $dir" } } - else -> logger.kotlinDebug { " skipping $dir (not a directory)" } + else -> log.kotlinDebug { " skipping $dir (not a directory)" } } } } \ No newline at end of file