From bde25e49adce008cd4479653ba6af364a16410d0 Mon Sep 17 00:00:00 2001 From: Andrii Zinchenko Date: Thu, 26 Jun 2025 16:53:23 +0200 Subject: [PATCH] [platform-eel] IJPL-194035: All IJent filesystems are loaded greedily by recent projects in Welcome Screen (cherry picked from commit 7868f0266f728dbbca0666c600e5964a1d4282e5) (cherry picked from commit 4d3ec53a85d91ddb66a547edfea28c39157cb4c5) IJ-MR-167682 GitOrigin-RevId: 96b3ebfbcfe9642a6010fd9b7726ca17742ac03d --- .../impl/IjentFailSafeFileSystemPosixApi.kt | 19 +++++++------------ .../nio/toggle/IjentWslNioFsToggleStrategy.kt | 6 ++---- .../intellij/ide/RecentProjectIconHelper.kt | 11 +++++++++++ .../intellij/ide/RecentProjectsManagerBase.kt | 11 +++++++++++ .../repo/GitRecentProjectsBranchesProvider.kt | 10 ++++++++++ 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/platform/ijent/impl/src/com/intellij/platform/ijent/community/impl/IjentFailSafeFileSystemPosixApi.kt b/platform/ijent/impl/src/com/intellij/platform/ijent/community/impl/IjentFailSafeFileSystemPosixApi.kt index bf5796759391..03187550958f 100644 --- a/platform/ijent/impl/src/com/intellij/platform/ijent/community/impl/IjentFailSafeFileSystemPosixApi.kt +++ b/platform/ijent/impl/src/com/intellij/platform/ijent/community/impl/IjentFailSafeFileSystemPosixApi.kt @@ -38,15 +38,15 @@ import java.util.concurrent.atomic.AtomicReference @Suppress("FunctionName") fun IjentFailSafeFileSystemPosixApi( coroutineScope: CoroutineScope, - delegateFactory: suspend () -> IjentPosixApi, + descriptor: EelDescriptor, ): IjentFileSystemApi { - val holder = DelegateHolder(coroutineScope, delegateFactory) - return IjentFailSafeFileSystemPosixApiImpl(holder) + val holder = DelegateHolder(coroutineScope, descriptor) + return IjentFailSafeFileSystemPosixApiImpl(holder, descriptor) } private class DelegateHolder( private val coroutineScope: CoroutineScope, - private val delegateFactory: suspend () -> I, + private val descriptor: EelDescriptor ) { private val delegate = AtomicReference?>(null) @@ -63,7 +63,8 @@ private class DelegateHolder( oldDelegate else coroutineScope.async(Dispatchers.IO, start = CoroutineStart.LAZY) { - delegateFactory() + @Suppress("UNCHECKED_CAST") + descriptor.toEelApi() as I } }!! @@ -100,6 +101,7 @@ private class DelegateHolder( */ private class IjentFailSafeFileSystemPosixApiImpl( private val holder: DelegateHolder, + override val descriptor: EelDescriptor ) : IjentFileSystemPosixApi { // TODO Make user suspendable again? override val user: EelUserPosixInfo by lazy { @@ -108,13 +110,6 @@ private class IjentFailSafeFileSystemPosixApiImpl( } } - override val descriptor: EelDescriptor by lazy { - runBlocking { - holder.withDelegateRetrying { descriptor } - } - } - - override suspend fun listDirectory( path: EelPath, ): EelResult, EelFileSystemApi.ListDirectoryError> = diff --git a/platform/platform-impl/eel/src/com/intellij/platform/ide/impl/wsl/ijent/nio/toggle/IjentWslNioFsToggleStrategy.kt b/platform/platform-impl/eel/src/com/intellij/platform/ide/impl/wsl/ijent/nio/toggle/IjentWslNioFsToggleStrategy.kt index a79b84fa22b2..8dbcb497f605 100644 --- a/platform/platform-impl/eel/src/com/intellij/platform/ide/impl/wsl/ijent/nio/toggle/IjentWslNioFsToggleStrategy.kt +++ b/platform/platform-impl/eel/src/com/intellij/platform/ide/impl/wsl/ijent/nio/toggle/IjentWslNioFsToggleStrategy.kt @@ -3,7 +3,6 @@ package com.intellij.platform.ide.impl.wsl.ijent.nio.toggle import com.intellij.execution.wsl.WSLDistribution import com.intellij.execution.wsl.WslDistributionManager -import com.intellij.execution.wsl.WslIjentManager import com.intellij.openapi.diagnostic.logger import com.intellij.platform.eel.provider.EelNioBridgeService import com.intellij.platform.ide.impl.wsl.ijent.nio.IjentWslNioFileSystemProvider @@ -74,9 +73,8 @@ class IjentWslNioFsToggleStrategy( fun switchToIjentFs(distro: WSLDistribution) { val ijentFsProvider = TracingFileSystemProvider(IjentNioFileSystemProvider.getInstance()) try { - val ijentFs = IjentFailSafeFileSystemPosixApi(coroutineScope) { - WslIjentManager.instanceAsync().getIjentApi(distro, null, false) - } + val distributionId = distro.id + val ijentFs = IjentFailSafeFileSystemPosixApi(coroutineScope, WslEelDescriptor(WSLDistribution(distributionId))) ijentFsProvider.newFileSystem( URI("ijent", "wsl", "/${distro.id}", null, null), IjentNioFileSystemProvider.newFileSystemMap(ijentFs), diff --git a/platform/platform-impl/src/com/intellij/ide/RecentProjectIconHelper.kt b/platform/platform-impl/src/com/intellij/ide/RecentProjectIconHelper.kt index db6e50000fc3..7eb861eec753 100644 --- a/platform/platform-impl/src/com/intellij/ide/RecentProjectIconHelper.kt +++ b/platform/platform-impl/src/com/intellij/ide/RecentProjectIconHelper.kt @@ -7,6 +7,8 @@ import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.project.Project import com.intellij.openapi.project.ProjectStorePathManager import com.intellij.openapi.util.registry.Registry +import com.intellij.platform.eel.provider.LocalEelDescriptor +import com.intellij.platform.eel.provider.getEelDescriptor import com.intellij.ui.IconDeferrer import com.intellij.ui.JBColor import com.intellij.ui.LayeredIcon @@ -34,6 +36,7 @@ import java.nio.file.attribute.BasicFileAttributes import java.util.* import java.util.concurrent.atomic.AtomicInteger import javax.swing.Icon +import kotlin.io.path.Path @Internal fun unscaledProjectIconSize(): Int = Registry.intValue("ide.project.icon.size", 20) @@ -216,6 +219,14 @@ private fun getCustomIconFileInfo(path: @SystemIndependent String): Pair