Author: Sam McCall Date: 2020-04-02T17:38:02+02:00 New Revision: fc830106e15553fcca3fc80066fe5a988e16dfec
URL: https://github.com/llvm/llvm-project/commit/fc830106e15553fcca3fc80066fe5a988e16dfec DIFF: https://github.com/llvm/llvm-project/commit/fc830106e15553fcca3fc80066fe5a988e16dfec.diff LOG: [clangd] Don't send semanticHighlights to clients that support semanticTokens. Summary: This allows the standard mechanism to gracefully displace the old one. Reviewers: hokein Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D77206 Added: Modified: clang-tools-extra/clangd/ClangdLSPServer.cpp clang-tools-extra/clangd/ClangdServer.h clang-tools-extra/clangd/Protocol.cpp clang-tools-extra/clangd/Protocol.h clang-tools-extra/clangd/test/semantic-tokens.test Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index 310c1fec17dd..8906e6f68f2f 100644 --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -480,6 +480,13 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, ClangdServerOpts.TheiaSemanticHighlighting = Params.capabilities.TheiaSemanticHighlighting; + if (Params.capabilities.TheiaSemanticHighlighting && + Params.capabilities.SemanticTokens) { + log("Client supports legacy semanticHighlights notification and standard " + "semanticTokens request, choosing the latter (no notifications)."); + ClangdServerOpts.TheiaSemanticHighlighting = false; + } + if (Params.rootUri && *Params.rootUri) ClangdServerOpts.WorkspaceRoot = std::string(Params.rootUri->file()); else if (Params.rootPath && !Params.rootPath->empty()) @@ -612,7 +619,7 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params, }}}}; if (NegotiatedOffsetEncoding) Result["offsetEncoding"] = *NegotiatedOffsetEncoding; - if (Params.capabilities.TheiaSemanticHighlighting) + if (ClangdServerOpts.TheiaSemanticHighlighting) Result.getObject("capabilities") ->insert( {"semanticHighlighting", diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h index f1e981e6c14f..ae3da84c42c8 100644 --- a/clang-tools-extra/clangd/ClangdServer.h +++ b/clang-tools-extra/clangd/ClangdServer.h @@ -145,7 +145,7 @@ class ClangdServer { /// fetch system include path. std::vector<std::string> QueryDriverGlobs; - /// Enable semantic highlighting features. + /// Enable notification-based semantic highlighting. bool TheiaSemanticHighlighting = false; /// Returns true if the tweak should be enabled. diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp index 9d7c96df02c0..019c6c038467 100644 --- a/clang-tools-extra/clangd/Protocol.cpp +++ b/clang-tools-extra/clangd/Protocol.cpp @@ -297,6 +297,8 @@ bool fromJSON(const llvm::json::Value &Params, ClientCapabilities &R) { SemanticHighlighting->getBoolean("semanticHighlighting")) R.TheiaSemanticHighlighting = *SemanticHighlightingSupport; } + if (auto *SemanticHighlighting = TextDocument->getObject("semanticTokens")) + R.SemanticTokens = true; if (auto *Diagnostics = TextDocument->getObject("publishDiagnostics")) { if (auto CategorySupport = Diagnostics->getBoolean("categorySupport")) R.DiagnosticCategory = *CategorySupport; diff --git a/clang-tools-extra/clangd/Protocol.h b/clang-tools-extra/clangd/Protocol.h index 5d0b60d7fe9f..a713d47862b1 100644 --- a/clang-tools-extra/clangd/Protocol.h +++ b/clang-tools-extra/clangd/Protocol.h @@ -433,8 +433,13 @@ struct ClientCapabilities { /// textDocument.codeAction.codeActionLiteralSupport. bool CodeActionStructure = false; + /// Client advertises support for the semanticTokens feature. + /// We support the textDocument/semanticTokens request in any case. + /// textDocument.semanticTokens + bool SemanticTokens = false; /// Client supports Theia semantic highlighting extension. /// https://github.com/microsoft/vscode-languageserver-node/pull/367 + /// This will be ignored if the client also supports semanticTokens. /// textDocument.semanticHighlightingCapabilities.semanticHighlighting /// FIXME: drop this support once clients support LSP 3.16 Semantic Tokens. bool TheiaSemanticHighlighting = false; diff --git a/clang-tools-extra/clangd/test/semantic-tokens.test b/clang-tools-extra/clangd/test/semantic-tokens.test index 1f6b51af84dd..679766995d52 100644 --- a/clang-tools-extra/clangd/test/semantic-tokens.test +++ b/clang-tools-extra/clangd/test/semantic-tokens.test @@ -1,5 +1,10 @@ -# RUN: clangd -lit-test < %s | FileCheck -strict-whitespace %s -{"jsonrpc":"2.0","id":0,"method":"initialize","params":{}} +# RUN: clangd -lit-test < %s | FileCheck -strict-whitespace %s -implicit-check-not=semanticHighlight +# Send capabilities for both Theia semanticHighlight & standard semanticTokens. +# clangd should not use/acknowledge the Theia protocol in this case. +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"capabilities":{"textDocument":{ + "semanticHighlightingCapabilities":{"semanticHighlighting":true}, + "semanticTokens":{"dynamicRegistration":true} +}}}} --- {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///foo.cpp","languageId":"cpp","text":"int x = 2;"}}} --- _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits