diff --git a/platform/core-api/src/com/intellij/openapi/vfs/LocalFileProvider.java b/platform/core-api/src/com/intellij/openapi/vfs/LocalFileProvider.java index 13ec237e68d1..fb2378ce36bf 100644 --- a/platform/core-api/src/com/intellij/openapi/vfs/LocalFileProvider.java +++ b/platform/core-api/src/com/intellij/openapi/vfs/LocalFileProvider.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.vfs; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -25,4 +26,7 @@ public interface LocalFileProvider{ @Nullable VirtualFile getLocalVirtualFileFor(@Nullable VirtualFile entryVFile); + + @Nullable + VirtualFile findLocalVirtualFileByPath(@NotNull String path); } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/ex/VirtualFileManagerEx.java b/platform/core-impl/src/com/intellij/openapi/vfs/ex/VirtualFileManagerEx.java index c373cd784842..df7cc6b854ed 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/ex/VirtualFileManagerEx.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/ex/VirtualFileManagerEx.java @@ -15,10 +15,15 @@ */ package com.intellij.openapi.vfs.ex; +import com.intellij.openapi.vfs.LocalFileProvider; import com.intellij.openapi.vfs.VirtualFileManager; +import java.util.List; + public abstract class VirtualFileManagerEx extends VirtualFileManager { public abstract void fireBeforeRefreshStart(boolean asynchronous); public abstract void fireAfterRefreshFinish(boolean asynchronous); + + public abstract List getLocalFileProviders(); } diff --git a/platform/core-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java index d51b64a3738d..65ce004775bd 100644 --- a/platform/core-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/vfs/impl/VirtualFileManagerImpl.java @@ -250,6 +250,11 @@ public class VirtualFileManagerImpl extends VirtualFileManagerEx { return 0; } + @Override + public List getLocalFileProviders(){ + return ContainerUtil.findAll(myPhysicalFileSystems, LocalFileProvider.class); + } + private static class LoggingListener implements VirtualFileListener { @Override public void propertyChanged(VirtualFilePropertyEvent event) { diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java index 275a53f2b7ba..dd502ef691d9 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindInProjectUtil.java @@ -49,6 +49,7 @@ import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.util.text.TrigramBuilder; import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.ex.VirtualFileManagerEx; import com.intellij.openapi.wm.ToolWindowId; import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.*; @@ -136,10 +137,12 @@ public class FindInProjectUtil { String path = directoryName.replace(File.separatorChar, '/'); VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByPath(path); if (virtualFile == null || !virtualFile.isDirectory()) { - if (!path.contains(JarFileSystem.JAR_SEPARATOR)) { - path += JarFileSystem.JAR_SEPARATOR; + for (LocalFileProvider provider : ((VirtualFileManagerEx)VirtualFileManager.getInstance()).getLocalFileProviders()) { + virtualFile = provider.findLocalVirtualFileByPath(path); + if (virtualFile != null && virtualFile.isDirectory()) { + break; + } } - virtualFile = JarFileSystem.getInstance().findFileByPath(path); } return virtualFile == null ? null : psiManager.findDirectory(virtualFile); } diff --git a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java index 8f5e4cecd378..e1eadfccbe81 100644 --- a/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java +++ b/platform/platform-api/src/com/intellij/openapi/vfs/JarFileSystem.java @@ -47,4 +47,13 @@ public abstract class JarFileSystem extends NewVirtualFileSystem implements JarC public VirtualFile getLocalVirtualFileFor(@Nullable VirtualFile entryVFile) { return getVirtualFileForJar(entryVFile); } + + @Nullable + @Override + public VirtualFile findLocalVirtualFileByPath(@NotNull String path) { + if (!path.contains(JAR_SEPARATOR)) { + path += JAR_SEPARATOR; + } + return findFileByPath(path); + } } \ No newline at end of file