summaryrefslogtreecommitdiff
path: root/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-02 15:15:59 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-06 10:38:34 +0000
commit843f31ae04d51a384886a089c6202c30e48f8457 (patch)
tree04aa6ce2eb8a74fd5740f2d68ef929959b990dd7 /src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
parent0ec471971b21b6d3a2519e46e843f835914d744c (diff)
downloadqt-creator-843f31ae04d51a384886a089c6202c30e48f8457.tar.gz
Clang: Better handle constructor overloads
Follow up for 0f96f735f0. Constructors have worse support in Clang for their definitions but have proper overloads for the references. Change-Id: Ie002ae74b0d15f0fe00126042a7f61172b82946b Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp')
-rw-r--r--src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp50
1 files changed, 40 insertions, 10 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
index fb5d7daec4..99543e1871 100644
--- a/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp
@@ -77,16 +77,23 @@ static void addAssistProposalItem(QList<AssistProposalItemInterface *> &items,
}
static void addFunctionOverloadAssistProposalItem(QList<AssistProposalItemInterface *> &items,
- const ClangCompletionAssistInterface *interface,
- const CodeCompletion &codeCompletion,
- const QString &name)
+ AssistProposalItemInterface *sameItem,
+ const ClangCompletionAssistInterface *interface,
+ const CodeCompletion &codeCompletion,
+ const QString &name)
{
ClangBackEnd::CodeCompletionChunk resultType = codeCompletion.chunks.first();
- QTC_ASSERT(resultType.kind == ClangBackEnd::CodeCompletionChunk::ResultType,
- return;);
-
- auto *item = static_cast<ClangAssistProposalItem *>(items.last());
+ auto *item = static_cast<ClangAssistProposalItem *>(sameItem);
item->setHasOverloadsWithParameters(true);
+ if (resultType.kind != ClangBackEnd::CodeCompletionChunk::ResultType) {
+ // It's the constructor.
+ // CLANG-UPGRADE-CHECK: Can we get here with constructor definition?
+ if (!item->firstCodeCompletion().hasParameters)
+ item->removeFirstCodeCompletion();
+ item->appendCodeCompletion(codeCompletion);
+ return;
+ }
+
QTextCursor cursor = interface->textEditorWidget()->textCursor();
cursor.setPosition(interface->position());
cursor.movePosition(QTextCursor::StartOfWord);
@@ -121,10 +128,33 @@ static QList<AssistProposalItemInterface *> toAssistProposalItems(
? CompletionChunksToTextConverter::convertToName(codeCompletion.chunks)
: codeCompletion.text.toString();
- if (!items.empty() && items.last()->text() == name && codeCompletion.hasParameters)
- addFunctionOverloadAssistProposalItem(items, interface, codeCompletion, name);
- else
+ if (codeCompletion.completionKind == CodeCompletion::ConstructorCompletionKind
+ || codeCompletion.completionKind == CodeCompletion::ClassCompletionKind) {
+ auto samePreviousConstructor
+ = std::find_if(items.begin(),
+ items.end(),
+ [&name](const AssistProposalItemInterface *item) {
+ return item->text() == name;
+ });
+ if (samePreviousConstructor == items.end()) {
+ addAssistProposalItem(items, codeCompletion, name);
+ } else {
+ addFunctionOverloadAssistProposalItem(items, *samePreviousConstructor, interface,
+ codeCompletion, name);
+ }
+ continue;
+ }
+
+ if (!items.empty() && items.last()->text() == name) {
+ if ((codeCompletion.completionKind == CodeCompletion::FunctionCompletionKind
+ || codeCompletion.completionKind == CodeCompletion::FunctionDefinitionCompletionKind)
+ && codeCompletion.hasParameters) {
+ addFunctionOverloadAssistProposalItem(items, items.back(), interface,
+ codeCompletion, name);
+ }
+ } else {
addAssistProposalItem(items, codeCompletion, name);
+ }
}
return items;