From 168bcfe0cf205854b7a1f0cb60d74ca3d3d409a4 Mon Sep 17 00:00:00 2001 From: anstarovoyt Date: Tue, 13 Feb 2018 15:41:27 +0300 Subject: [PATCH] platform tests: register fake EP for virtualfilemanager for avoiding coping listeners to the new area We have to it because virtualfilemanagerimpl has non-static KeyedExtensionCollector and the listener is registered every time when the virtualfilemanagerimpl instance is created + minor: avoid non-static and non-final KeyedExtensionCollector in other places --- .../core/CoreApplicationEnvironment.java | 4 ++ .../extensions/impl/ExtensionsAreaImpl.java | 37 +++++++++---------- .../daemon/LineMarkerProviders.java | 2 +- .../codeInsight/TargetElementUtil.java | 2 +- .../editorActions/CodeBlockProviders.java | 2 +- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java index b3c6b9adfdcc..c1d2482b7e3e 100644 --- a/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java +++ b/platform/core-impl/src/com/intellij/core/CoreApplicationEnvironment.java @@ -51,6 +51,7 @@ import com.intellij.psi.meta.MetaDataRegistrar; import com.intellij.psi.stubs.CoreStubTreeLoader; import com.intellij.psi.stubs.StubTreeLoader; import com.intellij.util.Consumer; +import com.intellij.util.KeyedLazyInstanceEP; import com.intellij.util.Processor; import com.intellij.util.graph.GraphAlgorithms; import com.intellij.util.graph.impl.GraphAlgorithmsImpl; @@ -105,6 +106,9 @@ public class CoreApplicationEnvironment { : new VirtualFileSystem[]{myLocalFileSystem, myJarFileSystem}; VirtualFileManagerImpl virtualFileManager = new VirtualFileManagerImpl(fs, myApplication.getMessageBus()); registerComponentInstance(appContainer, VirtualFileManager.class, virtualFileManager); + + //fake EP for cleaning resources after area disposing (otherwise KeyedExtensionCollector listener will be copied to the next area) + registerApplicationExtensionPoint(new ExtensionPointName<>("com.intellij.virtualFileSystem"), KeyedLazyInstanceEP.class); registerApplicationService(EncodingManager.class, new CoreEncodingRegistry()); registerApplicationService(VirtualFilePointerManager.class, createVirtualFilePointerManager()); diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index 7016905ee001..f73dc151f74b 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -66,25 +66,24 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } //this code is required because we have a lot of static extensions e.g. LanguageExtension that are initialized only once //for the extensions AvailabilityListeners will be broken if the initialization happened in "fake" area which doesn't have required EP - //commented because of memory leak in VirtualFileManagerImpl in kotlin - //if (myAvailabilityListeners.size() > 0) { - // for (Map.Entry> entry : myAvailabilityListeners.entrySet()) { - // String key = entry.getKey(); - // if (!processedEPs.contains(key)) { - // boolean wasAdded = false; - // //if listeners are "detached" for any EP we have to transfer them to the new area (otherwise it will affect area searching) - // for (ExtensionPointAvailabilityListener listener : entry.getValue()) { - // if (!newArea.hasAvailabilityListener(key, listener)) { - // newArea.addAvailabilityListener(key, listener); - // wasAdded = true; - // } - // } - // if (wasAdded) { - // processedEPs.add(key); - // } - // } - // } - //} + if (myAvailabilityListeners.size() > 0) { + for (Map.Entry> entry : myAvailabilityListeners.entrySet()) { + String key = entry.getKey(); + if (!processedEPs.contains(key)) { + boolean wasAdded = false; + //if listeners are "detached" for any EP we have to transfer them to the new area (otherwise it will affect area searching) + for (ExtensionPointAvailabilityListener listener : entry.getValue()) { + if (!newArea.hasAvailabilityListener(key, listener)) { + newArea.addAvailabilityListener(key, listener); + wasAdded = true; + } + } + if (wasAdded) { + processedEPs.add(key); + } + } + } + } for (ExtensionPointImpl point : newArea.myExtensionPoints.values()) { if (!processedEPs.contains(point.getName())) { diff --git a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProviders.java b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProviders.java index c7b42f648333..3c551a89014d 100644 --- a/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProviders.java +++ b/platform/lang-api/src/com/intellij/codeInsight/daemon/LineMarkerProviders.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.NonNls; * @author Konstantin Bulenkov */ public class LineMarkerProviders extends LanguageExtension { - public static LineMarkerProviders INSTANCE = new LineMarkerProviders(); + public static final LineMarkerProviders INSTANCE = new LineMarkerProviders(); @NonNls public static final String EP_NAME = "com.intellij.codeInsight.lineMarkerProvider"; private LineMarkerProviders() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtil.java index 91a434700f65..19d7b010345c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/TargetElementUtil.java @@ -450,7 +450,7 @@ public class TargetElementUtil extends TargetElementUtilBase { return PsiSearchHelper.SERVICE.getInstance(element.getProject()).getUseScope(file != null ? file : element); } - protected final LanguageExtension targetElementEvaluator = + protected static final LanguageExtension targetElementEvaluator = new LanguageExtension<>("com.intellij.targetElementEvaluator"); @Nullable private TargetElementEvaluatorEx getElementEvaluatorsEx(@NotNull Language language) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CodeBlockProviders.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CodeBlockProviders.java index af8b742a93cf..98d375a6f1d7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CodeBlockProviders.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/CodeBlockProviders.java @@ -21,7 +21,7 @@ import com.intellij.lang.LanguageExtension; * @author yole */ public class CodeBlockProviders extends LanguageExtension { - public static CodeBlockProviders INSTANCE = new CodeBlockProviders(); + public static final CodeBlockProviders INSTANCE = new CodeBlockProviders(); private CodeBlockProviders() { super("com.intellij.codeBlockProvider");