Clang: Allow overtyping ) after completing function like snippets

Fixes: QTCREATORBUG-21166
Change-Id: I02e20a230012ce82aed668a46f5fd4a02796135b
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Nikolai Kosjar
2018-11-09 12:46:00 +01:00
parent 6a043d32dc
commit 890b6e2540

View File

@@ -140,6 +140,17 @@ static QString methodDefinitionParameters(const CodeCompletionChunks &chunks)
return result;
}
static bool skipParenForFunctionLikeSnippet(const std::vector<int> &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<int> &placeholderPositions = converter.placeholderPositions();
const int position = placeholderPositions[0];
cursorOffset = position - converter.text().size();
// If the snippet looks like a function call, e.g. "sizeof(<PLACEHOLDER>)",
// 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