diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp --- a/clang-tools-extra/clangd/ClangdLSPServer.cpp +++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp @@ -589,8 +589,9 @@ {"documentProvider", llvm::json::Object{{"edits", true}}}, {"rangeProvider", false}, {"legend", - llvm::json::Object{{"tokenTypes", semanticTokenTypes()}, - {"tokenModifiers", llvm::json::Array()}}}, + llvm::json::Object{ + {"tokenTypes", semanticTokenTypes()}, + {"tokenModifiers", semanticTokenModifiers()}}}, }}, {"signatureHelpProvider", llvm::json::Object{ diff --git a/clang-tools-extra/clangd/SemanticHighlighting.h b/clang-tools-extra/clangd/SemanticHighlighting.h --- a/clang-tools-extra/clangd/SemanticHighlighting.h +++ b/clang-tools-extra/clangd/SemanticHighlighting.h @@ -88,6 +88,7 @@ // main AST. std::vector getSemanticHighlightings(ParsedAST &AST); +std::vector semanticTokenModifiers(); std::vector toSemanticTokens(llvm::ArrayRef); llvm::StringRef toSemanticTokenType(HighlightingKind Kind); std::vector diffTokens(llvm::ArrayRef Before, diff --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp --- a/clang-tools-extra/clangd/SemanticHighlighting.cpp +++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp @@ -445,6 +445,43 @@ return std::tie(L.Line, L.Tokens) == std::tie(R.Line, R.Tokens); } +enum class TokenModifiers { + None = 0, + Local = 1, + Static = 2, + Member = 4, +}; + +TokenModifiers operator|(TokenModifiers A, TokenModifiers B) { + return static_cast(static_cast(A) | + static_cast(B)); +} + +TokenModifiers getTokenModifiers(HighlightingKind Kind) { + switch (Kind) { + case HighlightingKind::LocalVariable: + return TokenModifiers::Local; + case HighlightingKind::StaticField: + return TokenModifiers::Static | TokenModifiers::Member; + case HighlightingKind::Method: + return TokenModifiers::Member; + case HighlightingKind::StaticMethod: + return TokenModifiers::Static | TokenModifiers::Member; + case HighlightingKind::Field: + return TokenModifiers::Member; + default: + return TokenModifiers::None; + } +} + +std::vector semanticTokenModifiers() { + std::vector Modifiers; + Modifiers.push_back("local"); + Modifiers.push_back("static"); + Modifiers.push_back("member"); + return Modifiers; +} + std::vector toSemanticTokens(llvm::ArrayRef Tokens) { assert(std::is_sorted(Tokens.begin(), Tokens.end())); @@ -473,6 +510,7 @@ assert(Tok.R.end.line == Tok.R.start.line); Out.length = Tok.R.end.character - Tok.R.start.character; Out.tokenType = static_cast(Tok.Kind); + Out.tokenModifiers = static_cast(getTokenModifiers(Tok.Kind)); Last = &Tok; } @@ -489,12 +527,11 @@ case HighlightingKind::Function: return "function"; case HighlightingKind::Method: - return "member"; + return "function"; case HighlightingKind::StaticMethod: - // FIXME: better function/member with static modifier? return "function"; case HighlightingKind::Field: - return "member"; + return "variable"; case HighlightingKind::Class: return "class"; case HighlightingKind::Enum: @@ -504,9 +541,9 @@ case HighlightingKind::Typedef: return "type"; case HighlightingKind::DependentType: - return "dependent"; // nonstandard + return "dependentType"; // nonstandard case HighlightingKind::DependentName: - return "dependent"; // nonstandard + return "dependentName"; // nonstandard case HighlightingKind::Namespace: return "namespace"; case HighlightingKind::TemplateParameter: @@ -514,7 +551,7 @@ case HighlightingKind::Concept: return "concept"; // nonstandard case HighlightingKind::Primitive: - return "type"; + return "primitive"; case HighlightingKind::Macro: return "macro"; case HighlightingKind::InactiveCode: @@ -537,8 +574,8 @@ llvm::SmallVector LineByteTokens; llvm::raw_svector_ostream OS(LineByteTokens); for (const auto &Token : Line.Tokens) { - // Writes the token to LineByteTokens in the byte format specified by the - // LSP proposal. Described below. + // Writes the token to LineByteTokens in the byte format specified by + // the LSP proposal. Described below. // |<---- 4 bytes ---->|<-- 2 bytes -->|<--- 2 bytes -->| // | character | length | index | @@ -600,9 +637,8 @@ llvm_unreachable("unhandled HighlightingKind"); } -std::vector -diffTokens(llvm::ArrayRef Old, - llvm::ArrayRef New) { +std::vector diffTokens(llvm::ArrayRef Old, + llvm::ArrayRef New) { // For now, just replace everything from the first-last modification. // FIXME: use a real diff instead, this is bad with include-insertion.