From 2eefab41fdbdc1384d9d09825bbd90515bc6c94e Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Wed, 18 Mar 2009 20:03:18 +0300 Subject: [PATCH] fix for memory leaks in tests --- .../lang/folding/CompositeFoldingBuilder.java | 56 +++++++++++++++------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/lang-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java b/lang-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java index 0a3ea4ea1f..74988a3c25 100644 --- a/lang-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java +++ b/lang-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java @@ -17,7 +17,10 @@ package com.intellij.lang.folding; import com.intellij.lang.ASTNode; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -35,21 +38,35 @@ import java.util.*; */ class CompositeFoldingBuilder implements FoldingBuilder { private final List myBuilders; - private final Map> foldings = new HashMap>(); - //private final DocumentListener updater = new Updater(); - //TODO: think about old links + private final Map> foldings = new HashMap>(); CompositeFoldingBuilder(List builders) { myBuilders = builders; + //MessageBusConnection connection = ApplicationManager.getApplication().getMessageBus().connect(); + //connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() { + // @Override + // public void fileClosed(FileEditorManager source, VirtualFile file) { + // synchronized (foldings) { + // foldings.remove(file); + // } + // } + //}); } public FoldingDescriptor[] buildFoldRegions(ASTNode node, Document document) { - //document.addDocumentListener(updater); - List descriptors = new ArrayList(); - Map builders = foldings.get(document); + final PsiElement psi = node.getPsi(); + if (psi == null) return FoldingDescriptor.EMPTY; + + final PsiFile file = PsiDocumentManager.getInstance(psi.getProject()).getPsiFile(document); + final VirtualFile vf; + if (file == null || (vf = file.getVirtualFile()) == null) return FoldingDescriptor.EMPTY; + + final List descriptors = new ArrayList(); + Map builders; + builders = foldings.get(vf); if (builders == null) { builders = new HashMap(); - foldings.put(document, builders); + foldings.put(vf, builders); } for (FoldingBuilder builder : myBuilders) { @@ -61,6 +78,18 @@ class CompositeFoldingBuilder implements FoldingBuilder { } } } + final FileEditorManager editorManager = FileEditorManager.getInstance(psi.getProject()); + + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + for (VirtualFile virtualFile : new HashSet(foldings.keySet())) { + if (!editorManager.isFileOpen(virtualFile)) { + foldings.remove(virtualFile); + } + } + } + }); + return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); } @@ -75,10 +104,10 @@ class CompositeFoldingBuilder implements FoldingBuilder { if (psi == null) return null; final PsiFile file = psi.getContainingFile(); - final Document document = file == null ? null : PsiDocumentManager.getInstance(psi.getProject()).getDocument(file); + final VirtualFile vf = file == null ? null : file.getVirtualFile(); final Map builders; - if (document == null || (builders = foldings.get(document)) == null) return null; + if (vf == null || (builders = foldings.get(vf)) == null) return null; return builders.get(node); } @@ -87,13 +116,4 @@ class CompositeFoldingBuilder implements FoldingBuilder { final FoldingBuilder builder = findBuilderByASTNode(node); return builder == null ? false : builder.isCollapsedByDefault(node); } - - //class Updater implements DocumentListener { - // public void beforeDocumentChange(DocumentEvent event) { - // foldings.remove(event.getDocument()); - // } - // - // public void documentChanged(DocumentEvent event) { - // } - //} } -- 2.11.4.GIT