diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java index a4a26f9f3f5e..ee05766fa04e 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaFileManager.java @@ -18,6 +18,7 @@ package com.intellij.core; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.roots.PackageIndex; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem; import com.intellij.openapi.vfs.local.CoreLocalFileSystem; @@ -30,8 +31,10 @@ import com.intellij.util.Query; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * @author yole @@ -41,8 +44,7 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager private final CoreLocalFileSystem myLocalFileSystem; private final CoreJarFileSystem myJarFileSystem; - private final List myClasspath = new ArrayList(); - private VirtualFile[] myClasspathRoots = null; + private final List myClasspath = new ArrayList(); private final PsiManager myPsiManager; @@ -52,33 +54,8 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager myJarFileSystem = jarFileSystem; } - private VirtualFile[] roots() { - VirtualFile[] answer = myClasspathRoots; - - if (answer == null) { - ArrayList answerList = new ArrayList(myClasspath.size()); - for (File root : myClasspath) { - VirtualFile rootVfs = calcRoot(root); - if (rootVfs != null) { - answerList.add(rootVfs); - } - } - - answer = answerList.toArray(new VirtualFile[answerList.size()]); - myClasspathRoots = answer; - } - - return answer; - } - - @Nullable - private VirtualFile calcRoot(File root) { - if (root.isFile()) { - return myJarFileSystem.findFileByPath(root.getPath() + "!/"); - } - else { - return myLocalFileSystem.findFileByPath(root.getPath()); - } + private List roots() { + return myClasspath; } @Override @@ -104,10 +81,10 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager @Nullable public PsiPackage getPackage(PsiDirectory dir) { - final File ioFile = new File(dir.getVirtualFile().getPath()); - for (File root : myClasspath) { - if (FileUtil.isAncestor(root, ioFile, false)) { - final String relativePath = FileUtil.getRelativePath(root.getPath(), ioFile.getPath(), '.'); + final VirtualFile file = dir.getVirtualFile(); + for (VirtualFile root : myClasspath) { + if (VfsUtilCore.isAncestor(root, file, false)) { + final String relativePath = FileUtil.getRelativePath(root.getPath(), file.getPath(), '.'); return new PsiPackageImpl(myPsiManager, relativePath); } } @@ -223,8 +200,7 @@ public class CoreJavaFileManager extends PackageIndex implements JavaFileManager public void initialize() { } - public void addToClasspath(File path) { - myClasspath.add(path); - myClasspathRoots = null; + public void addToClasspath(VirtualFile root) { + myClasspath.add(root); } } diff --git a/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java b/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java index 52889658c3e3..86d73bf6ecad 100644 --- a/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java +++ b/java/java-psi-impl/src/com/intellij/core/JavaCoreProjectEnvironment.java @@ -30,6 +30,7 @@ import com.intellij.psi.impl.JavaPsiImplementationHelper; import com.intellij.psi.impl.PsiElementFactoryImpl; import com.intellij.psi.impl.source.resolve.JavaResolveCache; import com.intellij.psi.impl.source.resolve.PsiResolveHelperImpl; +import org.jetbrains.annotations.NotNull; import java.io.File; @@ -61,18 +62,21 @@ public class JavaCoreProjectEnvironment extends CoreProjectEnvironment { return new CoreJavaFileManager(myPsiManager, getEnvironment().getLocalFileSystem(), getEnvironment().getJarFileSystem()); } - public void addToClasspath(File path) { - final VirtualFile root = path.isFile() - ? getEnvironment().getJarFileSystem().findFileByPath(path + "!/") - : getEnvironment().getLocalFileSystem().findFileByPath(path.getPath()); + public void addJarToClassPath (File path) { + assert path.isFile(); - if (root != null) { - myFileManager.addToClasspath(path); - myFileIndexFacade.addLibraryRoot(root); - } - else { + final VirtualFile root = getEnvironment().getJarFileSystem().findFileByPath(path + "!/"); + if (root == null) { throw new IllegalArgumentException("trying to add non-existing file to classpath: " + path); } + + addSourcesToClasspath(root); + } + + public void addSourcesToClasspath(@NotNull VirtualFile root) { + assert root.isDirectory(); + myFileManager.addToClasspath(root); + myFileIndexFacade.addLibraryRoot(root); } } diff --git a/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java index 832a2265c53a..26b584b105fc 100644 --- a/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreProjectEnvironment.java @@ -24,7 +24,6 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.roots.FileIndexFacade; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.PsiManager; import com.intellij.psi.impl.*; @@ -78,10 +77,6 @@ public class CoreProjectEnvironment { CoreApplicationEnvironment.registerExtensionPoint(Extensions.getArea(myProject), extensionPointName, aClass); } - public void addLibraryRoot(VirtualFile file) { - myFileIndexFacade.addLibraryRoot(file); - } - public void registerProjectComponent(final Class interfaceClass, final T implementation) { CoreApplicationEnvironment.registerComponentInstance(myProject.getPicoContainer(), interfaceClass, implementation); }