diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index 3db4c7077f7..7c289523897 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -151,6 +151,19 @@ static bool skipParenForFunctionLikeSnippet(const std::vector &placeholderP && position + 1 == text.size(); } +static bool isFuncDeclAsSingleTypedText(const CodeCompletion &completion) +{ + // There is no libclang API to tell function call items from declaration items apart. + // However, the chunks differ for these items (c-index-test -code-completion-at=...): + // An (override) declaration (available in derived class scope): + // CXXMethod:{TypedText void hello() override} (40) + // A function call: + // CXXMethod:{ResultType void}{TypedText hello}{LeftParen (}{RightParen )} (36) + return completion.completionKind == CodeCompletion::FunctionDefinitionCompletionKind + && completion.chunks.size() == 1 + && completion.chunks[0].kind == CodeCompletionChunk::TypedText; +} + void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulator, int basePosition) const { @@ -232,8 +245,12 @@ void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulato cursor.setPosition(basePosition); abandonParen = QString("(;,{}").contains(prevChar); } - if (!abandonParen) - abandonParen = isAtUsingDeclaration(manipulator, basePosition); + if (!abandonParen) { + const bool isFullDecl = isFuncDeclAsSingleTypedText(ccr); + if (isFullDecl) + extraCharacters += QLatin1Char(';'); + abandonParen = isAtUsingDeclaration(manipulator, basePosition) || isFullDecl; + } if (!abandonParen && ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) { const CodeCompletionChunk resultType = ccr.chunks.first();