mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
EA-43515 - IAE: PsiManagerImpl.findFile
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user