Clang: Fix applying override declarations

Since https://reviews.llvm.org/D50898 (clang-8) libclang provides
override declarations when completing code in derived class scopes.

Applying such a completion item appended "()" and resulted in invalid
code, which is fixed with this change - the semicolon is inserted
instead now.

Change-Id: If2a04c5c719f62b98874f083a97445cd4e1db07d
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Nikolai Kosjar
2019-05-23 15:32:36 +02:00
parent d2f3fb8c9f
commit 3b05eb88bd

View File

@@ -151,6 +151,19 @@ static bool skipParenForFunctionLikeSnippet(const std::vector<int> &placeholderP
&& position + 1 == text.size(); && 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, void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulator,
int basePosition) const int basePosition) const
{ {
@@ -232,8 +245,12 @@ void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulato
cursor.setPosition(basePosition); cursor.setPosition(basePosition);
abandonParen = QString("(;,{}").contains(prevChar); abandonParen = QString("(;,{}").contains(prevChar);
} }
if (!abandonParen) if (!abandonParen) {
abandonParen = isAtUsingDeclaration(manipulator, basePosition); const bool isFullDecl = isFuncDeclAsSingleTypedText(ccr);
if (isFullDecl)
extraCharacters += QLatin1Char(';');
abandonParen = isAtUsingDeclaration(manipulator, basePosition) || isFullDecl;
}
if (!abandonParen && ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) { if (!abandonParen && ccr.completionKind == CodeCompletion::FunctionDefinitionCompletionKind) {
const CodeCompletionChunk resultType = ccr.chunks.first(); const CodeCompletionChunk resultType = ccr.chunks.first();