aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <[email protected]>2015-07-07 13:09:04 +0200
committerMarco Bubke <[email protected]>2015-07-08 12:29:27 +0000
commiteb5afed10fa4e57e5a3e4d92a9893b1fcf918e0f (patch)
treeddb0584345cb2b8f595a5068b85999a06f7b9061
parentdd89d731cfaad7cfd6c1c6aa54ceefe4ca5b82d1 (diff)
Clang: Add sorting by priority
The priority is adjusted too provide a better completion list. Change-Id: I1ebed1996f660046843e0c5249a91e8c2b1eeb88 Reviewed-by: Nikolai Kosjar <[email protected]>
-rw-r--r--src/plugins/clangcodemodel/clangassistproposalmodel.cpp17
-rw-r--r--src/plugins/clangcodemodel/clangassistproposalmodel.h1
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp43
-rw-r--r--src/tools/clangbackend/ipcsource/codecompletionsextractor.h6
4 files changed, 67 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
index df25309818c..3f11eee6311 100644
--- a/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
+++ b/src/plugins/clangcodemodel/clangassistproposalmodel.cpp
@@ -32,6 +32,10 @@
#include "clangassistproposalmodel.h"
+#include <texteditor/codeassist/assistproposalitem.h>
+
+#include <algorithm>
+
namespace ClangCodeModel {
namespace Internal {
@@ -56,6 +60,19 @@ bool ClangAssistProposalModel::isSortable(const QString &/*prefix*/) const
return true;
}
+void ClangAssistProposalModel::sort(const QString &/*prefix*/)
+{
+ using TextEditor::AssistProposalItem;
+
+ auto currentItemsCompare = [](AssistProposalItem *first, AssistProposalItem *second) {
+ return (first->order() > 0
+ && (first->order() < second->order()
+ || (first->order() == second->order() && first->text() < second->text())));
+ };
+
+ std::sort(m_currentItems.begin(), m_currentItems.end(), currentItemsCompare);
+}
+
} // namespace Internal
} // namespace ClangCodeModel
diff --git a/src/plugins/clangcodemodel/clangassistproposalmodel.h b/src/plugins/clangcodemodel/clangassistproposalmodel.h
index a7bd21c3598..408ee990ebd 100644
--- a/src/plugins/clangcodemodel/clangassistproposalmodel.h
+++ b/src/plugins/clangcodemodel/clangassistproposalmodel.h
@@ -48,6 +48,7 @@ public:
{}
bool isSortable(const QString &prefix) const override;
+ void sort(const QString &prefix) override;
static bool replaceDotForArrow(IAssistProposalModel *model);
diff --git a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
index 4621cbcf539..e12c35fde98 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
+++ b/src/tools/clangbackend/ipcsource/codecompletionsextractor.cpp
@@ -64,6 +64,7 @@ bool CodeCompletionsExtractor::next()
extractAvailability();
extractHasParameters();
extractCompletionChunks();
+ adaptPriority();
return true;
}
@@ -251,6 +252,48 @@ void CodeCompletionsExtractor::extractCompletionChunks()
currentCodeCompletion_.setChunks(CodeCompletionChunkConverter::extract(currentCxCodeCompleteResult.CompletionString));
}
+void CodeCompletionsExtractor::adaptPriority()
+{
+ decreasePriorityForDestructors();
+ decreasePriorityForNonAvailableCompletions();
+ decreasePriorityForQObjectInternals();
+ decreasePriorityForSignals();
+}
+
+void CodeCompletionsExtractor::decreasePriorityForNonAvailableCompletions()
+{
+ if (currentCodeCompletion_.availability() != CodeCompletion::Available)
+ currentCodeCompletion_.setPriority(currentCodeCompletion_.priority() * 100);
+}
+
+void CodeCompletionsExtractor::decreasePriorityForDestructors()
+{
+ if (currentCodeCompletion_.completionKind() == CodeCompletion::DestructorCompletionKind)
+ currentCodeCompletion_.setPriority(currentCodeCompletion_.priority() * 100);
+}
+
+void CodeCompletionsExtractor::decreasePriorityForSignals()
+{
+ if (currentCodeCompletion_.completionKind() == CodeCompletion::SignalCompletionKind)
+ currentCodeCompletion_.setPriority(currentCodeCompletion_.priority() * 100);
+}
+
+void CodeCompletionsExtractor::decreasePriorityForQObjectInternals()
+{
+ quint32 priority = currentCodeCompletion_.priority();
+
+ if (currentCodeCompletion_.text().startsWith("qt_"))
+ priority *= 100;
+
+ if (currentCodeCompletion_.text() == Utf8StringLiteral("metaObject"))
+ priority *= 10;
+
+ if (currentCodeCompletion_.text() == Utf8StringLiteral("staticMetaObject"))
+ priority *= 100;
+
+ currentCodeCompletion_.setPriority(priority);
+}
+
bool CodeCompletionsExtractor::hasText(const Utf8String &text, CXCompletionString cxCompletionString) const
{
const uint completionChunkCount = clang_getNumCompletionChunks(cxCompletionString);
diff --git a/src/tools/clangbackend/ipcsource/codecompletionsextractor.h b/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
index 11d10895203..2456d42fe9c 100644
--- a/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
+++ b/src/tools/clangbackend/ipcsource/codecompletionsextractor.h
@@ -67,6 +67,12 @@ private:
void extractHasParameters();
void extractCompletionChunks();
+ void adaptPriority();
+ void decreasePriorityForNonAvailableCompletions();
+ void decreasePriorityForDestructors();
+ void decreasePriorityForSignals();
+ void decreasePriorityForQObjectInternals();
+
bool hasText(const Utf8String &text, CXCompletionString cxCompletionString) const;
private: