From 4c92dc7d4573ada7f6ca5c8ea7e1ffceccf706e5 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Tue, 10 Oct 2017 00:19:57 +0200 Subject: [PATCH] Fix potential leak of ScanContent in user data of library file Todo index isn't calculated for library files anymore, but BaseFilterLexerUtil adds ScanContent to the user data only if it will be needed for both Id and Todo indexes and it is expected to be removed by the second. --- .../psi/impl/cache/impl/todo/TodoIndex.java | 26 +++---------------- .../impl/cache/impl/BaseFilterLexerUtil.java | 3 ++- .../impl/cache/impl/todo/TodoIndexers.java | 24 +++++++++++++++++ 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java index c1cdd5a5a7c4..6343123abc10 100644 --- a/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java +++ b/platform/editor-ui-ex/src/com/intellij/psi/impl/cache/impl/todo/TodoIndex.java @@ -23,9 +23,6 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.impl.CustomSyntaxTableFileType; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManager; -import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.impl.cache.impl.id.PlatformIdTableBuilding; @@ -50,7 +47,7 @@ import java.util.Map; /** * @author Eugene Zhuravlev - * Date: Jan 20, 2008 + * Date: Jan 20, 2008 */ public class TodoIndex extends FileBasedIndexExtension { @NonNls public static final ID NAME = ID.create("TodoIndex"); @@ -102,7 +99,7 @@ public class TodoIndex extends FileBasedIndexExtension private final DataIndexer myIndexer = new DataIndexer() { @Override @NotNull - public Map map(@NotNull final FileContent inputData) { + public Map map(@NotNull final FileContent inputData) { final VirtualFile file = inputData.getFile(); final DataIndexer indexer = PlatformIdTableBuilding .getTodoIndexer(inputData.getFileType(), file); @@ -114,13 +111,7 @@ public class TodoIndex extends FileBasedIndexExtension }; protected final FileBasedIndex.InputFilter myInputFilter = file -> { - if (!file.isInLocalFileSystem()) { - return false; // do not index TODOs in library sources - } - - if(!isInContentOfAnyProject(file)) { - return false; - } + if (!TodoIndexers.needsTodoIndex(file)) return false; final FileType fileType = file.getFileType(); @@ -135,22 +126,13 @@ public class TodoIndex extends FileBasedIndexExtension fileType instanceof CustomSyntaxTableFileType; }; - private static boolean isInContentOfAnyProject(@NotNull VirtualFile file) { - for (Project project : ProjectManager.getInstance().getOpenProjects()) { - if (ProjectFileIndex.getInstance(project).isInContent(file)) { - return true; - } - } - return false; - } - @Override public int getVersion() { int version = 10; FileType[] types = myFileTypeManager.getRegisteredFileTypes(); Arrays.sort(types, (o1, o2) -> Comparing.compare(o1.getName(), o2.getName())); - for(FileType fileType:types) { + for (FileType fileType : types) { DataIndexer indexer = TodoIndexers.INSTANCE.forFileType(fileType); if (indexer == null) continue; diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexerUtil.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexerUtil.java index f6c832841da5..7ff27e290b06 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexerUtil.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/BaseFilterLexerUtil.java @@ -21,6 +21,7 @@ import com.intellij.psi.impl.cache.impl.id.IdIndexEntry; import com.intellij.psi.impl.cache.impl.id.IdTableBuilding; import com.intellij.psi.impl.cache.impl.id.LexingIdIndexer; import com.intellij.psi.impl.cache.impl.todo.TodoIndexEntry; +import com.intellij.psi.impl.cache.impl.todo.TodoIndexers; import com.intellij.psi.search.IndexPattern; import com.intellij.util.indexing.FileContent; import com.intellij.util.indexing.IdDataConsumer; @@ -39,7 +40,7 @@ public class BaseFilterLexerUtil { return data; } - final boolean needTodo = content.getFile().isInLocalFileSystem(); // same as TodoIndex.getFilter().isAcceptable + final boolean needTodo = TodoIndexers.needsTodoIndex(content.getFile()); final boolean needIdIndex = IdTableBuilding.getFileTypeIndexer(content.getFileType()) instanceof LexingIdIndexer; final IdDataConsumer consumer = needIdIndex? new IdDataConsumer():null; diff --git a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java index a90b890532d1..2cc7c3768381 100644 --- a/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java +++ b/platform/indexing-impl/src/com/intellij/psi/impl/cache/impl/todo/TodoIndexers.java @@ -17,8 +17,13 @@ package com.intellij.psi.impl.cache.impl.todo; import com.intellij.openapi.fileTypes.FileTypeExtension; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.indexing.DataIndexer; import com.intellij.util.indexing.FileContent; +import org.jetbrains.annotations.NotNull; /** * @author yole @@ -29,4 +34,23 @@ public class TodoIndexers extends FileTypeExtension