From 7fad69fc05da7ec035d29cce305b16c510a1233c Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Tue, 11 Apr 2017 18:38:44 +0200 Subject: [PATCH] prefer to use allSettings where we actually need to use settings or don't need configuration at all add hasSettings (later we can optimize it to avoid linear search) no need in the myUnloadedElements since for unknown element UnknownRunConfiguration will be created --- .../intellij/debugger/DebuggerTestCase.java | 8 +--- .../src/com/intellij/execution/RunManager.kt | 2 + .../RunnerAndConfigurationSettings.java | 5 +-- .../configurations/RunConfiguration.java | 6 +-- .../configurations/RunConfigurationBase.java | 6 --- .../UnknownRunConfiguration.java | 6 --- .../actions/CopyConfigurationAction.java | 3 +- .../actions/EditConfigurationAction.java | 3 +- .../actions/RemoveConfigurationAction.java | 3 +- .../dashboard/tree/RunConfigurationNode.java | 4 +- .../impl/ModuleRunConfigurationManager.java | 45 +++++-------------- .../impl/ProjectRunConfigurationManager.java | 42 ++++------------- ...ionRefactoringElementListenerProvider.java | 8 +--- .../intellij/execution/impl/RunManagerImpl.kt | 21 +++------ .../RunnerAndConfigurationSettingsImpl.kt | 10 ++--- .../templates/TemplateModuleBuilder.java | 5 +-- .../AbstractRerunFailedTestsAction.java | 4 -- 17 files changed, 45 insertions(+), 136 deletions(-) diff --git a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java index 4833e351d2d0..ec90fa0f690f 100644 --- a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java +++ b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java @@ -512,7 +512,7 @@ public abstract class DebuggerTestCase extends ExecutionWithDebuggerToolsTestCas @Override public ConfigurationFactory getFactory() { - return null; + return UnknownConfigurationType.FACTORY; } @Override @@ -529,12 +529,6 @@ public abstract class DebuggerTestCase extends ExecutionWithDebuggerToolsTestCas return null; } - @Override - @NotNull - public ConfigurationType getType() { - return UnknownConfigurationType.INSTANCE; - } - @Override public RunConfiguration clone() { return null; diff --git a/platform/lang-api/src/com/intellij/execution/RunManager.kt b/platform/lang-api/src/com/intellij/execution/RunManager.kt index e3e9fe774988..2475e16d8670 100644 --- a/platform/lang-api/src/com/intellij/execution/RunManager.kt +++ b/platform/lang-api/src/com/intellij/execution/RunManager.kt @@ -176,6 +176,8 @@ abstract class RunManager { */ abstract fun refreshUsagesList(profile: RunProfile) + fun hasSettings(settings: RunnerAndConfigurationSettings) = allSettings.contains(settings) + fun suggestUniqueName(name: String?, type: ConfigurationType?): String { val settingsList = if (type == null) allSettings else getConfigurationSettingsList(type) return suggestUniqueName(name.nullize() ?: UNNAMED, settingsList.map { it.name }) diff --git a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java index 8864b58aa612..555d9d1e10e9 100644 --- a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java +++ b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java @@ -31,11 +31,8 @@ import org.jetbrains.annotations.Nullable; public interface RunnerAndConfigurationSettings { /** * Returns the type of the run configuration. - * - * @return the type of the run configuration, or null if the settings object was loaded from disk and no plugin corresponding to the - * stored type of the run configuration is loaded. */ - @Nullable + @NotNull ConfigurationType getType(); /** diff --git a/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java index 4954fba83c6b..57299e47b8b6 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfiguration.java @@ -44,11 +44,11 @@ public interface RunConfiguration extends RunProfile, Cloneable { /** * Returns the type of the run configuration. - * - * @return the configuration type. */ @NotNull - ConfigurationType getType(); + default ConfigurationType getType() { + return getFactory().getType(); + } /** * Returns the factory that has created the run configuration. 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 bcc8f1ac99ce..f0afd43073a5 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/RunConfigurationBase.java @@ -98,12 +98,6 @@ public abstract class RunConfigurationBase extends UserDataHolderBase implements return myProject; } - @Override - @NotNull - public ConfigurationType getType() { - return myFactory.getType(); - } - @Override public Icon getIcon() { return myIcon; diff --git a/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java b/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java index 710d6038b5f9..55c9a96827c7 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/UnknownRunConfiguration.java @@ -83,12 +83,6 @@ public class UnknownRunConfiguration implements RunConfiguration, WithoutOwnBefo return myProject; } - @Override - @NotNull - public ConfigurationType getType() { - return UnknownConfigurationType.INSTANCE; - } - @Override public RunConfiguration clone() { try { diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/CopyConfigurationAction.java b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/CopyConfigurationAction.java index 903b5d104349..a4a023889730 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/CopyConfigurationAction.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/CopyConfigurationAction.java @@ -49,8 +49,7 @@ public class CopyConfigurationAction extends RunConfigurationTreeAction { @Override protected boolean isEnabled4(DashboardRunConfigurationNode node) { - return RunManager.getInstance(node.getProject()).getAllConfigurationsList().contains( - node.getConfigurationSettings().getConfiguration()); + return RunManager.getInstance(node.getProject()).hasSettings(node.getConfigurationSettings()); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/EditConfigurationAction.java b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/EditConfigurationAction.java index 1622456db19a..680652cb74bf 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/EditConfigurationAction.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/EditConfigurationAction.java @@ -41,8 +41,7 @@ public class EditConfigurationAction extends RunConfigurationTreeAction { @Override protected boolean isEnabled4(DashboardRunConfigurationNode node) { - return RunManager.getInstance(node.getProject()).getAllConfigurationsList().contains( - node.getConfigurationSettings().getConfiguration()); + return RunManager.getInstance(node.getProject()).hasSettings(node.getConfigurationSettings()); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RemoveConfigurationAction.java b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RemoveConfigurationAction.java index d83295f0af97..3733e2f189be 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RemoveConfigurationAction.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/actions/RemoveConfigurationAction.java @@ -40,8 +40,7 @@ public class RemoveConfigurationAction extends RunConfigurationTreeAction { @Override protected boolean isEnabled4(DashboardRunConfigurationNode node) { - return RunManager.getInstance(node.getProject()).getAllConfigurationsList().contains( - node.getConfigurationSettings().getConfiguration()); + return RunManager.getInstance(node.getProject()).hasSettings(node.getConfigurationSettings()); } @Override diff --git a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java index e0771d60f363..666c8a90067b 100644 --- a/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java +++ b/platform/lang-impl/src/com/intellij/execution/dashboard/tree/RunConfigurationNode.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -64,7 +64,7 @@ class RunConfigurationNode extends AbstractTreeNode settings != null && usesMyModule(settings.getConfiguration()); @NotNull private final RunManagerImpl myManager; - @Nullable - private List myUnloadedElements = null; public ModuleRunConfigurationManager(@NotNull final Module module, @NotNull final RunManagerImpl runManager) { myModule = module; @@ -110,11 +105,6 @@ public final class ModuleRunConfigurationManager implements PersistentStateCompo public void writeExternal(@NotNull final Element element) throws WriteExternalException { LOG.debug("writeExternal(" + myModule + ")"); myManager.writeConfigurations(element, getModuleRunConfigurationSettings()); - if (myUnloadedElements != null) { - for (final Element unloadedElement : myUnloadedElements) { - element.addContent(unloadedElement.clone()); - } - } } public void readExternal(@NotNull final Element element) { @@ -125,32 +115,21 @@ public final class ModuleRunConfigurationManager implements PersistentStateCompo private void doReadExternal(@NotNull Element element) { LOG.debug("readExternal(" + myModule + ")"); - myUnloadedElements = null; - final Set existing = new HashSet<>(); + final Set existing = new SmartHashSet<>(); - for (final Element child : element.getChildren()) { - final RunnerAndConfigurationSettings configuration = myManager.loadConfiguration(child, true); - if (configuration == null && Comparing.strEqual(element.getName(), RunManagerImpl.CONFIGURATION)) { - if (myUnloadedElements == null) myUnloadedElements = new ArrayList<>(2); - myUnloadedElements.add(element); - } - - if (configuration != null) { - existing.add(configuration.getUniqueID()); - } + for (final Element child : element.getChildren(RunManagerImpl.CONFIGURATION)) { + existing.add(myManager.loadConfiguration(child, true).getUniqueID()); } - for (final RunConfiguration configuration : myManager.getAllConfigurationsList()) { - if (!usesMyModule(configuration)) { - RunnerAndConfigurationSettings settings = myManager.getSettings(configuration); - if (settings != null) { - existing.add(settings.getUniqueID()); - } - } - } - myManager.removeNotExistingSharedConfigurations(existing); - // IDEA-60004: configs may never be sorted before write, so call it manually after shared configs read myManager.setOrdered(false); + + for (RunnerAndConfigurationSettings settings : myManager.getAllSettings()) { + if (!usesMyModule(settings.getConfiguration())) { + existing.add(settings.getUniqueID()); + } + } + + myManager.removeNotExistingSharedConfigurations(existing); } } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java index ef606a5dc6a2..24eab6b74941 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ProjectRunConfigurationManager.java @@ -16,27 +16,22 @@ package com.intellij.execution.impl; import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.configurations.RunConfiguration; import com.intellij.execution.configurations.UnknownRunConfiguration; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.State; import com.intellij.openapi.components.StateSplitterEx; import com.intellij.openapi.components.Storage; import com.intellij.openapi.util.Pair; -import com.intellij.util.SmartList; -import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.jdom.Element; import org.jetbrains.annotations.NotNull; -import java.util.Iterator; import java.util.List; import java.util.Set; @State(name = "ProjectRunConfigurationManager", storages = @Storage(value = "runConfigurations", stateSplitter = ProjectRunConfigurationManager.RunConfigurationStateSplitter.class)) public class ProjectRunConfigurationManager implements PersistentStateComponent { private final RunManagerImpl myManager; - private List myUnloadedElements; public ProjectRunConfigurationManager(@NotNull RunManagerImpl manager) { myManager = manager; @@ -46,50 +41,29 @@ public class ProjectRunConfigurationManager implements PersistentStateComponent< public Element getState() { Element state = new Element("state"); myManager.writeConfigurations(state, myManager.getSharedConfigurations()); - if (!ContainerUtil.isEmpty(myUnloadedElements)) { - for (Element unloadedElement : myUnloadedElements) { - state.addContent(unloadedElement.clone()); - } - } return state; } @Override public void loadState(Element state) { - if (myUnloadedElements != null) { - myUnloadedElements.clear(); - } - Set existing = new THashSet<>(); - for (Iterator iterator = state.getChildren().iterator(); iterator.hasNext(); ) { - Element child = iterator.next(); - RunnerAndConfigurationSettings configuration = myManager.loadConfiguration(child, true); - if (configuration != null) { - existing.add(configuration.getUniqueID()); - } - else if (child.getName().equals(RunManagerImpl.CONFIGURATION)) { - if (myUnloadedElements == null) { - myUnloadedElements = new SmartList<>(); - } - iterator.remove(); - myUnloadedElements.add(child); - } + for (Element child : state.getChildren(RunManagerImpl.CONFIGURATION)) { + existing.add(myManager.loadConfiguration(child, true).getUniqueID()); } myManager.removeNotExistingSharedConfigurations(existing); + + // IDEA-60004: configs may never be sorted before write, so call it manually after shared configs read + myManager.setOrdered(false); + if (myManager.getSelectedConfiguration() == null) { - final List allConfigurations = myManager.getAllConfigurationsList(); - for (final RunConfiguration configuration : allConfigurations) { - final RunnerAndConfigurationSettings settings = myManager.getSettings(allConfigurations.get(0)); - if (!(configuration instanceof UnknownRunConfiguration)) { + for (RunnerAndConfigurationSettings settings : myManager.getAllSettings()) { + if (!(settings.getType() instanceof UnknownRunConfiguration)) { myManager.setSelectedConfiguration(settings); break; } } } - - // IDEA-60004: configs may never be sorted before write, so call it manually after shared configs read - myManager.setOrdered(false); } static class RunConfigurationStateSplitter extends StateSplitterEx { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationRefactoringElementListenerProvider.java b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationRefactoringElementListenerProvider.java index 94571a9c1927..9a713784c1fe 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationRefactoringElementListenerProvider.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunConfigurationRefactoringElementListenerProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2017 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,6 @@ import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.listeners.RefactoringElementListenerComposite; import com.intellij.refactoring.listeners.RefactoringElementListenerProvider; -import java.util.List; - /** * @author spleaner */ @@ -36,9 +34,7 @@ public class RunConfigurationRefactoringElementListenerProvider implements Refac @Override public RefactoringElementListener getListener(final PsiElement element) { RefactoringElementListenerComposite composite = null; - final List configurations = RunManager.getInstance(element.getProject()).getAllConfigurationsList(); - - for (RunConfiguration configuration : configurations) { + for (RunConfiguration configuration : RunManager.getInstance(element.getProject()).getAllConfigurationsList()) { if (configuration instanceof RefactoringListenerProvider) { // todo: perhaps better way to handle listeners? RefactoringElementListener listener; try { diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt index 4ac12fbbf438..9c7e955638fb 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt @@ -31,7 +31,6 @@ import com.intellij.openapi.components.* import com.intellij.openapi.diagnostic.catchAndLog import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.extensions.Extensions -import com.intellij.openapi.options.Scheme import com.intellij.openapi.options.SchemeManagerFactory import com.intellij.openapi.project.IndexNotReadyException import com.intellij.openapi.project.Project @@ -129,8 +128,8 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent private val schemeManagerProvider = SchemeManagerIprProvider("configuration") private val schemeManager = SchemeManagerFactory.getInstance(project).create("workspace", - object : LazySchemeProcessor() { - override fun createScheme(dataHolder: SchemeDataHolder, name: String, attributeProvider: Function, isBundled: Boolean): RunConfigurationScheme { + object : LazySchemeProcessor() { + override fun createScheme(dataHolder: SchemeDataHolder, name: String, attributeProvider: Function, isBundled: Boolean): RunnerAndConfigurationSettingsImpl { val settings = RunnerAndConfigurationSettingsImpl(this@RunManagerImpl) val element = dataHolder.read() try { @@ -295,7 +294,7 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent } if (!settings.isShared && existingSettings !== settings) { - schemeManager.addScheme(settings as RunConfigurationScheme) + schemeManager.addScheme(settings as RunnerAndConfigurationSettingsImpl) } } @@ -715,7 +714,7 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent fireRunConfigurationsRemoved(configurations) } - fun loadConfiguration(element: Element, isShared: Boolean): RunnerAndConfigurationSettings? { + fun loadConfiguration(element: Element, isShared: Boolean): RunnerAndConfigurationSettings { val settings = RunnerAndConfigurationSettingsImpl(this) LOG.catchAndLog { settings.readExternal(element, isShared) @@ -1144,14 +1143,4 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent changedSettings.forEach { myDispatcher.multicaster.runConfigurationChanged(it, null) } } -} - -internal interface RunConfigurationScheme : Scheme - -//private class UnknownRunConfigurationScheme(private val name: String) : RunConfigurationScheme, SerializableScheme { -// override fun getSchemeState() = SchemeState.UNCHANGED -// -// override fun writeScheme() = throw AssertionError("Must be not called") -// -// override fun getName() = name -//} \ No newline at end of file +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt index 7bbecd80d1cc..f44040835d50 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt @@ -26,6 +26,7 @@ import com.intellij.openapi.components.PathMacroManager import com.intellij.openapi.components.PersistentStateComponent import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.extensions.ExtensionException +import com.intellij.openapi.options.Scheme import com.intellij.openapi.options.SchemeState import com.intellij.openapi.util.* import com.intellij.openapi.util.text.StringUtil @@ -56,7 +57,7 @@ val SINGLETON = "singleton" class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val manager: RunManagerImpl, private var _configuration: RunConfiguration? = null, private var isTemplate: Boolean = false, - private var singleton: Boolean = false) : Cloneable, RunnerAndConfigurationSettings, Comparable, RunConfigurationScheme, SerializableScheme { + private var singleton: Boolean = false) : Cloneable, RunnerAndConfigurationSettings, Comparable, Scheme, SerializableScheme { enum class Level { WORKSPACE, PROJECT, TEMPORARY } @@ -293,7 +294,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m override fun getConfigurationSettings(runner: ProgramRunner<*>) = configurationPerRunnerSettings.getOrCreateSettings(runner) - override fun getType() = _configuration?.type + override fun getType(): ConfigurationType = _configuration?.type ?: UnknownConfigurationType.INSTANCE public override fun clone(): RunnerAndConfigurationSettings { val copy = RunnerAndConfigurationSettingsImpl(manager, _configuration!!.clone(), false) @@ -337,10 +338,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m override fun compareTo(other: Any) = if (other is RunnerAndConfigurationSettings) name.compareTo(other.name) else 0 - override fun toString(): String { - val type = type - return "${if (type == null) "" else "${type.displayName}: "}${if (isTemplate) "