diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-08-02 15:15:59 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-08-06 10:38:34 +0000 |
commit | 843f31ae04d51a384886a089c6202c30e48f8457 (patch) | |
tree | 04aa6ce2eb8a74fd5740f2d68ef929959b990dd7 /src/plugins/clangcodemodel/clangcompletionassistprocessor.cpp | |
parent | 0ec471971b21b6d3a2519e46e843f835914d744c (diff) | |
download | qt-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.cpp | 50 |
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; |