psi file leak

This commit is contained in:
Alexey Kudravtsev
2012-10-26 13:10:20 +04:00
parent 8b64b1b295
commit 57218bb079
5 changed files with 56 additions and 37 deletions
@@ -26,6 +26,7 @@ import com.intellij.execution.runners.ProgramRunner;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@@ -60,6 +61,7 @@ public class DefaultDebugEnvironment implements DebugEnvironment {
mySearchScope = createSearchScope(project, runProfile);
}
@NotNull
public static GlobalSearchScope createSearchScope(Project project, RunProfile runProfile) {
Module[] modules = null;
if (runProfile instanceof ModuleRunProfile) {
@@ -17,6 +17,7 @@ package com.intellij.execution.filters;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
/**
* Created by IntelliJ IDEA.
@@ -26,6 +27,7 @@ import com.intellij.psi.search.GlobalSearchScope;
*/
public interface ExceptionFilterFactory {
ExtensionPointName<ExceptionFilterFactory> EP_NAME = ExtensionPointName.create("com.intellij.exceptionFilter");
Filter create(final GlobalSearchScope searchScope);
@NotNull
Filter create(@NotNull GlobalSearchScope searchScope);
}
@@ -16,6 +16,7 @@
package com.intellij.execution.filters;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
@@ -30,9 +31,10 @@ public class ExceptionFilters {
private ExceptionFilters() {
}
public static List<Filter> getFilters(final GlobalSearchScope searchScope) {
List<Filter> filters = new ArrayList<Filter>();
@NotNull
public static List<Filter> getFilters(@NotNull GlobalSearchScope searchScope) {
ExceptionFilterFactory[] extensions = ExceptionFilterFactory.EP_NAME.getExtensions();
List<Filter> filters = new ArrayList<Filter>(extensions.length);
for (ExceptionFilterFactory extension : extensions) {
filters.add(extension.create(searchScope));
}
@@ -40,6 +40,7 @@ import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.Consumer;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
@@ -57,7 +58,7 @@ public class VcsContentAnnotationExceptionFilter implements Filter, FilterMixin
private final VcsContentAnnotationSettings mySettings;
private Map<VirtualFile,VcsRevisionNumber> myRevNumbersCache;
public VcsContentAnnotationExceptionFilter(GlobalSearchScope scope) {
public VcsContentAnnotationExceptionFilter(@NotNull GlobalSearchScope scope) {
myScope = scope;
myProject = scope.getProject();
mySettings = VcsContentAnnotationSettings.getInstance(myProject);
@@ -30,6 +30,7 @@ import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.awt.*;
@@ -44,8 +45,7 @@ public class ExceptionWorker {
private static final String AT_PREFIX = AT + " ";
private static final String STANDALONE_AT = " " + AT + " ";
private static final TextAttributes HYPERLINK_ATTRIBUTES = EditorColorsManager
.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES);
private static final TextAttributes HYPERLINK_ATTRIBUTES = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES);
private final Project myProject;
private final GlobalSearchScope mySearchScope;
@@ -55,7 +55,7 @@ public class ExceptionWorker {
private String myMethod;
private Trinity<TextRange, TextRange, TextRange> myInfo;
public ExceptionWorker(Project project, final GlobalSearchScope searchScope) {
public ExceptionWorker(@NotNull Project project, @NotNull GlobalSearchScope searchScope) {
myProject = project;
mySearchScope = searchScope;
}
@@ -104,35 +104,7 @@ public class ExceptionWorker {
final int highlightEndOffset = textStartOffset + rparenthIndex;
final VirtualFile virtualFile = myFile.getVirtualFile();
HyperlinkInfo linkInfo = new HyperlinkInfo() {
@Override
public void navigate(Project project) {
VirtualFile currentVirtualFile = null;
AccessToken accessToken = ReadAction.start();
try {
if (!virtualFile.isValid()) return;
PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
if (psiFile != null) {
PsiElement navigationElement = psiFile.getNavigationElement(); // Sources may be downloaded.
if (navigationElement instanceof PsiFile) {
currentVirtualFile = ((PsiFile)navigationElement).getVirtualFile();
}
}
if (currentVirtualFile == null) {
currentVirtualFile = virtualFile;
}
}
finally {
accessToken.finish();
}
new OpenFileHyperlinkInfo(myProject, currentVirtualFile, lineNumber - 1).navigate(project);
}
};
HyperlinkInfo linkInfo = new MyHyperlinkInfo(myProject, virtualFile, lineNumber);
TextAttributes attributes = HYPERLINK_ATTRIBUTES.clone();
if (!ProjectRootManager.getInstance(myProject).getFileIndex().isInContent(virtualFile)) {
@@ -226,4 +198,44 @@ public class ExceptionWorker {
}
return pos;
}
private static class MyHyperlinkInfo implements HyperlinkInfo {
private final VirtualFile myVirtualFile;
private final int myLineNumber;
private final Project myProject;
public MyHyperlinkInfo(@NotNull Project project, @NotNull VirtualFile virtualFile, int lineNumber) {
myProject = project;
myVirtualFile = virtualFile;
myLineNumber = lineNumber;
}
@Override
public void navigate(Project project) {
VirtualFile currentVirtualFile = null;
AccessToken accessToken = ReadAction.start();
try {
if (!myVirtualFile.isValid()) return;
PsiFile psiFile = PsiManager.getInstance(project).findFile(myVirtualFile);
if (psiFile != null) {
PsiElement navigationElement = psiFile.getNavigationElement(); // Sources may be downloaded.
if (navigationElement instanceof PsiFile) {
currentVirtualFile = ((PsiFile)navigationElement).getVirtualFile();
}
}
if (currentVirtualFile == null) {
currentVirtualFile = myVirtualFile;
}
}
finally {
accessToken.finish();
}
new OpenFileHyperlinkInfo(myProject, currentVirtualFile, myLineNumber - 1).navigate(project);
}
}
}