From 28927856580808dbda8f31c0e7c8f4d23162b499 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Wed, 12 Apr 2017 12:15:01 +0200 Subject: [PATCH] fix RunConfigurableTest (we must sort folder names) Why did it work prevously? Because prevously it was sideeffect of sorting in the loadState of workspace RC. Now we don't perform such sort (and should not). --- .../intellij/debugger/DebuggerTestCase.java | 5 -- .../RunnerAndConfigurationSettings.java | 2 - .../intellij/execution/impl/RunManagerImpl.kt | 69 ++++++++++--------- .../RunnerAndConfigurationSettingsImpl.kt | 14 +++- .../openapi/util/text/StringUtil.java | 7 ++ 5 files changed, 53 insertions(+), 44 deletions(-) diff --git a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java index ec90fa0f690f..5622bab38511 100644 --- a/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java +++ b/java/testFramework/src/com/intellij/debugger/DebuggerTestCase.java @@ -534,11 +534,6 @@ public abstract class DebuggerTestCase extends ExecutionWithDebuggerToolsTestCas return null; } - @Override - public int getUniqueID() { - return 0; - } - @Override public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment env) throws ExecutionException { return null; diff --git a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java index 555d9d1e10e9..b64689c2ede4 100644 --- a/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java +++ b/platform/lang-api/src/com/intellij/execution/RunnerAndConfigurationSettings.java @@ -205,6 +205,4 @@ public interface RunnerAndConfigurationSettings { * @return the folder name, or null if the configuration is displayed on the top level. */ @Nullable String getFolderName(); - - } 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 90b331b981a9..e9ffe6362cf0 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunManagerImpl.kt @@ -40,6 +40,7 @@ import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.UnknownFeat import com.intellij.openapi.util.InvalidDataException import com.intellij.openapi.util.Key import com.intellij.openapi.util.registry.Registry +import com.intellij.openapi.util.text.StringUtil import com.intellij.util.EventDispatcher import com.intellij.util.IconUtil import com.intellij.util.SmartList @@ -376,10 +377,8 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent } } - private data class OrderItem(val id: String, val settings: RunnerAndConfigurationSettings) - @Volatile - private var immutableSortedSettingsList: List? = null + private var immutableSortedSettingsList: List? = emptyList() override val allSettings: List get() { @@ -397,46 +396,48 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent return immutableSortedSettingsList!! } - val order = ArrayList(idToSettings.size) - val folderNames = SmartList() - for (each in idToSettings.values) { - order.add(OrderItem(each.uniqueID, each)) - val folderName = each.folderName - if (folderName != null && !folderNames.contains(folderName)) { - folderNames.add(folderName) - } - } - folderNames.add(null) - idToSettings.clear() - + // IDEA-63663 Sort run configurations alphabetically if clean checkout if (customOrder.isEmpty()) { - // IDEA-63663 Sort run configurations alphabetically if clean checkout - order.sortWith(Comparator { o1, o2 -> - val temporary1 = o1.settings.isTemporary - val temporary2 = o2.settings.isTemporary + idToSettings.values.sortedWith(Comparator { o1, o2 -> + val temporary1 = o1.isTemporary + val temporary2 = o2.isTemporary when { - temporary1 == temporary2 -> o1.id.compareTo(o2.id) + temporary1 == temporary2 -> o1.uniqueID.compareTo(o2.uniqueID) temporary1 -> 1 else -> -1 } }) } else { - order.sortWith(Comparator { o1, o2 -> - val i1 = folderNames.indexOf(o1.settings.folderName) - val i2 = folderNames.indexOf(o2.settings.folderName) - if (i1 != i2) { - return@Comparator i1 - i2 + val list = idToSettings.values.toTypedArray() + val folderNames = SmartList() + for (settings in list) { + val folderName = settings.folderName + if (folderName != null && !folderNames.contains(folderName)) { + folderNames.add(folderName) + } + } + + folderNames.sortWith(StringUtil.NATURAL_COMPARATOR) + folderNames.add(null) + + list.sortWith(Comparator { o1, o2 -> + if (o1.folderName != o2.folderName) { + val i1 = folderNames.indexOf(o1.folderName) + val i2 = folderNames.indexOf(o2.folderName) + if (i1 != i2) { + return@Comparator i1 - i2 + } } - val temporary1 = o1.settings.isTemporary - val temporary2 = o2.settings.isTemporary + val temporary1 = o1.isTemporary + val temporary2 = o2.isTemporary when { temporary1 == temporary2 -> { - val index1 = customOrder.indexOf(o1.id) - val index2 = customOrder.indexOf(o2.id) + val index1 = customOrder.indexOf(o1.uniqueID) + val index2 = customOrder.indexOf(o2.uniqueID) if (index1 == -1 && index2 == -1) { - o1.settings.name.compareTo(o2.settings.name) + o1.name.compareTo(o2.name) } else { index1 - index2 @@ -446,11 +447,11 @@ class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persistent else -> -1 } }) - } - for (each in order) { - val setting = each.settings - idToSettings.put(setting.uniqueID, setting) + idToSettings.clear() + for (settings in list) { + idToSettings.put(settings.uniqueID, settings) + } } val result = Collections.unmodifiableList(idToSettings.values.toList()) 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 26d8bf785632..61886bb675ea 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt +++ b/platform/lang-impl/src/com/intellij/execution/impl/RunnerAndConfigurationSettingsImpl.kt @@ -76,6 +76,8 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m private var wasSingletonSpecifiedExplicitly = false private var folderName: String? = null + private var uniqueId: String? = null + override fun getFactory(): ConfigurationFactory = _configuration?.factory ?: UnknownConfigurationType.FACTORY override fun isTemplate() = isTemplate @@ -108,9 +110,14 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m } override fun getUniqueID(): String { - val configuration = configuration - @Suppress("DEPRECATION") - return "${configuration.type.displayName}.${configuration.name}${(configuration as? UnknownRunConfiguration)?.uniqueID ?: ""}" + var result = uniqueId + if (result == null) { + val configuration = configuration + @Suppress("DEPRECATION") + result = "${configuration.type.displayName}.${configuration.name}${(configuration as? UnknownRunConfiguration)?.uniqueID ?: ""}" + uniqueId = result + } + return result } override fun setEditBeforeRun(b: Boolean) { @@ -180,6 +187,7 @@ class RunnerAndConfigurationSettingsImpl @JvmOverloads constructor(private val m } _configuration = configuration + uniqueId = null PathMacroManager.getInstance(configuration.project).expandPaths(element) if (configuration is ModuleBasedConfiguration<*>) { diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 9843f7694c27..8d5495d694dd 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -2705,6 +2705,13 @@ public class StringUtil extends StringUtilRt { return res; } + public static final Comparator NATURAL_COMPARATOR = new Comparator() { + @Override + public int compare(String o1, String o2) { + return naturalCompare(o1, o2); + } + }; + /** * Implementation of * "Sorting for Humans: Natural Sort Order"