mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-14 18:05:27 +07:00
[eel] introduce EelProvider
GitOrigin-RevId: 5016deac8fd138d9fb1fb6ab47d4bd7463053de1
This commit is contained in:
committed by
intellij-monorepo-bot
parent
3eace12483
commit
0ffa5e48a0
1
.idea/modules.xml
generated
1
.idea/modules.xml
generated
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
13
platform/eel/src/com/intellij/platform/eel/EelFsApi.kt
Normal file
13
platform/eel/src/com/intellij/platform/eel/EelFsApi.kt
Normal 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
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
0
platform/eelProvider/api-dump.txt
Normal file
0
platform/eelProvider/api-dump.txt
Normal file
18
platform/eelProvider/intellij.platform.eel.provider.iml
Normal file
18
platform/eelProvider/intellij.platform.eel.provider.iml
Normal 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>
|
||||
@@ -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()
|
||||
@@ -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;
|
||||
@@ -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>
|
||||
@@ -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")
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user