diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp index 3ddda50804f..71e3214a5a1 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp @@ -101,6 +101,7 @@ ClangCompletionContextAnalyzer::analyzeFunctionCall(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); @@ -159,9 +160,14 @@ void ClangCompletionContextAnalyzer::handleFunctionCall(int afterOperatorPositio setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition); } else { const FunctionInfo functionInfo = analyzeFunctionCall(afterOperatorPosition); - m_functionName = functionInfo.functionName; - setActionAndClangPosition(PassThroughToLibClangAfterLeftParen, - functionInfo.functionNamePosition); + if (functionInfo.isValid()) { + m_functionName = functionInfo.functionName; + setActionAndClangPosition(PassThroughToLibClangAfterLeftParen, + functionInfo.functionNamePosition); + } else { + m_positionForProposal = afterOperatorPosition; + setActionAndClangPosition(PassThroughToLibClang, afterOperatorPosition); + } } } } diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h index 4041f531a4c..4e742caae73 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h @@ -64,7 +64,12 @@ public: private: ClangCompletionContextAnalyzer(); - struct FunctionInfo { int functionNamePosition; QString functionName; }; + struct FunctionInfo { + bool isValid() const { return functionNamePosition != -1 && !functionName.isEmpty(); } + + int functionNamePosition = -1; + QString functionName; + }; FunctionInfo analyzeFunctionCall(int endOfExpression) const; void setActionAndClangPosition(CompletionAction action, int position); diff --git a/tests/unit/unittest/clangcompletioncontextanalyzertest.cpp b/tests/unit/unittest/clangcompletioncontextanalyzertest.cpp index f7046b00e21..ceff9440c22 100644 --- a/tests/unit/unittest/clangcompletioncontextanalyzertest.cpp +++ b/tests/unit/unittest/clangcompletioncontextanalyzertest.cpp @@ -258,6 +258,20 @@ TEST_F(ClangCompletionContextAnalyzer, ParameteTwoWithSpaceAtCall) ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -5, -3, positionInText)); } +TEST_F(ClangCompletionContextAnalyzer, WhitespaceAfterFunctionName) +{ + auto analyzer = runAnalyzer("foo (@"); + + ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClangAfterLeftParen, -5, 0, positionInText)); +} + +TEST_F(ClangCompletionContextAnalyzer, AfterOpeningParenthesis) +{ + auto analyzer = runAnalyzer("(@"); + + ASSERT_THAT(analyzer, HasResult(CCA::PassThroughToLibClang, 0, 0, positionInText)); +} + TEST_F(ClangCompletionContextAnalyzer, ParameteOneAtSignal) { auto analyzer = runAnalyzer("SIGNAL(@");