Index: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp =================================================================== --- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp @@ -82,6 +82,17 @@ return Defaults; } +// Build a lookup table (HighlightingKind => {TextMate Scopes}), which is sent +// to the LSP client. +std::vector> buildHighlightScopeLookupTable() { + std::vector> LookupTable; + // HighlightingKind is using as the index. + for (int KindValue = 0; KindValue < (int)HighlightingKind::NumKinds; + ++KindValue) + LookupTable.push_back({toTextMateScope((HighlightingKind)(KindValue))}); + return LookupTable; +} + } // namespace // MessageHandler dispatches incoming LSP messages. @@ -414,7 +425,7 @@ Result.getObject("capabilities") ->insert( {"semanticHighlighting", - llvm::json::Object{{"scopes", getTextMateScopeLookupTable()}}}); + llvm::json::Object{{"scopes", buildHighlightScopeLookupTable()}}}); Reply(std::move(Result)); } Index: clang-tools-extra/trunk/clangd/SemanticHighlighting.h =================================================================== --- clang-tools-extra/trunk/clangd/SemanticHighlighting.h +++ clang-tools-extra/trunk/clangd/SemanticHighlighting.h @@ -25,7 +25,9 @@ enum class HighlightingKind { Variable = 0, - Function = 1, + Function, + + NumKinds, }; // Contains all information needed for the highlighting a token. @@ -40,9 +42,9 @@ // main AST. std::vector getSemanticHighlightings(ParsedAST &AST); -// Gets the TextMate scopes as a double nested array where the -// SemanticHighlightKind indexes correctly into this vector. -std::vector> getTextMateScopeLookupTable(); +/// Converts a HighlightingKind to a corresponding TextMate scope +/// (https://manual.macromates.com/en/language_grammars). +llvm::StringRef toTextMateScope(HighlightingKind Kind); // Convert to LSP's semantic highlighting information. std::vector Index: clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp =================================================================== --- clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp +++ clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp @@ -149,16 +149,17 @@ return Lines; } -std::vector> getTextMateScopeLookupTable() { +llvm::StringRef toTextMateScope(HighlightingKind Kind) { // FIXME: Add scopes for C and Objective C. - std::map> Scopes = { - {HighlightingKind::Variable, {"variable.cpp"}}, - {HighlightingKind::Function, {"entity.name.function.cpp"}}}; - std::vector> NestedScopes(Scopes.size()); - for (const auto &Scope : Scopes) - NestedScopes[static_cast(Scope.first)] = Scope.second; - - return NestedScopes; + switch (Kind) { + case HighlightingKind::Function: + return "entity.name.function.cpp"; + case HighlightingKind::Variable: + return "variable.cpp"; + case HighlightingKind::NumKinds: + llvm_unreachable("must not pass NumKinds to the function"); + } + llvm_unreachable("unhandled HighlightingKind"); } } // namespace clangd Index: clang-tools-extra/trunk/clangd/refactor/tweaks/AnnotateHighlightings.cpp =================================================================== --- clang-tools-extra/trunk/clangd/refactor/tweaks/AnnotateHighlightings.cpp +++ clang-tools-extra/trunk/clangd/refactor/tweaks/AnnotateHighlightings.cpp @@ -12,15 +12,6 @@ namespace clangd { namespace { -// FIXME: move it to SemanticHighlighting.h. -llvm::StringRef toTextMateScope(HighlightingKind Kind) { - static const auto &TextMateLookupTable = getTextMateScopeLookupTable(); - auto LookupIndex = static_cast(Kind); - assert(LookupIndex < TextMateLookupTable.size() && - !TextMateLookupTable[LookupIndex].empty()); - return TextMateLookupTable[LookupIndex].front(); -} - /// Annotate all highlighting tokens in the current file. This is a hidden tweak /// which is used to debug semantic highlightings. /// Before: