[eel] introduce EelProvider

GitOrigin-RevId: 5016deac8fd138d9fb1fb6ab47d4bd7463053de1
This commit is contained in:
Andrii Zinchenko
2024-09-06 16:38:25 +02:00
committed by intellij-monorepo-bot
parent 3eace12483
commit 0ffa5e48a0
13 changed files with 90 additions and 3 deletions

1
.idea/modules.xml generated
View File

@@ -633,6 +633,7 @@
<module fileurl="file://$PROJECT_DIR$/platform/editor-ui-api/intellij.platform.editor.iml" filepath="$PROJECT_DIR$/platform/editor-ui-api/intellij.platform.editor.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/editor-ui-ex/intellij.platform.editor.ex.iml" filepath="$PROJECT_DIR$/platform/editor-ui-ex/intellij.platform.editor.ex.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/eel/intellij.platform.eel.iml" filepath="$PROJECT_DIR$/platform/eel/intellij.platform.eel.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/eelProvider/intellij.platform.eel.provider.iml" filepath="$PROJECT_DIR$/platform/eelProvider/intellij.platform.eel.provider.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/execution/intellij.platform.execution.iml" filepath="$PROJECT_DIR$/platform/execution/intellij.platform.execution.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/execution.dashboard/intellij.platform.execution.dashboard.iml" filepath="$PROJECT_DIR$/platform/execution.dashboard/intellij.platform.execution.dashboard.iml" />
<module fileurl="file://$PROJECT_DIR$/platform/execution-impl/intellij.platform.execution.impl.iml" filepath="$PROJECT_DIR$/platform/execution-impl/intellij.platform.execution.impl.iml" />

View File

@@ -10,6 +10,5 @@
<orderEntry type="library" name="kotlin-stdlib" level="project" />
<orderEntry type="library" name="jetbrains-annotations" level="project" />
<orderEntry type="library" name="kotlinx-coroutines-core" level="project" />
<orderEntry type="module" module-name="intellij.platform.util.base" />
</component>
</module>

View File

@@ -0,0 +1,13 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.eel
import java.nio.file.Path
interface EelFsApi {
fun getOriginalPath(path: Path): EelPath.Absolute
}
sealed interface EelPath {
data class Relative(val path: String) : EelPath
data class Absolute(val path: String) : EelPath
}

View File

