summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-11-09 12:46:00 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-11-13 07:27:19 +0000
commit890b6e2540738eaabab80b1bd4699637e0712809 (patch)
tree3c550a4a31da1e51afc3cf29200d303b58646412
parent6a043d32dc70e99237a3c08304342785970ead5e (diff)
downloadqt-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.cpp25
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