[BT] Introduce the project build uuid

This allows to perform some cleanups after the entire project build finished.
#KT-57398 In Progress
This commit is contained in:
Alexander.Likhachev
2023-07-04 00:40:38 +02:00
committed by Space Team
parent 28c059f25b
commit 175c00e5c7
11 changed files with 126 additions and 10 deletions
@@ -10,7 +10,8 @@ public final class org/jetbrains/kotlin/buildtools/api/CompilationResult : java/
public abstract interface class org/jetbrains/kotlin/buildtools/api/CompilationService { public abstract interface class org/jetbrains/kotlin/buildtools/api/CompilationService {
public static final field Companion Lorg/jetbrains/kotlin/buildtools/api/CompilationService$Companion; public static final field Companion Lorg/jetbrains/kotlin/buildtools/api/CompilationService$Companion;
public abstract fun calculateClasspathSnapshot (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathEntrySnapshot; public abstract fun calculateClasspathSnapshot (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathEntrySnapshot;
public abstract fun compileJvm (Lorg/jetbrains/kotlin/buildtools/api/CompilerExecutionStrategyConfiguration;Lorg/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/kotlin/buildtools/api/CompilationResult; public abstract fun compileJvm (Lorg/jetbrains/kotlin/buildtools/api/ProjectId;Lorg/jetbrains/kotlin/buildtools/api/CompilerExecutionStrategyConfiguration;Lorg/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration;Ljava/util/List;Ljava/util/List;)Lorg/jetbrains/kotlin/buildtools/api/CompilationResult;
public abstract fun finishProjectCompilation (Lorg/jetbrains/kotlin/buildtools/api/ProjectId;)V
public static fun loadImplementation (Ljava/lang/ClassLoader;)Lorg/jetbrains/kotlin/buildtools/api/CompilationService; public static fun loadImplementation (Ljava/lang/ClassLoader;)Lorg/jetbrains/kotlin/buildtools/api/CompilationService;
public abstract fun makeCompilerExecutionStrategyConfiguration ()Lorg/jetbrains/kotlin/buildtools/api/CompilerExecutionStrategyConfiguration; public abstract fun makeCompilerExecutionStrategyConfiguration ()Lorg/jetbrains/kotlin/buildtools/api/CompilerExecutionStrategyConfiguration;
public abstract fun makeJvmCompilationConfiguration ()Lorg/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration; public abstract fun makeJvmCompilationConfiguration ()Lorg/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration;
@@ -46,6 +47,20 @@ public abstract interface class org/jetbrains/kotlin/buildtools/api/KotlinLogger
public abstract fun warn (Ljava/lang/String;)V public abstract fun warn (Ljava/lang/String;)V
} }
public abstract interface class org/jetbrains/kotlin/buildtools/api/ProjectId {
}
public final class org/jetbrains/kotlin/buildtools/api/ProjectId$ProjectUUID : org/jetbrains/kotlin/buildtools/api/ProjectId {
public fun <init> (Ljava/util/UUID;)V
public final fun component1 ()Ljava/util/UUID;
public final fun copy (Ljava/util/UUID;)Lorg/jetbrains/kotlin/buildtools/api/ProjectId$ProjectUUID;
public static synthetic fun copy$default (Lorg/jetbrains/kotlin/buildtools/api/ProjectId$ProjectUUID;Ljava/util/UUID;ILjava/lang/Object;)Lorg/jetbrains/kotlin/buildtools/api/ProjectId$ProjectUUID;
public fun equals (Ljava/lang/Object;)Z
public final fun getUuid ()Ljava/util/UUID;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}
public final class org/jetbrains/kotlin/buildtools/api/SharedApiClassesClassLoader { public final class org/jetbrains/kotlin/buildtools/api/SharedApiClassesClassLoader {
public static final fun newInstance ()Ljava/lang/ClassLoader; public static final fun newInstance ()Ljava/lang/ClassLoader;
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.buildtools.api
import org.jetbrains.kotlin.buildtools.api.jvm.ClasspathEntrySnapshot import org.jetbrains.kotlin.buildtools.api.jvm.ClasspathEntrySnapshot
import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration import org.jetbrains.kotlin.buildtools.api.jvm.JvmCompilationConfiguration
import java.io.File import java.io.File
import java.util.*
/** /**
* A facade for invoking compilation and related stuff (such as [calculateClasspathSnapshot]) in Kotlin compiler. * A facade for invoking compilation and related stuff (such as [calculateClasspathSnapshot]) in Kotlin compiler.
@@ -43,18 +44,31 @@ public interface CompilationService {
/** /**
* Compiles Kotlin code targeting JVM platform and using specified options. * Compiles Kotlin code targeting JVM platform and using specified options.
*
* The [finishProjectCompilation] must be called with the same [projectId] after the entire project is compiled.
* @param projectId The unique identifier of the project to be compiled. It may be the same for different modules of the project.
* @param strategyConfig an instance of [CompilerExecutionStrategyConfiguration] initially obtained from [makeCompilerExecutionStrategyConfiguration] * @param strategyConfig an instance of [CompilerExecutionStrategyConfiguration] initially obtained from [makeCompilerExecutionStrategyConfiguration]
* @param compilationConfig an instance of [JvmCompilationConfiguration] initially obtained from [makeJvmCompilationConfiguration] * @param compilationConfig an instance of [JvmCompilationConfiguration] initially obtained from [makeJvmCompilationConfiguration]
* @param sources a list of all sources of the compilation unit * @param sources a list of all sources of the compilation unit
* @param arguments a list of Kotlin JVM compiler arguments * @param arguments a list of Kotlin JVM compiler arguments
*/ */
public fun compileJvm( public fun compileJvm(
projectId: ProjectId,
strategyConfig: CompilerExecutionStrategyConfiguration, strategyConfig: CompilerExecutionStrategyConfiguration,
compilationConfig: JvmCompilationConfiguration, compilationConfig: JvmCompilationConfiguration,
sources: List<File>, sources: List<File>,
arguments: List<String> arguments: List<String>
): CompilationResult ): CompilationResult
/**
* A finalization function that must be called when all the modules of the project are compiled.
*
* May perform cache clean-ups and resource freeing.
*
* @param projectId The unique identifier of the compiled project.
*/
public fun finishProjectCompilation(projectId: ProjectId)
@ExperimentalBuildToolsApi @ExperimentalBuildToolsApi
public companion object { public companion object {
@JvmStatic @JvmStatic
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.buildtools.api
import java.util.*
/**
* Represents a unique identifier for a specific project. In this context, a "project" refers to the top-level entity
* or the main project itself, rather than a project's module. It's important to note that in certain build systems,
* like Gradle, the term "project" may be used to refer to individual modules. However, in this interface, we are
* explicitly using it to represent a complete project rather than its sub-modules.
*/
public sealed interface ProjectId {
public data class ProjectUUID(public val uuid: UUID) : ProjectId
}
@@ -5,10 +5,7 @@
package org.jetbrains.kotlin.buildtools.internal package org.jetbrains.kotlin.buildtools.internal
import org.jetbrains.kotlin.buildtools.api.CompilationResult import org.jetbrains.kotlin.buildtools.api.*
import org.jetbrains.kotlin.buildtools.api.CompilationService
import org.jetbrains.kotlin.buildtools.api.CompilerArgumentsParseException
import org.jetbrains.kotlin.buildtools.api.CompilerExecutionStrategyConfiguration
import org.jetbrains.kotlin.buildtools.api.jvm.* import org.jetbrains.kotlin.buildtools.api.jvm.*
import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments import org.jetbrains.kotlin.cli.common.arguments.parseCommandLineArguments
@@ -27,7 +24,7 @@ private val ExitCode.asCompilationResult
else -> error("Unexpected exit code: $this") else -> error("Unexpected exit code: $this")
} }
internal class CompilationServiceImpl : CompilationService { internal object CompilationServiceImpl : CompilationService {
override fun calculateClasspathSnapshot(classpathEntry: File): ClasspathEntrySnapshot { override fun calculateClasspathSnapshot(classpathEntry: File): ClasspathEntrySnapshot {
TODO("Calculating classpath snapshots via the Build Tools API is not yet implemented: KT-57565") TODO("Calculating classpath snapshots via the Build Tools API is not yet implemented: KT-57565")
} }
@@ -37,6 +34,7 @@ internal class CompilationServiceImpl : CompilationService {
override fun makeJvmCompilationConfiguration() = JvmCompilationConfigurationImpl() override fun makeJvmCompilationConfiguration() = JvmCompilationConfigurationImpl()
override fun compileJvm( override fun compileJvm(
projectId: ProjectId,
strategyConfig: CompilerExecutionStrategyConfiguration, strategyConfig: CompilerExecutionStrategyConfiguration,
compilationConfig: JvmCompilationConfiguration, compilationConfig: JvmCompilationConfiguration,
sources: List<File>, sources: List<File>,
@@ -55,6 +53,10 @@ internal class CompilationServiceImpl : CompilationService {
} }
} }
override fun finishProjectCompilation(projectId: ProjectId) {
}
private fun compileInProcess( private fun compileInProcess(
loggerAdapter: KotlinLoggerMessageCollectorAdapter, loggerAdapter: KotlinLoggerMessageCollectorAdapter,
sources: List<File>, sources: List<File>,
@@ -71,3 +73,5 @@ internal class CompilationServiceImpl : CompilationService {
return compiler.exec(loggerAdapter, Services.EMPTY, parsedArguments).asCompilationResult return compiler.exec(loggerAdapter, Services.EMPTY, parsedArguments).asCompilationResult
} }
} }
internal class CompilationServiceProxy : CompilationService by CompilationServiceImpl
@@ -1 +1 @@
org.jetbrains.kotlin.buildtools.internal.CompilationServiceImpl org.jetbrains.kotlin.buildtools.internal.CompilationServiceProxy
@@ -9,6 +9,7 @@ import org.gradle.api.Project
import org.gradle.api.invocation.Gradle import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import org.gradle.api.provider.Property import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.bundling.AbstractArchiveTask import org.gradle.api.tasks.bundling.AbstractArchiveTask
import org.gradle.api.tasks.bundling.Zip import org.gradle.api.tasks.bundling.Zip
import org.gradle.jvm.tasks.Jar import org.gradle.jvm.tasks.Jar
@@ -29,8 +30,10 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService
import org.jetbrains.kotlin.gradle.logging.kotlinDebug import org.jetbrains.kotlin.gradle.logging.kotlinDebug
import org.jetbrains.kotlin.gradle.logging.kotlinInfo import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.BuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.internal.BuildIdService
import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor import org.jetbrains.kotlin.gradle.plugin.internal.JavaSourceSetsAccessor
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskLoggers import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskLoggers
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
@@ -60,7 +63,9 @@ internal fun createGradleCompilerRunner(
buildMetricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>, buildMetricsReporter: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
workerExecutor: WorkerExecutor, workerExecutor: WorkerExecutor,
runViaBuildToolsApi: Boolean, runViaBuildToolsApi: Boolean,
cachedClassLoadersService: Property<ClassLoadersCachingBuildService> cachedClassLoadersService: Property<ClassLoadersCachingBuildService>,
buildFinishedListenerService: Provider<BuildFinishedListenerService>,
buildIdService: Provider<BuildIdService>,
): GradleCompilerRunner { ): GradleCompilerRunner {
return if (runViaBuildToolsApi) { return if (runViaBuildToolsApi) {
GradleBuildToolsApiCompilerRunner( GradleBuildToolsApiCompilerRunner(
@@ -70,6 +75,8 @@ internal fun createGradleCompilerRunner(
buildMetricsReporter, buildMetricsReporter,
workerExecutor, workerExecutor,
cachedClassLoadersService, cachedClassLoadersService,
buildFinishedListenerService,
buildIdService,
) )
} else { } else {
GradleCompilerRunnerWithWorkers( GradleCompilerRunnerWithWorkers(
@@ -21,15 +21,20 @@ import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService
import org.jetbrains.kotlin.gradle.internal.ParentClassLoaderProvider import org.jetbrains.kotlin.gradle.internal.ParentClassLoaderProvider
import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger import org.jetbrains.kotlin.gradle.logging.GradleKotlinLogger
import org.jetbrains.kotlin.gradle.logging.SL4JKotlinLogger import org.jetbrains.kotlin.gradle.logging.SL4JKotlinLogger
import org.jetbrains.kotlin.gradle.plugin.BuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.internal.BuildIdService
import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskLoggers import org.jetbrains.kotlin.gradle.plugin.internal.state.TaskLoggers
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
import org.jetbrains.kotlin.gradle.tasks.throwExceptionIfCompilationFailed import org.jetbrains.kotlin.gradle.tasks.throwExceptionIfCompilationFailed
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.io.File import java.io.File
import java.util.*
@OptIn(ExperimentalBuildToolsApi::class) @OptIn(ExperimentalBuildToolsApi::class)
internal abstract class BuildToolsApiCompilationWork : WorkAction<BuildToolsApiCompilationWork.BuildToolsApiCompilationParameters> { internal abstract class BuildToolsApiCompilationWork : WorkAction<BuildToolsApiCompilationWork.BuildToolsApiCompilationParameters> {
internal interface BuildToolsApiCompilationParameters : WorkParameters { internal interface BuildToolsApiCompilationParameters : WorkParameters {
val buildIdService: Property<BuildIdService>
val buildFinishedListenerService: Property<BuildFinishedListenerService>
val classLoadersCachingService: Property<ClassLoadersCachingBuildService> val classLoadersCachingService: Property<ClassLoadersCachingBuildService>
val compilerWorkArguments: Property<GradleKotlinCompilerWorkArguments> val compilerWorkArguments: Property<GradleKotlinCompilerWorkArguments>
val taskOutputsToRestore: ListProperty<File> val taskOutputsToRestore: ListProperty<File>
@@ -64,6 +69,10 @@ internal abstract class BuildToolsApiCompilationWork : WorkAction<BuildToolsApiC
val classLoader = parameters.classLoadersCachingService.get() val classLoader = parameters.classLoadersCachingService.get()
.getClassLoader(workArguments.compilerFullClasspath, SharedApiClassesClassLoaderProvider) .getClassLoader(workArguments.compilerFullClasspath, SharedApiClassesClassLoaderProvider)
val compilationService = CompilationService.loadImplementation(classLoader) val compilationService = CompilationService.loadImplementation(classLoader)
val buildId = ProjectId.ProjectUUID(parameters.buildIdService.get().buildId)
parameters.buildFinishedListenerService.get().onCloseOnceByKey(buildId.toString()) {
compilationService.finishProjectCompilation(buildId)
}
val executionConfig = compilationService.makeCompilerExecutionStrategyConfiguration().apply { val executionConfig = compilationService.makeCompilerExecutionStrategyConfiguration().apply {
when (executionStrategy) { when (executionStrategy) {
KotlinCompilerExecutionStrategy.DAEMON -> TODO("The daemon strategy is not yet supported in the Build Tools API") KotlinCompilerExecutionStrategy.DAEMON -> TODO("The daemon strategy is not yet supported in the Build Tools API")
@@ -73,6 +82,7 @@ internal abstract class BuildToolsApiCompilationWork : WorkAction<BuildToolsApiC
} }
val jvmCompilationConfig = compilationService.makeJvmCompilationConfiguration() val jvmCompilationConfig = compilationService.makeJvmCompilationConfiguration()
val result = compilationService.compileJvm( val result = compilationService.compileJvm(
buildId,
executionConfig, executionConfig,
jvmCompilationConfig, jvmCompilationConfig,
emptyList(), emptyList(),
@@ -16,6 +16,8 @@ import org.jetbrains.kotlin.compilerRunner.CompilerExecutionSettings
import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner import org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner
import org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWorkArguments import org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWorkArguments
import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService
import org.jetbrains.kotlin.gradle.plugin.BuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.internal.BuildIdService
import org.jetbrains.kotlin.gradle.tasks.GradleCompileTaskProvider import org.jetbrains.kotlin.gradle.tasks.GradleCompileTaskProvider
import org.jetbrains.kotlin.gradle.tasks.TaskOutputsBackup import org.jetbrains.kotlin.gradle.tasks.TaskOutputsBackup
import java.io.File import java.io.File
@@ -26,7 +28,9 @@ internal class GradleBuildToolsApiCompilerRunner(
compilerExecutionSettings: CompilerExecutionSettings, compilerExecutionSettings: CompilerExecutionSettings,
buildMetrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>, buildMetrics: BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>,
private val workerExecutor: WorkerExecutor, private val workerExecutor: WorkerExecutor,
private val cachedClassLoadersService: Provider<ClassLoadersCachingBuildService> private val cachedClassLoadersService: Provider<ClassLoadersCachingBuildService>,
private val buildFinishedListenerService: Provider<BuildFinishedListenerService>,
private val buildIdService: Provider<BuildIdService>,
) : GradleCompilerRunner(taskProvider, jdkToolsJar, compilerExecutionSettings, buildMetrics) { ) : GradleCompilerRunner(taskProvider, jdkToolsJar, compilerExecutionSettings, buildMetrics) {
@@ -39,6 +43,8 @@ internal class GradleBuildToolsApiCompilerRunner(
workQueue.submit(BuildToolsApiCompilationWork::class.java) { params -> workQueue.submit(BuildToolsApiCompilationWork::class.java) { params ->
params.compilerWorkArguments.set(workArgs) params.compilerWorkArguments.set(workArgs)
params.classLoadersCachingService.set(cachedClassLoadersService) params.classLoadersCachingService.set(cachedClassLoadersService)
params.buildFinishedListenerService.set(buildFinishedListenerService)
params.buildIdService.set(buildIdService)
if (taskOutputsBackup != null) { if (taskOutputsBackup != null) {
params.taskOutputsToRestore.set(taskOutputsBackup.outputsToRestore) params.taskOutputsToRestore.set(taskOutputsBackup.outputsToRestore)
params.buildDir.set(taskOutputsBackup.buildDirectory) params.buildDir.set(taskOutputsBackup.buildDirectory)
@@ -0,0 +1,35 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* 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.plugin.internal
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.tasks.Internal
import org.jetbrains.kotlin.gradle.tasks.withType
import org.jetbrains.kotlin.gradle.utils.registerClassLoaderScopedBuildService
import java.util.*
internal interface UsesBuildIdProviderService : Task {
@get:Internal
val buildIdService: Property<BuildIdService>
}
internal abstract class BuildIdService : BuildService<BuildServiceParameters.None> {
val buildId: UUID = UUID.randomUUID()
companion object {
fun registerIfAbsent(project: Project): Provider<BuildIdService> =
project.gradle.registerClassLoaderScopedBuildService(BuildIdService::class).also { service ->
project.tasks.withType<UsesBuildIdProviderService>().configureEach { task ->
task.usesService(service)
}
}
}
}
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService import org.jetbrains.kotlin.gradle.plugin.UsesBuildFinishedListenerService
import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories import org.jetbrains.kotlin.gradle.plugin.UsesVariantImplementationFactories
import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.internal.UsesBuildIdProviderService
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.report.* import org.jetbrains.kotlin.gradle.report.*
import org.jetbrains.kotlin.gradle.utils.* import org.jetbrains.kotlin.gradle.utils.*
@@ -60,6 +61,7 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
UsesBuildFinishedListenerService, UsesBuildFinishedListenerService,
UsesClassLoadersCachingBuildService, UsesClassLoadersCachingBuildService,
UsesKotlinToolingDiagnostics, UsesKotlinToolingDiagnostics,
UsesBuildIdProviderService,
BaseKotlinCompile { BaseKotlinCompile {
init { init {
@@ -188,6 +190,8 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
workerExecutor, workerExecutor,
runViaBuildToolsApi.get(), runViaBuildToolsApi.get(),
classLoadersCachingService, classLoadersCachingService,
buildFinishedListenerService,
buildIdService,
) )
} }
} }
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.gradle.internal.ClassLoadersCachingBuildService
import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask import org.jetbrains.kotlin.gradle.internal.KaptGenerateStubsTask
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.internal.BuildIdService
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure import org.jetbrains.kotlin.gradle.plugin.mpp.associateWithClosure
@@ -69,6 +70,7 @@ internal abstract class AbstractKotlinCompileConfig<TASK : AbstractKotlinCompile
}) })
val buildFinishedListenerService = BuildFinishedListenerService.registerIfAbsent(project) val buildFinishedListenerService = BuildFinishedListenerService.registerIfAbsent(project)
val cachedClassLoadersService = ClassLoadersCachingBuildService.registerIfAbsent(project) val cachedClassLoadersService = ClassLoadersCachingBuildService.registerIfAbsent(project)
val buildIdService = BuildIdService.registerIfAbsent(project)
configureTask { task -> configureTask { task ->
val propertiesProvider = project.kotlinPropertiesProvider val propertiesProvider = project.kotlinPropertiesProvider
@@ -113,6 +115,7 @@ internal abstract class AbstractKotlinCompileConfig<TASK : AbstractKotlinCompile
.convention(propertiesProvider.suppressExperimentalICOptimizationsWarning) .convention(propertiesProvider.suppressExperimentalICOptimizationsWarning)
.finalizeValueOnRead() .finalizeValueOnRead()
task.buildFinishedListenerService.value(buildFinishedListenerService).disallowChanges() task.buildFinishedListenerService.value(buildFinishedListenerService).disallowChanges()
task.buildIdService.value(buildIdService).disallowChanges()
task.incremental = false task.incremental = false
task.useModuleDetection.convention(false) task.useModuleDetection.convention(false)