From a189a74dea2b336ef8a9147eebfff0aa58aa6e06 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 15 Feb 2022 11:05:28 +0100 Subject: [PATCH] ClangCodeModel: Fix erroneous highlighting with clangd In certain cases, members being initialized were highlighted as output parameters. Task-number: QTCREATORBUG-27059 Change-Id: I0de8aee5e4db735251a314b14af04459e6ac772c Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 5 +++++ src/plugins/clangcodemodel/test/clangdtests.cpp | 4 ++++ .../test/data/highlighting/highlighting.cpp | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 89d89c75a41..916cbe37c0a 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -2667,6 +2667,11 @@ static void semanticHighlighter(QFutureInterface &future, const QList path = getAstPath(ast, range); if (path.size() < 2) return false; + if (token.type == "property" + && (path.rbegin()->kind() == "MemberInitializer" + || path.rbegin()->kind() == "CXXConstruct")) { + return false; + } for (auto it = path.rbegin() + 1; it != path.rend(); ++it) { if (it->kind() == "Call" || it->kind() == "CXXConstruct" || it->kind() == "MemberInitializer") { diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index 78250c1aa28..2d996c2af41 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1288,6 +1288,10 @@ void ClangdTestHighlighting::test_data() << QList{C_LOCAL} << 0; QTest::newRow("const operator()") << 903 << 5 << 903 << 7 << QList{C_LOCAL} << 0; + QTest::newRow("member initialization: member (user-defined type)") << 911 << 14 << 911 << 18 + << QList{C_FIELD} << 0; + QTest::newRow("member initialization: member (built-in type)") << 911 << 23 << 911 << 27 + << QList{C_FIELD} << 0; } void ClangdTestHighlighting::test() diff --git a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp index 44ee7ac8686..492b4a37a5e 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.cpp @@ -902,3 +902,15 @@ void callOperators() Callable2 c2; c2(); } + +namespace std { template struct atomic { atomic(int) {} }; } + +void constructorMemberInitialization() +{ + struct S { + S(): m_m1(1), m_m2(0) {} + + std::atomic m_m1; + int m_m2; + }; +}