From f93c316b73a6564bc6ccac94d0c89b686d98362a Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 21 Jun 2022 17:44:14 +0200 Subject: [PATCH] ClangCodeModel: Adapt to new upstream feature See https://reviews.llvm.org/D130015. Change-Id: I2c2590265f2d7a2c2b5e966b0dc65ceff6b1b3e6 Reviewed-by: Reviewed-by: David Schulz --- .../clangdsemantichighlighting.cpp | 14 ++++++++++---- src/plugins/clangcodemodel/test/clangdtests.cpp | 16 ---------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp index fbddb0b605a..322a21058ff 100644 --- a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp +++ b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp @@ -164,9 +164,15 @@ void doSemanticHighlighting( const Position endPos = startPos.withOffset(token.length, &doc); return Range(startPos, endPos); }; - const auto isOutputParameter = [&ast, &tokenRange](const ExpandedSemanticToken &token) { + const int clangdMajorVersion = clangdVersion.majorVersion(); + const auto isOutputParameter = [&ast, &tokenRange, clangdMajorVersion] + (const ExpandedSemanticToken &token) { if (token.modifiers.contains(QLatin1String("usedAsMutableReference"))) return true; + if (token.modifiers.contains(QLatin1String("usedAsMutablePointer"))) + return true; + if (clangdMajorVersion >= 16) + return false; if (token.type != "variable" && token.type != "property" && token.type != "parameter") return false; const Range range = tokenRange(token); @@ -260,7 +266,7 @@ void doSemanticHighlighting( }; const std::function toResult - = [&ast, &isOutputParameter, &tokenRange, ver = clangdVersion.majorVersion()] + = [&ast, &isOutputParameter, &tokenRange, clangdMajorVersion] (const ExpandedSemanticToken &token) { TextStyles styles; if (token.type == "variable") { @@ -277,7 +283,7 @@ void doSemanticHighlighting( ? C_VIRTUAL_METHOD : C_FUNCTION; if (token.modifiers.contains("definition")) { styles.mixinStyles.push_back(C_FUNCTION_DEFINITION); - } else if (ver < 16 && ast.isValid()) { + } else if (clangdMajorVersion < 16 && ast.isValid()) { const ClangdAstPath path = getAstPath(ast, tokenRange(token)); if (path.length() > 1) { const ClangdAstNode declNode = path.at(path.length() - 2); @@ -291,7 +297,7 @@ void doSemanticHighlighting( styles.mainStyle = C_TYPE; if (token.modifiers.contains("constructorOrDestructor")) { styles.mainStyle = C_FUNCTION; - } else if (ver < 16 && ast.isValid()) { + } else if (clangdMajorVersion < 16 && ast.isValid()) { const ClangdAstPath path = getAstPath(ast, tokenRange(token)); if (!path.isEmpty()) { if (path.last().kind() == "CXXConstructor") { diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index f00e675651b..96a6383abad 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1012,12 +1012,6 @@ void ClangdTestHighlighting::test_data() << QList{C_LOCAL} << 0; QTest::newRow("const pointer argument") << 491 << 26 << 491 << 27 << QList{C_LOCAL, C_OUTPUT_ARGUMENT} << 0; - QTest::newRow("non-const reference via member function call as output argument (object)") - << 580 << 29 << 580 << 30 - << QList{C_LOCAL, C_OUTPUT_ARGUMENT} << 0; - QTest::newRow("non-const reference via member function call as output argument (function)") - << 580 << 31 << 580 << 37 - << QList{C_FUNCTION, C_OUTPUT_ARGUMENT} << 0; QTest::newRow("value argument") << 501 << 57 << 501 << 58 << QList{C_LOCAL} << 0; QTest::newRow("non-const ref argument as second arg") << 501 << 61 << 501 << 62 @@ -1026,8 +1020,6 @@ void ClangdTestHighlighting::test_data() << QList{C_PARAMETER, C_OUTPUT_ARGUMENT} << 0; QTest::newRow("non-const pointer argument expression") << 513 << 30 << 513 << 31 << QList{C_LOCAL, C_OUTPUT_ARGUMENT} << 0; - QTest::newRow("non-const ref argument from qualified member (object)") << 525 << 31 << 525 << 39 - << QList{C_LOCAL, C_OUTPUT_ARGUMENT} << 0; QTest::newRow("non-const ref argument from qualified member (member)") << 525 << 40 << 525 << 46 << QList{C_FIELD, C_OUTPUT_ARGUMENT} << 0; QTest::newRow("non-const ref argument to constructor") << 540 << 47 << 540 << 55 @@ -1394,14 +1386,6 @@ void ClangdTestHighlighting::test() actualStyles << s; } - QEXPECT_FAIL("non-const reference via member function call as output argument (object)", - "See below", Continue); - QEXPECT_FAIL("non-const reference via member function call as output argument (function)", - "Without punctuation and comment tokens from clangd, it's not possible " - "to highlight entire expressions. But do we really want this? What about nested " - "calls where the inner arguments are const?", - Continue); - QCOMPARE(actualStyles, expectedStyles); QCOMPARE(result.kind, expectedKind); }