aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2022-04-12 11:12:20 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2022-04-13 08:43:22 +0000
commit53d6aea4040e2ebaacddadcba884c84a6750e7cd (patch)
tree84d31dc78e57646f920865002c87bbc6e91eeb12
parent803f2999673c3f2ededdd6cbf569112c15636b3d (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.cpp7
-rw-r--r--src/plugins/clangcodemodel/test/clangdtests.cpp16
-rw-r--r--src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp18
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();
+ }
+};