LanguageClient: move relevant snippets to the front

If a snippet starts with the current prefix move it to the front of the
proposed completions.

Fixes: QTCREATORBUG-27566
Change-Id: I568d34e4da596a8cf4f08eb88eb1ee865edbed70
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2022-06-14 09:53:26 +02:00
parent a7d8698bf2
commit d80a713b89

View File

@@ -233,7 +233,7 @@ public:
// GenericProposalModel interface
bool containsDuplicates() const override { return false; }
bool isSortable(const QString &/*prefix*/) const override;
void sort(const QString &/*prefix*/) override;
void sort(const QString &prefix) override;
bool supportsPrefixExpansion() const override { return false; }
QList<AssistProposalItemInterface *> items() const { return m_currentItems; }
@@ -247,19 +247,21 @@ bool LanguageClientCompletionModel::isSortable(const QString &) const
});
}
void LanguageClientCompletionModel::sort(const QString &/*prefix*/)
void LanguageClientCompletionModel::sort(const QString &prefix)
{
std::sort(m_currentItems.begin(), m_currentItems.end(),
[] (AssistProposalItemInterface *a, AssistProposalItemInterface *b){
[&prefix] (AssistProposalItemInterface *a, AssistProposalItemInterface *b){
const auto lca = dynamic_cast<LanguageClientCompletionItem *>(a);
const auto lcb = dynamic_cast<LanguageClientCompletionItem *>(b);
if (!lca && !lcb)
return a->text() < b->text();
if (lca && lcb)
return *lca < *lcb;
if (lca && !lcb)
return true;
return false;
if (prefix.isEmpty())
return lca && !lcb;
if (!lca)
return a->text().toLower().startsWith(prefix.toLower());
return !b->text().toLower().startsWith(prefix.toLower());
});
}