diff --git a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp index 4daa83cbbce..1233e1f23a0 100644 --- a/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp +++ b/src/plugins/clangcodemodel/clangdsemantichighlighting.cpp @@ -135,7 +135,8 @@ public: ExtraHighlightingResultsCollector(QFutureInterface &future, HighlightingResults &results, const Utils::FilePath &filePath, const ClangdAstNode &ast, - const QTextDocument *doc, const QString &docContent); + const QTextDocument *doc, const QString &docContent, + const QVersionNumber &clangdVersion); void collect(); private: @@ -156,6 +157,7 @@ private: const ClangdAstNode &m_ast; const QTextDocument * const m_doc; const QString &m_docContent; + const int m_clangdVersion; ClangdAstNode::FileStatus m_currentFileStatus = ClangdAstNode::FileStatus::Unknown; }; @@ -351,9 +353,12 @@ void doSemanticHighlighting( if (token.modifiers.contains(QLatin1String("declaration"))) styles.mixinStyles.push_back(C_DECLARATION); if (token.modifiers.contains(QLatin1String("static"))) { - if (styles.mainStyle != C_FIELD && styles.mainStyle != C_TEXT) - styles.mixinStyles.push_back(styles.mainStyle); - styles.mainStyle = C_STATIC_MEMBER; + if (styles.mainStyle == C_FUNCTION) { + styles.mainStyle = C_STATIC_MEMBER; + styles.mixinStyles.push_back(C_FUNCTION); + } else if (styles.mainStyle == C_FIELD) { + styles.mainStyle = C_STATIC_MEMBER; + } } if (isOutputParameter(token)) styles.mixinStyles.push_back(C_OUTPUT_ARGUMENT); @@ -364,7 +369,8 @@ void doSemanticHighlighting( auto results = QtConcurrent::blockingMapped(tokens, toResult); const QList ifdefedOutBlocks = cleanupDisabledCode(results, &doc, docContents); - ExtraHighlightingResultsCollector(future, results, filePath, ast, &doc, docContents).collect(); + ExtraHighlightingResultsCollector(future, results, filePath, ast, &doc, docContents, + clangdVersion).collect(); if (!future.isCanceled()) { qCInfo(clangdLogHighlight) << "reporting" << results.size() << "highlighting results"; QMetaObject::invokeMethod(textDocument, [textDocument, ifdefedOutBlocks, docRevision] { @@ -391,9 +397,9 @@ void doSemanticHighlighting( ExtraHighlightingResultsCollector::ExtraHighlightingResultsCollector( QFutureInterface &future, HighlightingResults &results, const Utils::FilePath &filePath, const ClangdAstNode &ast, const QTextDocument *doc, - const QString &docContent) + const QString &docContent, const QVersionNumber &clangdVersion) : m_future(future), m_results(results), m_filePath(filePath), m_ast(ast), m_doc(doc), - m_docContent(docContent) + m_docContent(docContent), m_clangdVersion(clangdVersion.majorVersion()) { } @@ -583,8 +589,8 @@ void ExtraHighlightingResultsCollector::collectFromNode(const ClangdAstNode &nod } const bool isExpression = node.role() == "expression"; - if (isExpression && node.kind() == "Predefined") { - insertResult(node, C_MACRO); + if (m_clangdVersion < 16 && isExpression && node.kind() == "Predefined") { + insertResult(node, C_LOCAL); return; } diff --git a/src/plugins/clangcodemodel/test/clangdtests.cpp b/src/plugins/clangcodemodel/test/clangdtests.cpp index a3fc8c483ff..df9dc9ea5b3 100644 --- a/src/plugins/clangcodemodel/test/clangdtests.cpp +++ b/src/plugins/clangcodemodel/test/clangdtests.cpp @@ -1297,12 +1297,12 @@ void ClangdTestHighlighting::test_data() << QList{C_FIELD} << 0; QTest::newRow("output arg") << 945 << 20 << 945 << 23 << QList{C_LOCAL, C_OUTPUT_ARGUMENT} << 0; - QTest::newRow("built-in define 1") << 950 << 21 << 950 << 29 - << QList{C_MACRO} << 0; - QTest::newRow("built-in define 2") << 951 << 21 << 951 << 33 - << QList{C_MACRO} << 0; - QTest::newRow("built-in define 3") << 952 << 21 << 952 << 40 - << QList{C_MACRO} << 0; + QTest::newRow("built-in variable 1") << 950 << 21 << 950 << 29 + << QList{C_LOCAL} << 0; + QTest::newRow("built-in variable 2") << 951 << 21 << 951 << 33 + << QList{C_LOCAL} << 0; + QTest::newRow("built-in variable 3") << 952 << 21 << 952 << 40 + << QList{C_LOCAL} << 0; QTest::newRow("deref operator (object)") << 960 << 10 << 960 << 11 << QList{C_LOCAL} << 0; QTest::newRow("deref operator (member)") << 960 << 12 << 960 << 13 << QList{C_FIELD} << 0; QTest::newRow("nested call") << 979 << 20 << 979 << 21 << QList{C_LOCAL} << 0;