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"