diff options
author | Marco Bubke <[email protected]> | 2015-07-07 13:09:04 +0200 |
---|---|---|
committer | Marco Bubke <[email protected]> | 2015-07-08 12:29:27 +0000 |
commit | eb5afed10fa4e57e5a3e4d92a9893b1fcf918e0f (patch) | |
tree | ddb0584345cb2b8f595a5068b85999a06f7b9061 | |
parent | dd89d731cfaad7cfd6c1c6aa54ceefe4ca5b82d1 (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]>
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: |