From 4fc05f74c34ced32603d5241b1fad9a32b496c15 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Tue, 30 Oct 2018 05:34:09 +0300 Subject: [PATCH] Wrap null values into serializable optional Otherwise worker executor fails with NPE --- .../GradleCompilerRunnerWithWorkers.kt | 10 ++++++++-- .../compilerRunner/GradleKotlinCompilerRunner.kt | 5 +++-- .../compilerRunner/KotlinCompilerRunnable.kt | 11 ++++++----- .../kotlin/gradle/utils/SerializableOptional.kt | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/SerializableOptional.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt index c91f1e028f0..34cc079c2a9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/GradleCompilerRunnerWithWorkers.kt @@ -6,9 +6,11 @@ package org.jetbrains.kotlin.compilerRunner import org.gradle.api.Project +import org.gradle.workers.ForkMode import org.gradle.workers.IsolationMode import org.gradle.workers.WorkerExecutor import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.gradle.utils.SerializableOptional internal class GradleCompilerRunnerWithWorkers( project: Project, @@ -19,16 +21,20 @@ internal class GradleCompilerRunnerWithWorkers( compilerArgs: CommonCompilerArguments, environment: GradleCompilerEnvironment ) { + val icEnv = environment.incrementalCompilationEnvironment + val modulesInfo = icEnv?.let { buildModulesInfo(project.gradle) } + workersExecutor.submit(KotlinCompilerRunnable::class.java) { config -> config.isolationMode = IsolationMode.NONE + config.forkMode = ForkMode.NEVER config.params( ProjectFilesForCompilation(project), environment.compilerFullClasspath, compilerClassName, ArgumentUtils.convertArgumentsToStringList(compilerArgs).toTypedArray(), compilerArgs.verbose, - environment.incrementalCompilationEnvironment, - buildModulesInfo(project.gradle) + SerializableOptional(icEnv), + SerializableOptional(modulesInfo) ) } } 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 df9cf629ff6..6414177c6bd 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 @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.daemon.client.CompileServiceSession import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.tasks.* +import org.jetbrains.kotlin.gradle.utils.SerializableOptional import org.jetbrains.kotlin.gradle.utils.newTmpFile import org.jetbrains.kotlin.gradle.utils.relativeToRoot import org.jetbrains.kotlin.incremental.* @@ -130,8 +131,8 @@ internal open class GradleCompilerRunner(protected val project: Project) { compilerClassName = compilerClassName, compilerArgs = ArgumentUtils.convertArgumentsToStringList(compilerArgs).toTypedArray(), isVerbose = compilerArgs.verbose, - incrementalCompilationEnvironment = environment.incrementalCompilationEnvironment, - incrementalModuleInfo = buildModulesInfo(project.gradle) + incrementalCompilationEnvironment = SerializableOptional(environment.incrementalCompilationEnvironment), + incrementalModuleInfo = SerializableOptional(buildModulesInfo(project.gradle)) ) kotlinCompilerRunnable.run() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnable.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnable.kt index 108ebd2f992..f248c64ccb5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnable.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinCompilerRunnable.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.daemon.common.* import org.jetbrains.kotlin.gradle.plugin.kotlinDebug import org.jetbrains.kotlin.gradle.tasks.GradleMessageCollector import org.jetbrains.kotlin.gradle.tasks.throwGradleExceptionIfError +import org.jetbrains.kotlin.gradle.utils.SerializableOptional import org.jetbrains.kotlin.incremental.ChangedFiles import org.slf4j.LoggerFactory import java.io.ByteArrayOutputStream @@ -48,15 +49,15 @@ internal class KotlinCompilerRunnable @Inject constructor( private val compilerClassName: String, private val compilerArgs: Array, private val isVerbose: Boolean, - private val incrementalCompilationEnvironment: IncrementalCompilationEnvironment?, - private val incrementalModuleInfo: IncrementalModuleInfo? + private val incrementalCompilationEnvironment: SerializableOptional, + private val incrementalModuleInfo: SerializableOptional ) : Runnable { private val log: KotlinLogger = SL4JKotlinLogger(LoggerFactory.getLogger("KotlinCompilerRunnable")) private val messageCollector = GradleMessageCollector(log) private val isIncremental: Boolean - get() = incrementalCompilationEnvironment != null + get() = incrementalCompilationEnvironment.value != null override fun run() { val exitCode = compileWithDaemonOrFallbackImpl() @@ -165,7 +166,7 @@ internal class KotlinCompilerRunnable @Inject constructor( sessionId: Int, targetPlatform: CompileService.TargetPlatform ): CompileService.CallResult { - val icEnv = incrementalCompilationEnvironment ?: error("incrementalCompilationEnvironment is null!") + val icEnv = incrementalCompilationEnvironment.value ?: error("incrementalCompilationEnvironment is null!") val knownChangedFiles = icEnv.changedFiles as? ChangedFiles.Known val compilationOptions = IncrementalCompilationOptions( @@ -181,7 +182,7 @@ internal class KotlinCompilerRunnable @Inject constructor( usePreciseJavaTracking = icEnv.usePreciseJavaTracking, localStateDirs = icEnv.localStateDirs, multiModuleICSettings = icEnv.multiModuleICSettings, - modulesInfo = incrementalModuleInfo!! + modulesInfo = incrementalModuleInfo.value!! ) log.info("Options for KOTLIN DAEMON: $compilationOptions") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/SerializableOptional.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/SerializableOptional.kt new file mode 100644 index 00000000000..326a29b9de5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/SerializableOptional.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.utils + +import java.io.Serializable + +internal class SerializableOptional(val value: T?) : Serializable { + companion object { + const val serialVersionUID: Long = 0 + } +} \ No newline at end of file