implementation of getVirtualFileForJar() that doesn't depend on specific VirtualFileS...
authorDmitry Jemerov <yole@jetbrains.com>
Fri, 23 Sep 2011 11:33:52 +0000 (13:33 +0200)
committerDmitry Jemerov <yole@jetbrains.com>
Fri, 23 Sep 2011 12:27:06 +0000 (14:27 +0200)
java/openapi/src/com/intellij/psi/util/PsiUtil.java
platform/core-api/src/com/intellij/openapi/vfs/VfsUtilCore.java

index cd7566de5f252d9c8fb120aab490358a1265d9a0..cf82697d098a38e8e68581db2cb218786719f336 100644 (file)
@@ -20,7 +20,7 @@ import com.intellij.openapi.roots.LanguageLevelProjectExtension;
 import com.intellij.openapi.util.Comparing;
 import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.TextRange;
-import com.intellij.openapi.vfs.JarFileSystem;
+import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
@@ -662,8 +662,8 @@ public final class PsiUtil extends PsiUtilCore {
   @Nullable
   public static VirtualFile getJarFile(PsiElement candidate) {
     VirtualFile file = candidate.getContainingFile().getVirtualFile();
-    if (file != null && file.getFileSystem() instanceof JarFileSystem) {
-      return JarFileSystem.getInstance().getVirtualFileForJar(file);
+    if (file != null && file.getFileSystem().getProtocol().equals("jar")) {
+      return VfsUtilCore.getVirtualFileForJar(file);
     }
     return file;
   }
index b5fadb731fbe77d15541fa492b89ee6dc67245da..a13c5e7dbd464524f392ba0580fdcf38ba4b26d4 100644 (file)
@@ -80,4 +80,15 @@ public class VfsUtilCore {
     }
     return new String(chars);
   }
+
+  @Nullable
+  public static VirtualFile getVirtualFileForJar(@Nullable VirtualFile entryVFile) {
+    if (entryVFile == null) return null;
+    final String path = entryVFile.getPath();
+    final int separatorIndex = path.indexOf("!/");
+    if (separatorIndex < 0) return null;
+
+    String localPath = path.substring(0, separatorIndex);
+    return VirtualFileManager.getInstance().findFileByUrl("file://" + localPath);
+  }
 }