diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2022-04-12 11:12:20 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2022-04-13 08:43:22 +0000 |
commit | 53d6aea4040e2ebaacddadcba884c84a6750e7cd (patch) | |
tree | 84d31dc78e57646f920865002c87bbc6e91eeb12 | |
parent | 803f2999673c3f2ededdd6cbf569112c15636b3d (diff) |
ClangCodeModel: Fix another false positive
... in output argument highlighting.
Fixes: QTCREATORBUG-27367
Change-Id: I80fc7628d62de18f9114290b8104a7a1e9a95c4b
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Schulz <david.schulz@qt.io>
-rw-r--r-- | src/plugins/clangcodemodel/clangdclient.cpp | 7 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/test/clangdtests.cpp | 16 | ||||
-rw-r--r-- | src/plugins/clangcodemodel/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 c5562b7a11..6d283f34f4 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2710,11 +2710,10 @@ static void semanticHighlighter(QFutureInterface<HighlightingResult> &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<AstNode> children = it->children().value_or(QList<AstNode>()); - 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 25734316e4..d3a27b87bd 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1323,6 +1323,10 @@ void ClangdTestHighlighting::test_data() << QList<int>{C_LOCAL} << 0; QTest::newRow("member access via operator->") << 1009 << 7 << 1009 << 21 << QList<int>{C_FIELD} << 0; + QTest::newRow("lambda call in member") << 1023 << 9 << 1023 << 15 + << QList<int>{C_LOCAL} << 0; + QTest::newRow("call on inherited member") << 1024 << 9 << 1024 << 12 + << QList<int>{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 2dc1b04436..9dbb08db93 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<typename T> class vector {}; +template<typename T> class vector { public: void clear(); }; template<typename T, typename U> class pair {}; } @@ -1008,3 +1008,19 @@ void foo(structWithOptional & s) { s.opt_my_struct1->value = 5; } + +class BaseWithMember +{ +protected: + std::vector<unsigned char> vec; +}; + +template<typename T> class Derived : public BaseWithMember +{ + void foo() + { + auto lambda = [&] {}; + lambda(); + vec.clear(); + } +}; |