diff --git a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp index 62573c70fde..2b364a1d8c5 100644 --- a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp +++ b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.cpp @@ -243,11 +243,14 @@ static bool isValidIdentifierChar(const QChar &character) int ActivationSequenceContextProcessor::findStartOfName( const TextEditor::AssistInterface *assistInterface, - int startPosition) + int startPosition, + NameCategory category) { int position = startPosition; QChar character; - if (position > 2 && assistInterface->characterAt(position - 1) == '>' + + if (category == NameCategory::Function + && position > 2 && assistInterface->characterAt(position - 1) == '>' && assistInterface->characterAt(position - 2) != '-') { uint unbalancedLessGreater = 1; --position; @@ -267,11 +270,12 @@ int ActivationSequenceContextProcessor::findStartOfName( } while (isValidIdentifierChar(character)); int prevPosition = skipPrecedingWhitespace(assistInterface, position); - if (assistInterface->characterAt(prevPosition) == ':' + if (category == NameCategory::Function + && assistInterface->characterAt(prevPosition) == ':' && assistInterface->characterAt(prevPosition - 1) == ':') { // Handle :: case - go recursive prevPosition = skipPrecedingWhitespace(assistInterface, prevPosition - 2); - return findStartOfName(assistInterface, prevPosition + 1); + return findStartOfName(assistInterface, prevPosition + 1, category); } return position + 1; diff --git a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.h b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.h index 6bb25da086f..bffd8d0d262 100644 --- a/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.h +++ b/src/plugins/clangcodemodel/clangactivationsequencecontextprocessor.h @@ -49,8 +49,10 @@ public: const QTextCursor &textCursor_forTestOnly() const; + enum class NameCategory { Function, NonFunction }; static int findStartOfName(const TextEditor::AssistInterface *assistInterface, - int startPosition); + int startPosition, + NameCategory category = NameCategory::NonFunction); static int skipPrecedingWhitespace(const TextEditor::AssistInterface *assistInterface, int startPosition); diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp index bb8308eada5..1f3f5bfebb1 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp @@ -101,8 +101,8 @@ int ClangCompletionContextAnalyzer::startOfFunctionCall(int endOfOperator) const ExpressionUnderCursor euc(m_languageFeatures); index = euc.startOfFunctionCall(textCursor); index = ActivationSequenceContextProcessor::skipPrecedingWhitespace(m_interface, index); - const int functionNameStart = ActivationSequenceContextProcessor::findStartOfName(m_interface, - index); + const int functionNameStart = ActivationSequenceContextProcessor::findStartOfName( + m_interface, index, ActivationSequenceContextProcessor::NameCategory::Function); if (functionNameStart == -1) return -1; diff --git a/tests/unit/unittest/activationsequencecontextprocessor-test.cpp b/tests/unit/unittest/activationsequencecontextprocessor-test.cpp index 5ccc7d500a6..62a70d752cb 100644 --- a/tests/unit/unittest/activationsequencecontextprocessor-test.cpp +++ b/tests/unit/unittest/activationsequencecontextprocessor-test.cpp @@ -147,7 +147,9 @@ TEST(ActivationSequenceContextProcessor, TemplateFunctionLeftParen) TEST(ActivationSequenceContextProcessor, TemplateFunctionSecondParameter) { ClangCompletionAssistInterface interface("foo(", 7); - int startOfname = ContextProcessor::findStartOfName(&interface, 6); + int startOfname = ContextProcessor::findStartOfName(&interface, + 6, + ContextProcessor::NameCategory::Function); ASSERT_THAT(startOfname, 0); } diff --git a/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp b/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp index 09938b2c5da..9047b091656 100644 --- a/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp +++ b/tests/unit/unittest/clangcompletioncontextanalyzer-test.cpp @@ -178,6 +178,13 @@ TEST_F(ClangCompletionContextAnalyzer, AfterSpace) ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText)); } +TEST_F(ClangCompletionContextAnalyzer, AfterQualification) +{ + auto analyzer = runAnalyzer(" Foo::@"); + + ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText)); +} + TEST_F(ClangCompletionContextAnalyzer, AtEndOfDotMember) { auto analyzer = runAnalyzer("o.mem@");