EA-43515 - IAE: PsiManagerImpl.findFile

This commit is contained in:
Dmitry Avdeev
2013-02-27 15:12:11 +04:00
parent bc39ba7f08
commit 66a91b4180
3 changed files with 37 additions and 32 deletions
@@ -23,6 +23,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -34,9 +35,9 @@ public abstract class FileIncludeManager {
return ServiceManager.getService(project, FileIncludeManager.class);
}
public abstract VirtualFile[] getIncludedFiles(VirtualFile file, boolean compileTimeOnly);
public abstract VirtualFile[] getIncludedFiles(@NotNull VirtualFile file, boolean compileTimeOnly);
public abstract VirtualFile[] getIncludingFiles(VirtualFile file, boolean compileTimeOnly);
public abstract VirtualFile[] getIncludingFiles(@NotNull VirtualFile file, boolean compileTimeOnly);
public abstract void processIncludingFiles(PsiFile context, Processor<Pair<VirtualFile, FileIncludeInfo>> processor);
@@ -21,10 +21,7 @@ import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.VirtualFileWithId;
import com.intellij.openapi.vfs.*;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiFileSystemItem;
@@ -38,6 +35,7 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import com.intellij.util.containers.HashMap;
import com.intellij.util.containers.MultiMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -136,7 +134,7 @@ public class FileIncludeManagerImpl extends FileIncludeManager {
}
@Override
public VirtualFile[] getIncludedFiles(VirtualFile file, boolean compileTimeOnly) {
public VirtualFile[] getIncludedFiles(@NotNull VirtualFile file, boolean compileTimeOnly) {
if (file instanceof VirtualFileWithId) {
return myIncludedHolder.getAllFiles(file, compileTimeOnly);
}
@@ -146,7 +144,7 @@ public class FileIncludeManagerImpl extends FileIncludeManager {
}
@Override
public VirtualFile[] getIncludingFiles(VirtualFile file, boolean compileTimeOnly) {
public VirtualFile[] getIncludingFiles(@NotNull VirtualFile file, boolean compileTimeOnly) {
return myIncludingHolder.getAllFiles(file, compileTimeOnly);
}
@@ -204,13 +202,13 @@ public class FileIncludeManagerImpl extends FileIncludeManager {
RUNTIME_KEY = Key.create(runtimeKey);
}
public VirtualFile[] getAllFiles(VirtualFile file, boolean compileTimeOnly) {
private VirtualFile[] getAllFiles(@NotNull VirtualFile file, boolean compileTimeOnly) {
Set<VirtualFile> result = new HashSet<VirtualFile>();
getFilesRecursively(file, compileTimeOnly, result);
return VfsUtil.toVirtualFileArray(result);
return VfsUtilCore.toVirtualFileArray(result);
}
private void getFilesRecursively(VirtualFile file, boolean compileTimeOnly, Set<VirtualFile> result) {
private void getFilesRecursively(@NotNull VirtualFile file, boolean compileTimeOnly, Set<VirtualFile> result) {
if (result.contains(file)) return;
PsiFile psiFile = myPsiManager.findFile(file);
if (psiFile == null) return;
@@ -23,20 +23,23 @@ import org.jetbrains.annotations.NotNull;
*/
public class RelaxIncludeIndex {
public static boolean processForwardDependencies(XmlFile file, final PsiElementProcessor<XmlFile> processor) {
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) {
return processor.execute(file);
}
final Project project = file.getProject();
final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludedFiles(file.getVirtualFile(), true);
final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludedFiles(virtualFile, true);
return processRelatedFiles(file, files, processor);
}
public static boolean processBackwardDependencies(@NotNull XmlFile file, PsiElementProcessor<XmlFile> processor) {
return processBackwardDependencies((PsiFile)file, processor);
}
private static boolean processBackwardDependencies(@NotNull PsiFile file, PsiElementProcessor<XmlFile> processor) {
VirtualFile virtualFile = file.getVirtualFile();
if (virtualFile == null) {
return processor.execute(file);
}
final Project project = file.getProject();
final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludingFiles(file.getVirtualFile(), true);
final VirtualFile[] files = FileIncludeManager.getManager(project).getIncludingFiles(virtualFile, true);
return processRelatedFiles(file, files, processor);
}
@@ -51,25 +54,28 @@ public class RelaxIncludeIndex {
});
for (final PsiFile psiFile : psiFiles) {
final FileType type = file.getFileType();
if (type == XmlFileType.INSTANCE && isRngFile(psiFile)) {
if (!processor.execute((XmlFile)psiFile)) {
return false;
}
} else if (type == RncFileType.getInstance()) {
if (!processor.execute((XmlFile)psiFile)) {
return false;
}
if (!processFile(psiFile, processor)) {
return false;
}
}
return true;
}
private static boolean processFile(PsiFile psiFile, PsiElementProcessor<XmlFile> processor) {
final FileType type = psiFile.getFileType();
if (type == XmlFileType.INSTANCE && isRngFile(psiFile)) {
if (!processor.execute((XmlFile)psiFile)) {
return false;
}
} else if (type == RncFileType.getInstance()) {
if (!processor.execute((XmlFile)psiFile)) {
return false;
}
}
return true;
}
static boolean isRngFile(PsiFile psiFile) {
try {
return DomManager.getDomManager(psiFile.getProject()).getFileElement((XmlFile)psiFile, RngGrammar.class) != null;
} catch (ClassCastException e) {
return false; // fileType == XML && !instanceof XmlFile
}
return psiFile instanceof XmlFile && DomManager.getDomManager(psiFile.getProject()).getFileElement((XmlFile)psiFile, RngGrammar.class) != null;
}
}