@@ -1,7 +1,6 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.eel
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.eel.EelTunnelsApi.Connection
import com.intellij.platform.eel.impl.IpProtocolPreferenceImpl
import kotlinx.coroutines.CoroutineScope
@@ -393,7 +392,7 @@ sealed interface EelNetworkResult<out T, out E : EelNetworkError> {
* An error that can happen during the creation of a connection to a remote server
*/
interface EelConnectionError : EelNetworkError {
val message: @NlsSafe String
val message: String
/**
* Returned when the remote host cannot create an object of a socket.

View File

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="kotlin-stdlib" level="project" />
<orderEntry type="library" name="jetbrains-annotations" level="project" />
<orderEntry type="library" name="kotlinx-coroutines-core" level="project" />
<orderEntry type="module" module-name="intellij.platform.util.base" />
<orderEntry type="module" module-name="intellij.platform.extensions" />
<orderEntry type="module" module-name="intellij.platform.util" />
<orderEntry type="module" module-name="intellij.platform.eel" />
</component>
</module>

View File

@@ -0,0 +1,20 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.platform.eel.provider
import com.intellij.openapi.extensions.ExtensionPointName
import com.intellij.platform.eel.EelApi
import org.jetbrains.annotations.ApiStatus
import java.nio.file.Path
import kotlin.collections.firstNotNullOfOrNull
suspend fun Path.getEelApi(): EelApi =
EP_NAME.extensionList.firstNotNullOfOrNull { it.getEelApi(this) } ?: LocalEelApi()
@ApiStatus.Internal
interface EelProvider {
suspend fun getEelApi(path: Path): EelApi?
}
private val EP_NAME = ExtensionPointName<EelProvider>("com.intellij.eelProvider")
fun LocalEelApi(): EelApi = TODO()

View File

@@ -0,0 +1,8 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
/**
* EEL API provider
*/
@ApiStatus.Internal
package com.intellij.platform.eel.provider;
import org.jetbrains.annotations.ApiStatus;

View File

@@ -145,5 +145,6 @@
<orderEntry type="module" module-name="intellij.platform.jbr" />
<orderEntry type="module" module-name="intellij.platform.ui.jcef" />
<orderEntry type="module" module-name="fleet.util.core" />
<orderEntry type="module" module-name="intellij.platform.eel.provider" />
</component>
</module>

View File

@@ -6,12 +6,16 @@ import com.intellij.execution.wsl.WslDistributionManager
import com.intellij.execution.wsl.WslIjentManager
import com.intellij.execution.wsl.ijent.nio.IjentWslNioFileSystem
import com.intellij.execution.wsl.ijent.nio.IjentWslNioFileSystemProvider
import com.intellij.openapi.components.serviceAsync
import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.diagnostic.logger
import com.intellij.platform.core.nio.fs.MultiRoutingFileSystemProvider
import com.intellij.platform.eel.EelApi
import com.intellij.platform.eel.provider.EelProvider
import com.intellij.platform.ijent.community.impl.IjentFailSafeFileSystemPosixApi
import com.intellij.platform.ijent.community.impl.nio.IjentNioFileSystemProvider
import com.intellij.platform.ijent.community.impl.nio.telemetry.TracingFileSystemProvider
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.forEachGuaranteed
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
@@ -22,9 +26,11 @@ import org.jetbrains.annotations.VisibleForTesting
import java.net.URI
import java.nio.file.FileSystem
import java.nio.file.FileSystemAlreadyExistsException
import java.nio.file.Path
import java.nio.file.spi.FileSystemProvider
import java.util.concurrent.ConcurrentHashMap
import java.util.function.BiConsumer
import kotlin.io.path.isSameFileAs
@ApiStatus.Internal
@VisibleForTesting
@@ -33,10 +39,25 @@ class IjentWslNioFsToggleStrategy(
private val coroutineScope: CoroutineScope,
) {
private val ownFileSystems = OwnFileSystems(multiRoutingFileSystemProvider)
private val enabledInDistros: MutableSet<WSLDistribution> = ContainerUtil.newConcurrentSet()
init {
coroutineScope.coroutineContext.job.invokeOnCompletion {
unregisterAll()
enabledInDistros.clear()
}
}
// TODO Move to ijent.impl?
internal class WslEelProvider : EelProvider {
override suspend fun getEelApi(path: Path): EelApi? {
val service = serviceAsync<IjentWslNioFsToggleStrategy>()
for (distro in service.enabledInDistros) {
if (distro.uncRootPath.isSameFileAs(path.root)) {
return WslIjentManager.getInstance().getIjentApi(distro, null, rootUser = false)
}
}
return null
}
}
@@ -69,10 +90,12 @@ class IjentWslNioFsToggleStrategy(
}
private suspend fun handleWslDistributionAddition(distro: WSLDistribution) {
enabledInDistros += distro
switchToIjentFs(distro)
}
private fun handleWslDistributionDeletion(distro: WSLDistribution) {
enabledInDistros -= distro
ownFileSystems.compute(distro) { _, ownFs, actualFs ->
if (ownFs == actualFs) {
LOG.info("Unregistering a custom filesystem $actualFs from a removed WSL distribution $distro")

View File

@@ -19,6 +19,8 @@
<with attribute="instance" implements="com.intellij.openapi.options.Configurable"/>
</extensionPoint>
<extensionPoint name="eelProvider" interface="com.intellij.platform.eel.provider.EelProvider" dynamic="true"/>
<extensionPoint name="applicationConfigurable"
dynamic="true"
beanClass="com.intellij.openapi.options.ConfigurableEP">

View File

@@ -130,6 +130,8 @@
<applicationService serviceInterface="com.intellij.openapi.keymap.KeymapManager"
serviceImplementation="com.intellij.openapi.keymap.impl.KeymapManagerImpl"/>
<eelProvider implementation="com.intellij.execution.wsl.ijent.nio.toggle.IjentWslNioFsToggleStrategy$WslEelProvider"/>
<applicationService serviceInterface="com.intellij.openapi.project.ProjectManager"
serviceImplementation="com.intellij.openapi.project.impl.ProjectManagerImpl"
testServiceImplementation="com.intellij.project.TestProjectManager"/>

View File

@@ -102,5 +102,6 @@
<orderEntry type="module" module-name="intellij.platform.ui.jcef" scope="TEST" />
<orderEntry type="module" module-name="intellij.platform.eel" scope="TEST" />
<orderEntry type="library" scope="TEST" name="rhino" level="project" />
<orderEntry type="module" module-name="intellij.platform.eel.provider" />
</component>
</module>