From a087bda44201228f046b8481da6fba5c38322c02 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 26 Aug 2021 12:21:34 +0200 Subject: [PATCH] LSP: Do not sort completion items if none sets sortText It is unclear if and how the client should order completion items, but at least haskell-language-server provides a sensibly sorted list (not alphabetically) and doesn't set a "sortText". Sorting the items alphabetically by label messes up the prioritization of "best" matches that the server correctly does. Only sort, if any item has a sortText. Task-number: QTCREATORBUG-26114 Change-Id: I55a966763e21ba8b85085a087c37e6005438d4e3 Reviewed-by: David Schulz --- .../languageclientcompletionassist.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/plugins/languageclient/languageclientcompletionassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp index 3826f151cc0..24022b10cea 100644 --- a/src/plugins/languageclient/languageclientcompletionassist.cpp +++ b/src/plugins/languageclient/languageclientcompletionassist.cpp @@ -73,6 +73,7 @@ public: quint64 hash() const override; const QString &sortText() const; + bool hasSortText() const; bool operator <(const LanguageClientCompletionItem &other) const; @@ -208,6 +209,11 @@ const QString &LanguageClientCompletionItem::sortText() const return m_sortText; } +bool LanguageClientCompletionItem::hasSortText() const +{ + return m_item.sortText().has_value(); +} + QString LanguageClientCompletionItem::filterText() const { if (m_filterText.isEmpty()) { @@ -249,7 +255,7 @@ class LanguageClientCompletionModel : public GenericProposalModel public: // GenericProposalModel interface bool containsDuplicates() const override { return false; } - bool isSortable(const QString &/*prefix*/) const override { return true; } + bool isSortable(const QString &/*prefix*/) const override; void sort(const QString &/*prefix*/) override; bool supportsPrefixExpansion() const override { return false; } @@ -257,6 +263,11 @@ public: { return Utils::static_container_cast(m_currentItems); } }; +bool LanguageClientCompletionModel::isSortable(const QString &) const +{ + return Utils::anyOf(items(), &LanguageClientCompletionItem::hasSortText); +} + void LanguageClientCompletionModel::sort(const QString &/*prefix*/) { std::sort(m_currentItems.begin(), m_currentItems.end(),