[WSM] IJPL-218899 PythonFacetConfiguration may try to search for an SDK in ProjectJdkTable before SDKs were applied to the project WSM

GitOrigin-RevId: 9b6a750172c7e87994288d2ec28713f2193fc899
This commit is contained in:
Liudmila Kornilova
2025-11-18 23:43:10 +00:00
committed by intellij-monorepo-bot
parent 20800ac302
commit a97aba8498
3 changed files with 18 additions and 5 deletions
@@ -31,6 +31,7 @@ import com.intellij.workspaceModel.ide.impl.jpsMetrics
import com.intellij.workspaceModel.ide.impl.legacyBridge.library.ProjectLibraryTableBridgeImpl
import com.intellij.workspaceModel.ide.impl.legacyBridge.project.ProjectRootManagerBridge
import io.opentelemetry.api.metrics.Meter
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch
@@ -65,6 +66,7 @@ private class ModuleBridgeLoaderService : InitProjectActivity {
val start = Milliseconds.now()
if (workspaceModel.loadedFromCache) {
val globalWsmAppliedToProjectWsm = CompletableDeferred<Project>()
span("modules loading with cache") {
if (projectModelSynchronizer.hasNoSerializedJpsModules()) {
LOG.warn("Loaded from cache, but no serialized modules found. " +
@@ -78,11 +80,17 @@ private class ModuleBridgeLoaderService : InitProjectActivity {
targetUnloadedEntitiesBuilder = null,
loadedFromCache = workspaceModel.loadedFromCache,
workspaceModel = workspaceModel,
globalWsmAppliedToProjectWsm = globalWsmAppliedToProjectWsm,
)
}
val globalWorkspaceModel = GlobalWorkspaceModel.getInstanceAsync(project.getEelDescriptor().machine)
backgroundWriteAction {
globalWorkspaceModel.applyStateToProject(project)
try {
globalWorkspaceModel.applyStateToProject(project)
}
finally {
globalWsmAppliedToProjectWsm.complete(project)
}
}
}
else {
@@ -137,6 +145,7 @@ private suspend fun loadModules(
targetBuilder: MutableEntityStorage?,
targetUnloadedEntitiesBuilder: MutableEntityStorage?,
loadedFromCache: Boolean,
globalWsmAppliedToProjectWsm: CompletableDeferred<Project>? = null,
) {
span("modules instantiation") {
val moduleManager = project.serviceAsync<ModuleManager>() as ModuleManagerComponentBridge
@@ -153,7 +162,8 @@ private suspend fun loadModules(
moduleManager.loadModules(loadedEntities = entities,
unloadedEntities = unloadedEntities,
targetBuilder = targetBuilder,
initializeFacets = loadedFromCache)
initializeFacets = loadedFromCache,
globalWsmAppliedToProjectWsm)
}
span("libraries instantiation") {
@@ -41,6 +41,7 @@ import com.intellij.workspaceModel.ide.impl.legacyBridge.module.roots.ModuleRoot
import com.intellij.workspaceModel.ide.impl.legacyBridge.project.ModuleRootListenerBridgeImpl
import com.intellij.workspaceModel.ide.legacyBridge.ModuleBridge
import com.intellij.workspaceModel.ide.toPath
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@@ -169,8 +170,9 @@ open class ModuleManagerComponentBridge(private val project: Project, coroutineS
return moduleEntity
}
final override fun initFacets(modules: Collection<Pair<ModuleEntity, ModuleBridge>>) {
final override fun initFacets(modules: Collection<Pair<ModuleEntity, ModuleBridge>>, globalWsmAppliedToProjectWsm: CompletableDeferred<Project>?) {
coroutineScope.launch(CoroutineName("init facets")) {
globalWsmAppliedToProjectWsm?.await() // PythonFacetConfiguration expects to find an SDK by its name in ProjectJdkTable (which looks it up in project WSM)
ModuleBridgeImpl.initFacets(modules = modules, project = project)
}
}
@@ -187,6 +187,7 @@ abstract class ModuleManagerBridgeImpl(
unloadedEntities: List<ModuleEntity>,
targetBuilder: MutableEntityStorage?,
initializeFacets: Boolean,
globalWsmAppliedToProjectWsm: CompletableDeferred<Project>?,
): Unit = loadAllModulesTimeMs.addMeasuredTime {
LOG.debug { "Loading modules for ${loadedEntities.size} entities: [${loadedEntities.joinToString { it.name }}]" }
@@ -218,7 +219,7 @@ abstract class ModuleManagerBridgeImpl(
// Facets that are loaded from the cache do not generate "EntityAdded" event and aren't initialized
// We initialize the facets manually here (after modules loading).
if (initializeFacets) {
initFacets(result)
initFacets(result, globalWsmAppliedToProjectWsm)
}
coroutineScope.launch {
@@ -247,7 +248,7 @@ abstract class ModuleManagerBridgeImpl(
}
}
protected open fun initFacets(modules: Collection<Pair<ModuleEntity, ModuleBridge>>) {
protected open fun initFacets(modules: Collection<Pair<ModuleEntity, ModuleBridge>>, globalWsmAppliedToProjectWsm: CompletableDeferred<Project>?) {
}
final override fun calculateUnloadModules(