KT-59034 Remove variant factory usage from OperationCompletionListener

This commit is contained in:
Nataliya.Valtman
2023-06-01 18:18:26 +02:00
committed by Space Team
parent d1b775f157
commit 833b5c12a1
4 changed files with 15 additions and 8 deletions
@@ -68,21 +68,20 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
override val pluginVersion: String = getKotlinPluginVersion(logger) override val pluginVersion: String = getKotlinPluginVersion(logger)
override fun apply(project: Project) { override fun apply(project: Project) {
checkGradleCompatibility()
project.registerDefaultVariantImplementations()
KotlinBuildStatsService.getOrCreateInstance(project)?.apply { KotlinBuildStatsService.getOrCreateInstance(project)?.apply {
report(StringMetrics.KOTLIN_COMPILER_VERSION, pluginVersion) report(StringMetrics.KOTLIN_COMPILER_VERSION, pluginVersion)
} }
BuildFlowService.registerIfAbsent(project) BuildFlowService.registerIfAbsent(project)
checkGradleCompatibility()
project.gradle.projectsEvaluated { project.gradle.projectsEvaluated {
whenBuildEvaluated(project) whenBuildEvaluated(project)
} }
addKotlinCompilerConfiguration(project) addKotlinCompilerConfiguration(project)
project.registerDefaultVariantImplementations()
project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply { project.configurations.maybeCreate(PLUGIN_CLASSPATH_CONFIGURATION_NAME).apply {
isVisible = false isVisible = false
@@ -18,6 +18,7 @@ import org.gradle.tooling.events.task.TaskFinishEvent
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder import org.jetbrains.kotlin.gradle.plugin.BuildEventsListenerRegistryHolder
import org.jetbrains.kotlin.gradle.plugin.StatisticsBuildFlowManager import org.jetbrains.kotlin.gradle.plugin.StatisticsBuildFlowManager
import org.jetbrains.kotlin.gradle.plugin.internal.isProjectIsolationEnabled
import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable import org.jetbrains.kotlin.gradle.utils.isConfigurationCacheAvailable
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer import org.jetbrains.kotlin.statistics.metrics.IStatisticsValuesConsumer
@@ -55,6 +56,11 @@ internal abstract class BuildFlowService : BuildService<BuildFlowService.Paramet
} }
val fusStatisticsAvailable = fusStatisticsAvailable(project.gradle) val fusStatisticsAvailable = fusStatisticsAvailable(project.gradle)
//Workaround for known issues for Gradle 8+: https://github.com/gradle/gradle/issues/24887:
// when this OperationCompletionListener is called services can be already closed for Gradle 8,
// so there is a change that no VariantImplementationFactory will be found
val isProjectIsolationEnabled = project.isProjectIsolationEnabled
return project.gradle.sharedServices.registerIfAbsent(serviceName, BuildFlowService::class.java) { spec -> return project.gradle.sharedServices.registerIfAbsent(serviceName, BuildFlowService::class.java) { spec ->
if (fusStatisticsAvailable) { if (fusStatisticsAvailable) {
KotlinBuildStatsService.applyIfInitialised { KotlinBuildStatsService.applyIfInitialised {
@@ -63,7 +69,7 @@ internal abstract class BuildFlowService : BuildService<BuildFlowService.Paramet
} }
spec.parameters.configurationMetrics.set(project.provider { spec.parameters.configurationMetrics.set(project.provider {
KotlinBuildStatsService.getInstance()?.collectStartMetrics(project) KotlinBuildStatsService.getInstance()?.collectStartMetrics(project, isProjectIsolationEnabled)
}) })
spec.parameters.fusStatisticsAvailable.set(fusStatisticsAvailable) spec.parameters.fusStatisticsAvailable.set(fusStatisticsAvailable)
}.also { buildService -> }.also { buildService ->
@@ -84,13 +84,14 @@ class KotlinBuildStatHandler {
internal fun collectConfigurationTimeMetrics( internal fun collectConfigurationTimeMetrics(
project: Project, project: Project,
sessionLogger: BuildSessionLogger, sessionLogger: BuildSessionLogger,
isProjectIsolationEnabled: Boolean,
): MetricContainer { ): MetricContainer {
val gradle = project.gradle val gradle = project.gradle
val configurationTimeMetrics = MetricContainer() val configurationTimeMetrics = MetricContainer()
configurationTimeMetrics.put(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath) configurationTimeMetrics.put(StringMetrics.PROJECT_PATH, gradle.rootProject.projectDir.absolutePath)
configurationTimeMetrics.put(StringMetrics.GRADLE_VERSION, gradle.gradleVersion) configurationTimeMetrics.put(StringMetrics.GRADLE_VERSION, gradle.gradleVersion)
if (project.isProjectIsolationEnabled) { //support project isolation - KT-58768 if (isProjectIsolationEnabled) { //support project isolation - KT-58768
return configurationTimeMetrics return configurationTimeMetrics
} }
@@ -129,7 +129,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
registerPre232IdeaStatsBean(mbs, gradle, log) registerPre232IdeaStatsBean(mbs, gradle, log)
} }
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider { BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(project.provider {
OperationCompletionListener { event -> OperationCompletionListener { event ->
if (event is TaskFinishEvent) { if (event is TaskFinishEvent) {
reportTaskIfNeed(event.descriptor.name) reportTaskIfNeed(event.descriptor.name)
@@ -220,7 +220,7 @@ internal abstract class KotlinBuildStatsService internal constructor() : IStatis
/** /**
* Collect project general and configuration metrics at the start of a build * Collect project general and configuration metrics at the start of a build
*/ */
open fun collectStartMetrics(project: Project): MetricContainer = MetricContainer() open fun collectStartMetrics(project: Project, isProjectIsolationEnabled: Boolean): MetricContainer = MetricContainer()
open fun recordProjectsEvaluated(gradle: Gradle) {} open fun recordProjectsEvaluated(gradle: Gradle) {}
} }
@@ -338,6 +338,7 @@ internal class DefaultKotlinBuildStatsService internal constructor(
KotlinBuildStatHandler().reportBuildFinished(sessionLogger, action, buildFailed, configurationTimeMetrics) KotlinBuildStatHandler().reportBuildFinished(sessionLogger, action, buildFailed, configurationTimeMetrics)
} }
override fun collectStartMetrics(project: Project) = KotlinBuildStatHandler().collectConfigurationTimeMetrics(project, sessionLogger) override fun collectStartMetrics(project: Project, isProjectIsolationEnabled: Boolean) =
KotlinBuildStatHandler().collectConfigurationTimeMetrics(project, sessionLogger, isProjectIsolationEnabled)
} }