diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2017-08-10 09:57:18 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2017-09-05 14:16:04 +0000 |
commit | 82d0650b116e0607e24021b0930e57759c53b449 (patch) | |
tree | 6242340b0b12d4aa96e431dacc7ab96f6fa1e50f /src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp | |
parent | 5fb54e7cddcda2ae14f4bd988cb30c60fb432d7f (diff) | |
download | qt-creator-82d0650b116e0607e24021b0930e57759c53b449.tar.gz |
Clang: fix findStartOfName handling
... of templates and qualified names
Change-Id: Ic8c2dec35cb74484f474c0c608857e7cf48c7468
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp')
-rw-r--r-- | src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp index 80b42c11b4..62573c70fd 100644 --- a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp +++ b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp @@ -247,10 +247,33 @@ int ActivationSequenceContextProcessor::findStartOfName( { int position = startPosition; QChar character; + if (position > 2 && assistInterface->characterAt(position - 1) == '>' + && assistInterface->characterAt(position - 2) != '-') { + uint unbalancedLessGreater = 1; + --position; + while (unbalancedLessGreater > 0 && position > 2) { + character = assistInterface->characterAt(--position); + // Do not count -> usage inside temlate argument list + if (character == '<') + --unbalancedLessGreater; + else if (character == '>' && assistInterface->characterAt(position-1) != '-') + ++unbalancedLessGreater; + } + position = skipPrecedingWhitespace(assistInterface, position) - 1; + } + do { character = assistInterface->characterAt(--position); } while (isValidIdentifierChar(character)); + int prevPosition = skipPrecedingWhitespace(assistInterface, position); + if (assistInterface->characterAt(prevPosition) == ':' + && assistInterface->characterAt(prevPosition - 1) == ':') { + // Handle :: case - go recursive + prevPosition = skipPrecedingWhitespace(assistInterface, prevPosition - 2); + return findStartOfName(assistInterface, prevPosition + 1); + } + return position + 1; } |