diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationRunLineMarkerProvider.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationRunLineMarkerProvider.java index 3c82276ab4a8..1bf654b455ac 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationRunLineMarkerProvider.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationRunLineMarkerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -25,8 +25,8 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiIdentifier; import com.intellij.psi.PsiMethod; import com.intellij.psi.util.PsiMethodUtil; -import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -35,7 +35,7 @@ import org.jetbrains.annotations.Nullable; public class ApplicationRunLineMarkerProvider extends RunLineMarkerContributor { @Nullable @Override - public Info getInfo(final PsiElement e) { + public Info getInfo(@NotNull final PsiElement e) { if (isIdentifier(e)) { PsiElement element = e.getParent(); if (element instanceof PsiClass && PsiMethodUtil.findMainInClass((PsiClass)element) != null || diff --git a/java/java-impl/src/com/intellij/testIntegration/TestRunLineMarkerProvider.java b/java/java-impl/src/com/intellij/testIntegration/TestRunLineMarkerProvider.java index 8c716edd3aaf..587da4e30d4e 100644 --- a/java/java-impl/src/com/intellij/testIntegration/TestRunLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/testIntegration/TestRunLineMarkerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -43,7 +43,7 @@ public class TestRunLineMarkerProvider extends RunLineMarkerContributor { @Nullable @Override - public Info getInfo(PsiElement e) { + public Info getInfo(@NotNull PsiElement e) { if (isIdentifier(e)) { PsiElement element = e.getParent(); if (element instanceof PsiClass) { diff --git a/platform/lang-api/src/com/intellij/execution/RunnerRegistry.java b/platform/lang-api/src/com/intellij/execution/RunnerRegistry.java index 98cce8b39266..390b409895e6 100644 --- a/platform/lang-api/src/com/intellij/execution/RunnerRegistry.java +++ b/platform/lang-api/src/com/intellij/execution/RunnerRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -26,10 +26,6 @@ public abstract class RunnerRegistry { return ServiceManager.getService(RunnerRegistry.class); } - @SuppressWarnings("unused") - @Deprecated - public abstract boolean hasRunner(@NotNull String executorId, @NotNull RunProfile settings); - @Nullable public abstract ProgramRunner getRunner(@NotNull String executorId, @Nullable RunProfile settings); diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java index 6c536155dbfd..f1228712184a 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerRegistryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2016 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. @@ -24,11 +24,6 @@ import org.jetbrains.annotations.Nullable; // TODO[spLeaner]: eliminate public class RunnerRegistryImpl extends RunnerRegistry { - @Override - public boolean hasRunner(@NotNull String executorId, @NotNull RunProfile settings) { - return getRunner(executorId, settings) != null; - } - @Override public ProgramRunner getRunner(@NotNull String executorId, @Nullable RunProfile settings) { if (settings == null) { diff --git a/platform/lang-impl/src/com/intellij/execution/lineMarker/ExecutorAction.kt b/platform/lang-impl/src/com/intellij/execution/lineMarker/ExecutorAction.kt index d7e0d960144b..599a92d1219b 100644 --- a/platform/lang-impl/src/com/intellij/execution/lineMarker/ExecutorAction.kt +++ b/platform/lang-impl/src/com/intellij/execution/lineMarker/ExecutorAction.kt @@ -17,6 +17,7 @@ package com.intellij.execution.lineMarker import com.intellij.execution.Executor import com.intellij.execution.ExecutorRegistry +import com.intellij.execution.RunnerRegistry import com.intellij.execution.actions.* import com.intellij.execution.configurations.LocatableConfiguration import com.intellij.execution.impl.RunManagerImpl @@ -29,46 +30,52 @@ import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.diagnostic.catchAndLog import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.util.Key +import com.intellij.util.containers.mapSmart +import com.intellij.util.containers.mapSmartNotNull + +private val LOG = logger() +private val CONFIGURATION_CACHE = Key.create>("ConfigurationFromContext") /** * @author Dmitry Avdeev */ -class ExecutorAction private constructor(private val myOrigin: AnAction, - private val myExecutor: Executor, - private val myOrder: Int) : AnAction() { - +class ExecutorAction private constructor(private val origin: AnAction, private val executor: Executor, private val order: Int) : AnAction() { init { - copyFrom(myOrigin) + copyFrom(origin) } companion object { - private val LOG = logger() - private val CONFIGURATION_CACHE = Key.create>("ConfigurationFromContext") + @JvmStatic + @JvmOverloads + fun getActions(order: Int = 0) = getActionList(order).toTypedArray() @JvmStatic - fun getActions(order: Int): Array { - return ExecutorRegistry.getInstance().registeredExecutors.map { - ExecutorAction(ActionManager.getInstance().getAction(it.contextActionId), it, order) - }.toTypedArray() + @JvmOverloads + fun getActionList(order: Int = 0): List { + val actionManager = ActionManager.getInstance() + return ExecutorRegistry.getInstance().registeredExecutors.mapSmart { + ExecutorAction(actionManager.getAction(it.contextActionId), it, order) + } } private fun getConfigurations(dataContext: DataContext): List { var result = DataManager.getInstance().loadFromDataContext(dataContext, CONFIGURATION_CACHE) if (result == null) { - result = calcConfigurations(dataContext) + result = computeConfigurations(dataContext) DataManager.getInstance().saveInDataContext(dataContext, CONFIGURATION_CACHE, result) } return result } - private fun calcConfigurations(dataContext: DataContext): List { + private fun computeConfigurations(dataContext: DataContext): List { val context = ConfigurationContext.getFromContext(dataContext) if (context.location == null) { return emptyList() } - return RunConfigurationProducer.getProducers(context.project).mapNotNull { + + return RunConfigurationProducer.getProducers(context.project).mapSmartNotNull { LOG.catchAndLog { - val configuration = it.createLightConfiguration(context) ?: return@mapNotNull null + val configuration = it.createLightConfiguration(context) ?: return@mapSmartNotNull null val settings = RunnerAndConfigurationSettingsImpl(RunManagerImpl.getInstanceImpl(context.project), configuration, false) ConfigurationFromContextImpl(it, settings, context.psiLocation) } @@ -77,13 +84,13 @@ class ExecutorAction private constructor(private val myOrigin: AnAction, } override fun update(e: AnActionEvent) { - val name = getActionName(e.dataContext, myExecutor) - e.presentation.isVisible = name != null + val name = getActionName(e.dataContext, executor) + e.presentation.isEnabledAndVisible = name != null e.presentation.text = name } override fun actionPerformed(e: AnActionEvent) { - myOrigin.actionPerformed(e) + origin.actionPerformed(e) } private fun getActionName(dataContext: DataContext, executor: Executor): String? { @@ -91,8 +98,12 @@ class ExecutorAction private constructor(private val myOrigin: AnAction, if (list.isEmpty()) { return null } - val configuration = list[if (myOrder < list.size) myOrder else 0] - val actionName = BaseRunConfigurationAction.suggestRunActionName(configuration.configuration as LocatableConfiguration) - return executor.getStartActionText(actionName) + + val configuration = list.getOrNull(if (order < list.size) order else 0)?.configuration as LocatableConfiguration + if (RunnerRegistry.getInstance().getRunner(executor.id, configuration) == null) { + return null + } + + return executor.getStartActionText(BaseRunConfigurationAction.suggestRunActionName(configuration)) } } diff --git a/platform/projectModel-impl/src/com/intellij/util/containers/util.kt b/platform/projectModel-impl/src/com/intellij/util/containers/util.kt index 48dfc74e190b..5af18d252101 100644 --- a/platform/projectModel-impl/src/com/intellij/util/containers/util.kt +++ b/platform/projectModel-impl/src/com/intellij/util/containers/util.kt @@ -149,3 +149,12 @@ inline fun Collection.mapSmart(transform: (T) -> R): List { mapTo(ArrayList(size), transform) } } + +inline fun Collection.mapSmartNotNull(transform: (T) -> R?): List { + return if (size == 1) { + transform(first())?.let { SmartList(it) } ?: SmartList() + } + else { + mapNotNullTo(ArrayList(size), transform) + } +} diff --git a/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.kt b/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.kt index 318bf2743481..a766440b6e79 100644 --- a/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.kt +++ b/platform/script-debugger/protocol/protocol-reader-runtime/src/org/jetbrains/jsonProtocol/OutMessage.kt @@ -201,7 +201,7 @@ open class OutMessage() { fun writeNullableString(name: String, value: CharSequence?) { beginArguments() - writer.name(name).value(value?.toString() ?: null) + writer.name(name).value(value?.toString()) } }