diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-11-09 12:46:00 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-11-13 07:27:19 +0000 |
commit | 890b6e2540738eaabab80b1bd4699637e0712809 (patch) | |
tree | 3c550a4a31da1e51afc3cf29200d303b58646412 | |
parent | 6a043d32dc70e99237a3c08304342785970ead5e (diff) | |
download | qt-creator-890b6e2540738eaabab80b1bd4699637e0712809.tar.gz |
Clang: Allow overtyping ) after completing function like snippets
Fixes: QTCREATORBUG-21166
Change-Id: I02e20a230012ce82aed668a46f5fd4a02796135b
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
-rw-r--r-- | src/plugins/clangcodemodel/clangassistproposalitem.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/plugins/clangcodemodel/clangassistproposalitem.cpp b/src/plugins/clangcodemodel/clangassistproposalitem.cpp index d9e1c7e454..79638b0b98 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<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 |