diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewExtension.java b/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewExtension.java index cb99fe9f87c5..f92690bacb90 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewExtension.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewExtension.java @@ -16,10 +16,16 @@ package com.intellij.ide.structureView; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.Nullable; public interface StructureViewExtension { + + ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.lang.structureViewExtension"); + + Class getType(); + StructureViewTreeElement[] getChildren(PsiElement parent); @Nullable Object getCurrentEditorElement(Editor editor, PsiElement parent); diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewFactoryEx.java b/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewFactoryEx.java index f75cd4e1014a..dd371e72ed63 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewFactoryEx.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/StructureViewFactoryEx.java @@ -30,9 +30,6 @@ public abstract class StructureViewFactoryEx extends StructureViewFactory { @Nullable public abstract StructureViewWrapper getStructureViewWrapper(); - public abstract void registerExtension(Class type, StructureViewExtension extension); - public abstract void unregisterExtension(Class type, StructureViewExtension extension); - public abstract Collection getAllExtensions(Class type); public abstract void setActiveAction(final String name, final boolean state); diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/impl/StructureViewFactoryImpl.java b/platform/lang-impl/src/com/intellij/ide/structureView/impl/StructureViewFactoryImpl.java index 554d10bda53a..86a7ae19162d 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/impl/StructureViewFactoryImpl.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/impl/StructureViewFactoryImpl.java @@ -22,16 +22,19 @@ import com.intellij.ide.structureView.newStructureView.StructureViewComponent; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.MultiValuesMap; +import com.intellij.openapi.util.NotNullLazyValue; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.ToolWindow; import com.intellij.psi.PsiElement; import com.intellij.ui.content.Content; import com.intellij.ui.content.ContentFactory; import com.intellij.util.ReflectionCache; +import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Collection; @@ -62,7 +65,19 @@ public final class StructureViewFactoryImpl extends StructureViewFactoryEx imple private State myState = new State(); private Runnable myRunWhenInitialized = null; - private final MultiValuesMap, StructureViewExtension> myExtensions = new MultiValuesMap, StructureViewExtension>(); + private static final NotNullLazyValue, StructureViewExtension>> myExtensions = new NotNullLazyValue, StructureViewExtension>>() { + @NotNull + @Override + protected MultiValuesMap, StructureViewExtension> compute() { + MultiValuesMap, StructureViewExtension> map = + new MultiValuesMap, StructureViewExtension>(); + StructureViewExtension[] extensions = Extensions.getExtensions(StructureViewExtension.EXTENSION_POINT_NAME); + for (StructureViewExtension extension : extensions) { + map.put(extension.getType(), extension); + } + return map; + } + }; private final MultiValuesMap, StructureViewExtension> myImplExtensions = new MultiValuesMap, StructureViewExtension>(); public StructureViewFactoryImpl(Project project) { @@ -93,22 +108,13 @@ public final class StructureViewFactoryImpl extends StructureViewFactoryEx imple } } - public void registerExtension(Class type, StructureViewExtension extension) { - myExtensions.put(type, extension); - myImplExtensions.clear(); - } - - public void unregisterExtension(Class type, StructureViewExtension extension) { - myExtensions.remove(type, extension); - myImplExtensions.clear(); - } - public Collection getAllExtensions(Class type) { Collection result = myImplExtensions.get(type); if (result == null) { - for (Class registeredType : myExtensions.keySet()) { + MultiValuesMap, StructureViewExtension> map = myExtensions.getValue(); + for (Class registeredType : map.keySet()) { if (ReflectionCache.isAssignable(registeredType, type)) { - final Collection extensions = myExtensions.get(registeredType); + final Collection extensions = map.get(registeredType); for (StructureViewExtension extension : extensions) { myImplExtensions.put(type, extension); } diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index 0c05b1250b0c..649ba91e14db 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -109,6 +109,8 @@ beanClass="com.intellij.lang.LanguageExtensionPoint"/> +