summaryrefslogtreecommitdiff
path: root/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2017-08-10 10:24:54 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2017-09-08 07:37:06 +0000
commitd809e3fb8fb9ce9cca261822d7d8350e907337ed (patch)
tree6cac01d881d505592c9c24dfdf1e325439dfd918 /src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp
parentcffcba67bf1af7af54c4cc2e09c1774877d29b4c (diff)
downloadqt-creator-d809e3fb8fb9ce9cca261822d7d8350e907337ed.tar.gz
Clang: send function name position for completion
... to reuse this position in backend (instead of searching the function start again) Change-Id: I02818dce4fc37ed6e7ecfb533191dbfe60610204 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp')
-rw-r--r--src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp
index 00a8f96c6d..bb8308eada 100644
--- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp
+++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp
@@ -91,7 +91,7 @@ void ClangCompletionContextAnalyzer::analyze()
}
}
-bool ClangCompletionContextAnalyzer::looksLikeAFunctionCall(int endOfOperator) const
+int ClangCompletionContextAnalyzer::startOfFunctionCall(int endOfOperator) const
{
int index = ActivationSequenceContextProcessor::skipPrecedingWhitespace(m_interface,
endOfOperator);
@@ -104,22 +104,24 @@ bool ClangCompletionContextAnalyzer::looksLikeAFunctionCall(int endOfOperator) c
const int functionNameStart = ActivationSequenceContextProcessor::findStartOfName(m_interface,
index);
if (functionNameStart == -1)
- return false;
+ return -1;
QTextCursor functionNameSelector(m_interface->textDocument());
functionNameSelector.setPosition(functionNameStart);
functionNameSelector.setPosition(index, QTextCursor::KeepAnchor);
const QString functionName = functionNameSelector.selectedText().trimmed();
- return !functionName.isEmpty();
+ return functionName.isEmpty() ? -1 : functionNameStart;
}
void ClangCompletionContextAnalyzer::setActionAndClangPosition(CompletionAction action,
- int position)
+ int position,
+ int functionNameStart)
{
QTC_CHECK(position >= -1);
m_completionAction = action;
m_positionForClang = position;
+ m_functionNameStart = functionNameStart;
}
void
@@ -157,15 +159,19 @@ void ClangCompletionContextAnalyzer::handleFunctionCall(int afterOperatorPositio
// No function completion if cursor is not after '(' or ','
m_positionForProposal = afterOperatorPosition;
setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition);
- } else if (looksLikeAFunctionCall(afterOperatorPosition)) {
- // Always pass the position right after '(' to libclang because
- // positions after the comma might be problematic if a preceding
- // argument is invalid code.
- setActionAndClangPosition(PassThroughToLibClangAfterLeftParen,
- m_positionForProposal);
- } else { // e.g. "(" without any function name in front
- m_positionForProposal = afterOperatorPosition;
- setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition);
+ } else {
+ const int functionNameStart = startOfFunctionCall(afterOperatorPosition);
+ if (functionNameStart >= 0) {
+ // Always pass the position right after '(' to libclang because
+ // positions after the comma might be problematic if a preceding
+ // argument is invalid code.
+ setActionAndClangPosition(PassThroughToLibClangAfterLeftParen,
+ m_positionForProposal,
+ functionNameStart);
+ } else { // e.g. "(" without any function name in front
+ m_positionForProposal = afterOperatorPosition;
+ setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition);
+ }
}
}
}