From 57218bb0795c226894f0cff7a5d1458b74a9b445 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 26 Oct 2012 13:01:30 +0400 Subject: [PATCH] psi file leak --- .../debugger/DefaultDebugEnvironment.java | 2 + .../filters/ExceptionFilterFactory.java | 6 +- .../execution/filters/ExceptionFilters.java | 6 +- .../VcsContentAnnotationExceptionFilter.java | 3 +- .../execution/filters/ExceptionWorker.java | 76 +++++++++++-------- 5 files changed, 56 insertions(+), 37 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java index 805cfba2b772..dc2e1afdc547 100644 --- a/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java +++ b/java/debugger/impl/src/com/intellij/debugger/DefaultDebugEnvironment.java @@ -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) { diff --git a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilterFactory.java b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilterFactory.java index fd57dfe7cf89..5fb91ddee70d 100644 --- a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilterFactory.java +++ b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilterFactory.java @@ -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 EP_NAME = ExtensionPointName.create("com.intellij.exceptionFilter"); - - Filter create(final GlobalSearchScope searchScope); + + @NotNull + Filter create(@NotNull GlobalSearchScope searchScope); } diff --git a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilters.java b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilters.java index 2c79ed095130..1c3bd1ca4e13 100644 --- a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilters.java +++ b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilters.java @@ -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 getFilters(final GlobalSearchScope searchScope) { - List filters = new ArrayList(); + @NotNull + public static List getFilters(@NotNull GlobalSearchScope searchScope) { ExceptionFilterFactory[] extensions = ExceptionFilterFactory.EP_NAME.getExtensions(); + List filters = new ArrayList(extensions.length); for (ExceptionFilterFactory extension : extensions) { filters.add(extension.create(searchScope)); } diff --git a/java/java-impl/src/com/intellij/openapi/vcs/contentAnnotation/VcsContentAnnotationExceptionFilter.java b/java/java-impl/src/com/intellij/openapi/vcs/contentAnnotation/VcsContentAnnotationExceptionFilter.java index 9a49434b2ce2..b52273b0ecbe 100644 --- a/java/java-impl/src/com/intellij/openapi/vcs/contentAnnotation/VcsContentAnnotationExceptionFilter.java +++ b/java/java-impl/src/com/intellij/openapi/vcs/contentAnnotation/VcsContentAnnotationExceptionFilter.java @@ -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 myRevNumbersCache; - public VcsContentAnnotationExceptionFilter(GlobalSearchScope scope) { + public VcsContentAnnotationExceptionFilter(@NotNull GlobalSearchScope scope) { myScope = scope; myProject = scope.getProject(); mySettings = VcsContentAnnotationSettings.getInstance(myProject); diff --git a/java/openapi/src/com/intellij/execution/filters/ExceptionWorker.java b/java/openapi/src/com/intellij/execution/filters/ExceptionWorker.java index 803e69d6bcfa..16c129f53e98 100644 --- a/java/openapi/src/com/intellij/execution/filters/ExceptionWorker.java +++ b/java/openapi/src/com/intellij/execution/filters/ExceptionWorker.java @@ -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 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); + } + } }