From 0a40121d092c09bf1ec4164dd745fe071577a989 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 27 May 2015 20:05:30 +0300 Subject: [PATCH] RunLineMarkerProvider reworked --- .../application/ApplicationConfiguration.java | 7 - .../ApplicationRunLineMarkerProvider.java | 50 ++++++ .../configurations/RunConfigurationBase.java | 4 - .../lineMarker/RunLineMarkerContributor.java | 23 +-- .../lineMarker/RunLineMarkerInfo.java | 126 +++++++++++++++ .../lineMarker/RunLineMarkerProvider.java | 147 ------------------ .../src/META-INF/LangExtensionPoints.xml | 4 +- .../TestDataLineMarkerProvider.java | 9 +- plugins/junit/src/META-INF/plugin.xml | 1 + .../junit/JUnitRunLineMarkerProvider.java | 50 ++++++ resources/src/META-INF/IdeaPlugin.xml | 2 +- 11 files changed, 245 insertions(+), 178 deletions(-) create mode 100644 java/execution/impl/src/com/intellij/execution/application/ApplicationRunLineMarkerProvider.java create mode 100644 platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java delete mode 100644 platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerProvider.java create mode 100644 plugins/junit/src/com/intellij/execution/junit/JUnitRunLineMarkerProvider.java diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java index 34747d5c0984..37535df104b7 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java @@ -34,9 +34,7 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMethod; import com.intellij.psi.util.PsiMethodUtil; -import com.intellij.psi.util.PsiTreeUtil; import com.intellij.refactoring.listeners.RefactoringElementListener; import org.jdom.Element; import org.jetbrains.annotations.NotNull; @@ -125,11 +123,6 @@ public class ApplicationConfiguration extends ModuleBasedConfiguration elements, @NotNull Collection result) { + + } +} diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java index b7052a994986..e8994958b492 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java @@ -123,10 +123,6 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements return true; } - public boolean isLineMarkerPlace(PsiElement place, PsiElement sourceElement) { - return place == sourceElement; - } - public final boolean equals(final Object obj) { return super.equals(obj); } diff --git a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerContributor.java b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerContributor.java index 7726a62d8d97..566a20bb32e4 100644 --- a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerContributor.java +++ b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerContributor.java @@ -15,29 +15,18 @@ */ package com.intellij.execution.lineMarker; +import com.intellij.lang.LanguageExtension; import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.psi.PsiElement; -import com.intellij.util.NullableFunction; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; -import java.util.List; - public abstract class RunLineMarkerContributor { - private final static ExtensionPointName EXTENSION_POINT_NAME = ExtensionPointName.create("com.intellij.runLineMarkerContributor"); - - public static List getActions(final PsiElement element) { - return ContainerUtil.mapNotNull(EXTENSION_POINT_NAME.getExtensions(), new NullableFunction() { - @Nullable - @Override - public AnAction fun(RunLineMarkerContributor contributor) { - return contributor.getAction(element); - } - }); - } + final static LanguageExtension EXTENSION = new LanguageExtension("com.intellij.runLineMarkerContributor"); @Nullable - public abstract AnAction getAction(PsiElement element); + public abstract RunLineMarkerInfo getLineMarkerInfo(PsiElement element); + + @Nullable + public abstract AnAction getAdditionalAction(PsiElement element); } diff --git a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java new file mode 100644 index 000000000000..89c303c344de --- /dev/null +++ b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerInfo.java @@ -0,0 +1,126 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.lineMarker; + +import com.intellij.codeHighlighting.Pass; +import com.intellij.codeInsight.daemon.LineMarkerInfo; +import com.intellij.execution.Executor; +import com.intellij.execution.ExecutorRegistry; +import com.intellij.execution.Location; +import com.intellij.execution.PsiLocation; +import com.intellij.ide.DataManager; +import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl; +import com.intellij.openapi.editor.markup.GutterIconRenderer; +import com.intellij.openapi.util.Getter; +import com.intellij.openapi.util.UserDataHolderBase; +import com.intellij.psi.PsiElement; +import com.intellij.util.Function; +import com.intellij.util.NullableFunction; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Dmitry Avdeev + */ +public class RunLineMarkerInfo extends LineMarkerInfo { + private final PsiElement myElement; + + public RunLineMarkerInfo(PsiElement element, Icon icon, Function tooltipProvider) { + super(element, element.getTextOffset(), icon, Pass.UPDATE_ALL, tooltipProvider, null, GutterIconRenderer.Alignment.CENTER); + myElement = element; + } + + @Nullable + @Override + public GutterIconRenderer createGutterRenderer() { + return new LineMarkerGutterIconRenderer(this) { + @Override + public boolean isNavigateAction() { + return true; + } + + @Override + public AnAction getClickAction() { + return new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + List actions = new ArrayList(); + Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); + actions.addAll(ContainerUtil.mapNotNull(executors, + new Function() { + @Override + public AnAction fun(Executor executor) { + return ActionManager.getInstance().getAction(executor.getContextActionId()); + } + })); + actions.add(Separator.getInstance()); + actions.addAll(ContainerUtil.mapNotNull(RunLineMarkerContributor.EXTENSION.allForLanguage(myElement.getLanguage()), + new NullableFunction() { + @Nullable + @Override + public AnAction fun(RunLineMarkerContributor contributor) { + return contributor.getAdditionalAction(myElement); + } + })); + + ActionPopupMenuImpl + popupMenu = (ActionPopupMenuImpl)ActionManager.getInstance().createActionPopupMenu(ActionPlaces.EDITOR_POPUP, + new DefaultActionGroup(actions)); + final MouseEvent me = (MouseEvent)e.getInputEvent(); + final Component c = me.getComponent(); + if (c != null && c.isShowing()) { + final DataContext delegate = DataManager.getInstance().getDataContext(c, me.getX(), me.getY()); + final DataContext dataContext = new MyDataContext(myElement, delegate); + popupMenu.setDataContextProvider(new Getter() { + @Override + public DataContext get() { + return dataContext; + } + }); + popupMenu.getComponent().show(c, me.getX(), me.getY()); + } + } + }; + } + }; + } + + private static class MyDataContext extends UserDataHolderBase implements DataContext { + private final PsiElement myElement; + private final DataContext myDelegate; + + public MyDataContext(PsiElement element, DataContext delegate) { + myElement = element; + myDelegate = delegate; + } + + @Nullable + @Override + public Object getData(@NonNls String dataId) { + if (Location.DATA_KEY.is(dataId)) return new PsiLocation(myElement); + return myDelegate.getData(dataId); + } + } + +} diff --git a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerProvider.java b/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerProvider.java deleted file mode 100644 index 45b945f81f2e..000000000000 --- a/platform/lang-impl/src/com/intellij/execution/lineMarker/RunLineMarkerProvider.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.execution.lineMarker; - -import com.intellij.codeHighlighting.Pass; -import com.intellij.codeInsight.daemon.LineMarkerInfo; -import com.intellij.codeInsight.daemon.LineMarkerProvider; -import com.intellij.execution.Executor; -import com.intellij.execution.ExecutorRegistry; -import com.intellij.execution.Location; -import com.intellij.execution.PsiLocation; -import com.intellij.execution.actions.ConfigurationContext; -import com.intellij.execution.actions.ConfigurationFromContext; -import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.configurations.RunConfigurationBase; -import com.intellij.ide.DataManager; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.actionSystem.impl.ActionPopupMenuImpl; -import com.intellij.openapi.editor.markup.GutterIconRenderer; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Getter; -import com.intellij.openapi.util.UserDataHolderBase; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiNameIdentifierOwner; -import com.intellij.util.Function; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class RunLineMarkerProvider implements LineMarkerProvider { - - @Nullable - @Override - public LineMarkerInfo getLineMarkerInfo(@NotNull final PsiElement element) { - if (!(element instanceof PsiNameIdentifierOwner)) { - return null; - } - ConfigurationContext context = new ConfigurationContext(element); - List configurations = context.getConfigurationsFromContext(); - if (configurations != null && !configurations.isEmpty()) { - configurations = ContainerUtil.filter(configurations, new Condition() { - @Override - public boolean value(ConfigurationFromContext context) { - RunConfiguration configuration = context.getConfiguration(); - if (!(configuration instanceof RunConfigurationBase)) return false; - return ((RunConfigurationBase)configuration).isLineMarkerPlace(element, context.getSourceElement()); - } - }); - if (configurations.isEmpty()) return null; - Icon icon = null; - for (ConfigurationFromContext configuration : configurations) { - icon = configuration.getConfiguration().getType().getIcon(); - } - return new LineMarkerInfo(element, element.getTextOffset(), icon, Pass.UPDATE_ALL, null, - null, GutterIconRenderer.Alignment.CENTER) { - @Nullable - @Override - public GutterIconRenderer createGutterRenderer() { - return new LineMarkerGutterIconRenderer(this) { - @Override - public boolean isNavigateAction() { - return true; - } - - @Override - public AnAction getClickAction() { - return new AnAction() { - @Override - public void actionPerformed(AnActionEvent e) { - List actions = new ArrayList(); - Executor[] executors = ExecutorRegistry.getInstance().getRegisteredExecutors(); - actions.addAll(ContainerUtil.mapNotNull(executors, - new Function() { - @Override - public AnAction fun(Executor executor) { - return ActionManager.getInstance().getAction(executor.getContextActionId()); - } - })); - actions.add(Separator.getInstance()); - actions.addAll(RunLineMarkerContributor.getActions(element)); - - ActionPopupMenuImpl popupMenu = (ActionPopupMenuImpl)ActionManager.getInstance().createActionPopupMenu(ActionPlaces.EDITOR_POPUP, new DefaultActionGroup(actions)); - final MouseEvent me = (MouseEvent)e.getInputEvent(); - final Component c = me.getComponent(); - if (c != null && c.isShowing()) { - final DataContext delegate = DataManager.getInstance().getDataContext(c, me.getX(), me.getY()); - final DataContext dataContext = new MyDataContext(element, delegate); - popupMenu.setDataContextProvider(new Getter() { - @Override - public DataContext get() { - return dataContext; - } - }); - popupMenu.getComponent().show(c, me.getX(), me.getY()); - } - } - }; - } - }; - } - }; - } - return null; - } - - @Override - public void collectSlowLineMarkers(@NotNull List elements, @NotNull Collection result) { - } - - private static class MyDataContext extends UserDataHolderBase implements DataContext { - private final PsiElement myElement; - private final DataContext myDelegate; - - public MyDataContext(PsiElement element, DataContext delegate) { - myElement = element; - myDelegate = delegate; - } - - @Nullable - @Override - public Object getData(@NonNls String dataId) { - if (Location.DATA_KEY.is(dataId)) return new PsiLocation(myElement); - return myDelegate.getData(dataId); - } - } -} diff --git a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml index 642c0fc70f4d..01cb8aced2b7 100644 --- a/platform/platform-resources/src/META-INF/LangExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/LangExtensionPoints.xml @@ -430,7 +430,9 @@ interface="com.intellij.execution.junit.RuntimeConfigurationProducer"/> - + + + diff --git a/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java b/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java index 9063607fa428..8282aa2be304 100644 --- a/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java +++ b/plugins/devkit/src/testAssistant/TestDataLineMarkerProvider.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.devkit.testAssistant; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.execution.lineMarker.RunLineMarkerContributor; +import com.intellij.execution.lineMarker.RunLineMarkerInfo; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; @@ -39,7 +40,13 @@ public class TestDataLineMarkerProvider extends RunLineMarkerContributor { public static final String CONTENT_ROOT_VARIABLE = "$CONTENT_ROOT"; public static final String PROJECT_ROOT_VARIABLE = "$PROJECT_ROOT"; - public AnAction getAction(@NotNull PsiElement element) { + @Nullable + @Override + public RunLineMarkerInfo getLineMarkerInfo(PsiElement element) { + return null; + } + + public AnAction getAdditionalAction(@NotNull PsiElement element) { if (!(element instanceof PsiMethod) && !(element instanceof PsiClass)) { diff --git a/plugins/junit/src/META-INF/plugin.xml b/plugins/junit/src/META-INF/plugin.xml index c8fc9906c8b6..af118a4572e0 100644 --- a/plugins/junit/src/META-INF/plugin.xml +++ b/plugins/junit/src/META-INF/plugin.xml @@ -60,6 +60,7 @@ + diff --git a/plugins/junit/src/com/intellij/execution/junit/JUnitRunLineMarkerProvider.java b/plugins/junit/src/com/intellij/execution/junit/JUnitRunLineMarkerProvider.java new file mode 100644 index 000000000000..794e843a90c3 --- /dev/null +++ b/plugins/junit/src/com/intellij/execution/junit/JUnitRunLineMarkerProvider.java @@ -0,0 +1,50 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.execution.junit; + +import com.intellij.codeInsight.daemon.LineMarkerInfo; +import com.intellij.codeInsight.daemon.LineMarkerProvider; +import com.intellij.execution.PsiLocation; +import com.intellij.execution.lineMarker.RunLineMarkerInfo; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.List; + +/** + * @author Dmitry Avdeev + */ +public class JUnitRunLineMarkerProvider implements LineMarkerProvider { + @Nullable + @Override + public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) { + if (element instanceof PsiClass && JUnitUtil.isTestClass((PsiClass)element, false, true)) + return new RunLineMarkerInfo(element, JUnitConfigurationType.getInstance().getIcon(), null); + if (element instanceof PsiMethod && JUnitUtil.isTestMethod(new PsiLocation((PsiMethod)element))) + return new RunLineMarkerInfo(element, JUnitConfigurationType.getInstance().getIcon(), null); + return null; + + } + + @Override + public void collectSlowLineMarkers(@NotNull List elements, @NotNull Collection result) { + + } +} diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index a0d20ec6608a..763e12dcc314 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1292,6 +1292,7 @@ + @@ -1538,7 +1539,6 @@ -