From 53d6aea4040e2ebaacddadcba884c84a6750e7cd Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 12 Apr 2022 11:12:20 +0200 Subject: [PATCH] ClangCodeModel: Fix another false positive ... in output argument highlighting. Fixes: QTCREATORBUG-27367 Change-Id: I80fc7628d62de18f9114290b8104a7a1e9a95c4b Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 7 +++---- .../clangcodemodel/test/clangdtests.cpp | 16 ++++++++++------ .../test/data/highlighting/highlighting.cpp | 18 +++++++++++++++++- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index c5562b7a110..6d283f34f4a 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2710,11 +2710,10 @@ static void semanticHighlighter(QFutureInterface &future, return true; if (it->kind() == "Call") { - // In class templates, member calls can result in "Call" nodes rather than - // "CXXMemberCall". We try to detect this by checking for a certain kind of - // child node. + // The first child is e.g. a called lambda or an object on which + // the call happens, and should not be highlighted as an output argument. const QList children = it->children().value_or(QList()); - return children.isEmpty() || children.first().kind() != "CXXDependentScopeMember"; + return children.isEmpty() || children.first().range() != (it - 1)->range(); } // The token should get marked for e.g. lambdas, but not for assignment operators, diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 25734316e44..d3a27b87bd5 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1323,6 +1323,10 @@ void ClangdTestHighlighting::test_data() << QList{C_LOCAL} << 0; QTest::newRow("member access via operator->") << 1009 << 7 << 1009 << 21 << QList{C_FIELD} << 0; + QTest::newRow("lambda call in member") << 1023 << 9 << 1023 << 15 + << QList{C_LOCAL} << 0; + QTest::newRow("call on inherited member") << 1024 << 9 << 1024 << 12 + << QList{C_FIELD} << 0; } void ClangdTestHighlighting::test() @@ -1425,12 +1429,12 @@ void ClangdTestHighlighting::test() void ClangdTestHighlighting::testIfdefedOutBlocks() { QCOMPARE(m_ifdefedOutBlocks.size(), 3); - QCOMPARE(m_ifdefedOutBlocks.at(0).first(), 12033); - QCOMPARE(m_ifdefedOutBlocks.at(0).last(), 12050); - QCOMPARE(m_ifdefedOutBlocks.at(1).first(), 13351); - QCOMPARE(m_ifdefedOutBlocks.at(1).last(), 13364); - QCOMPARE(m_ifdefedOutBlocks.at(2).first(), 13390); - QCOMPARE(m_ifdefedOutBlocks.at(2).last(), 13402); + QCOMPARE(m_ifdefedOutBlocks.at(0).first(), 12056); + QCOMPARE(m_ifdefedOutBlocks.at(0).last(), 12073); + QCOMPARE(m_ifdefedOutBlocks.at(1).first(), 13374); + QCOMPARE(m_ifdefedOutBlocks.at(1).last(), 13387); + QCOMPARE(m_ifdefedOutBlocks.at(2).first(), 13413); + QCOMPARE(m_ifdefedOutBlocks.at(2).last(), 13425); } diff --git a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp index 2dc1b04436b..9dbb08db93d 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp @@ -5,7 +5,7 @@ auto *rawVariable = R"(Vari auto Character = 'c'; namespace std { -template class vector {}; +template class vector { public: void clear(); }; template class pair {}; } @@ -1008,3 +1008,19 @@ void foo(structWithOptional & s) { s.opt_my_struct1->value = 5; } + +class BaseWithMember +{ +protected: + std::vector vec; +}; + +template class Derived : public BaseWithMember +{ + void foo() + { + auto lambda = [&] {}; + lambda(); + vec.clear(); + } +};