From bbe2c63c2c36b6b5b99e988cf7632229f2ab2b83 Mon Sep 17 00:00:00 2001 From: Konstantin Nisht Date: Sun, 17 Sep 2023 13:45:00 +0200 Subject: [PATCH] [external-system] IJPL-170: Also wait until startup activities are invoked during the project open GitOrigin-RevId: 7c88385e4401d1a5d7592e02303f30f9c011bce6 --- .../util/ExternalSystemInProgressService.kt | 26 ++++++++++++++++++- .../UnlinkedProjectStartupActivity.kt | 1 + .../service/ExternalSystemStartupActivity.kt | 1 + .../observable/AbstractInProgressService.kt | 2 +- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemInProgressService.kt b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemInProgressService.kt index ef7b94690fd8..08ba4636ff69 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemInProgressService.kt +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemInProgressService.kt @@ -1,9 +1,33 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.externalSystem.util +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.components.Service import com.intellij.openapi.observable.AbstractInProgressService import kotlinx.coroutines.CoroutineScope @Service(Service.Level.PROJECT) -class ExternalSystemInProgressService(scope: CoroutineScope) : AbstractInProgressService(scope) \ No newline at end of file +class ExternalSystemInProgressService(scope: CoroutineScope) : AbstractInProgressService(scope) { + @Volatile + private var isUnlinkedActivityStarted: Boolean = false + @Volatile + private var isExternalProjectActivityStarted: Boolean = false + + fun unlinkedActivityStarted() { + isUnlinkedActivityStarted = true + } + + fun externalSystemActivityStarted() { + isExternalProjectActivityStarted = true + } + + private fun isUnlinkedActivityPending() : Boolean{ + return !ApplicationManager.getApplication().isUnitTestMode && !isUnlinkedActivityStarted + } + + override fun isInProgress(): Boolean { + return super.isInProgress() || + isUnlinkedActivityPending() || + !isExternalProjectActivityStarted + } +} \ No newline at end of file diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autolink/UnlinkedProjectStartupActivity.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autolink/UnlinkedProjectStartupActivity.kt index bc0ac253f4df..a3253894f733 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autolink/UnlinkedProjectStartupActivity.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autolink/UnlinkedProjectStartupActivity.kt @@ -45,6 +45,7 @@ class UnlinkedProjectStartupActivity : ProjectActivity { override suspend fun execute(project: Project) { project.serviceAsync().trackConfigurationActivity { + project.serviceAsync().unlinkedActivityStarted() loadProjectIfSingleUnlinkedProjectFound(project) val projectRoots = installProjectRootsScanner(project) installUnlinkedProjectScanner(project, projectRoots) diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemStartupActivity.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemStartupActivity.kt index 21f43b9f734c..eeca9c30bdb5 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemStartupActivity.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ExternalSystemStartupActivity.kt @@ -23,6 +23,7 @@ import kotlinx.coroutines.withContext internal class ExternalSystemStartupActivity : ProjectActivity { override suspend fun execute(project: Project) = project.serviceAsync().trackConfigurationActivity { + project.serviceAsync().externalSystemActivityStarted() val esProjectsManager = readAction { ExternalProjectsManagerImpl.getInstance(project) } diff --git a/platform/platform-api/src/com/intellij/openapi/observable/AbstractInProgressService.kt b/platform/platform-api/src/com/intellij/openapi/observable/AbstractInProgressService.kt index 0810f50f112b..832eccdfc20c 100644 --- a/platform/platform-api/src/com/intellij/openapi/observable/AbstractInProgressService.kt +++ b/platform/platform-api/src/com/intellij/openapi/observable/AbstractInProgressService.kt @@ -59,7 +59,7 @@ abstract class AbstractInProgressService(private val scope: CoroutineScope) { } } - fun isInProgress(): Boolean { + open fun isInProgress(): Boolean { return inProgress != 0 } }