From 890b6e2540738eaabab80b1bd4699637e0712809 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Fri, 9 Nov 2018 12:46:00 +0100 Subject: [PATCH] Clang: Allow overtyping ) after completing function like snippets Fixes: QTCREATORBUG-21166 Change-Id: I02e20a230012ce82aed668a46f5fd4a02796135b Reviewed-by: Ivan Donchevskii --- .../clangassistproposalitem.cpp | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index d9e1c7e454a..79638b0b985 100644 --- a/src/plugins/clangcodemodel/clangassistproposalitem.cpp +++ b/src/plugins/clangcodemodel/clangassistproposalitem.cpp @@ -140,6 +140,17 @@ static QString methodDefinitionParameters(const CodeCompletionChunks &chunks) return result; } +static bool skipParenForFunctionLikeSnippet(const std::vector &placeholderPositions, + const QString &text, + int position) +{ + return placeholderPositions.size() == 1 + && position > 0 + && text[position - 1] == '(' + && text[position] == ')' + && position + 1 == text.size(); +} + void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulator, int basePosition) const { @@ -167,12 +178,20 @@ void ClangAssistProposalItem::apply(TextDocumentManipulatorInterface &manipulato } else if (ccr.completionKind == CodeCompletion::KeywordCompletionKind) { CompletionChunksToTextConverter converter; converter.setupForKeywords(); - converter.parseChunks(ccr.chunks); textToBeInserted = converter.text(); - if (converter.hasPlaceholderPositions()) - cursorOffset = converter.placeholderPositions().at(0) - converter.text().size(); + + if (converter.hasPlaceholderPositions()) { + const std::vector &placeholderPositions = converter.placeholderPositions(); + const int position = placeholderPositions[0]; + cursorOffset = position - converter.text().size(); + // If the snippet looks like a function call, e.g. "sizeof()", + // ensure that we can "overtype" ')' after inserting it. + setAutoCompleteSkipPos = skipParenForFunctionLikeSnippet(placeholderPositions, + textToBeInserted, + position); + } } else if (ccr.completionKind == CodeCompletion::NamespaceCompletionKind) { CompletionChunksToTextConverter converter; converter.parseChunks(ccr.chunks); // Appends "::" after name space name