forked from OSchip/llvm-project
[clangd] Some tweaks on semantic highlighting lookuptable.
Summary: - move toTextMateScope to SemanticHighlighting.h; - move the buildLookupTable to LSP layer (as LSP requires such form); Reviewers: sammccall, jvikstrom Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64202 llvm-svn: 365135
This commit is contained in:
parent
5bec85a34c
commit
1ca2ee4dc1
|
@ -82,6 +82,17 @@ CompletionItemKindBitset defaultCompletionItemKinds() {
|
|||
return Defaults;
|
||||
}
|
||||
|
||||
// Build a lookup table (HighlightingKind => {TextMate Scopes}), which is sent
|
||||
// to the LSP client.
|
||||
std::vector<std::vector<std::string>> buildHighlightScopeLookupTable() {
|
||||
std::vector<std::vector<std::string>> 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 @@ void ClangdLSPServer::onInitialize(const InitializeParams &Params,
|
|||
Result.getObject("capabilities")
|
||||
->insert(
|
||||
{"semanticHighlighting",
|
||||
llvm::json::Object{{"scopes", getTextMateScopeLookupTable()}}});
|
||||
llvm::json::Object{{"scopes", buildHighlightScopeLookupTable()}}});
|
||||
Reply(std::move(Result));
|
||||
}
|
||||
|
||||
|
|
|
@ -149,16 +149,17 @@ toSemanticHighlightingInformation(llvm::ArrayRef<HighlightingToken> Tokens) {
|
|||
return Lines;
|
||||
}
|
||||
|
||||
std::vector<std::vector<std::string>> getTextMateScopeLookupTable() {
|
||||
llvm::StringRef toTextMateScope(HighlightingKind Kind) {
|
||||
// FIXME: Add scopes for C and Objective C.
|
||||
std::map<HighlightingKind, std::vector<std::string>> Scopes = {
|
||||
{HighlightingKind::Variable, {"variable.cpp"}},
|
||||
{HighlightingKind::Function, {"entity.name.function.cpp"}}};
|
||||
std::vector<std::vector<std::string>> NestedScopes(Scopes.size());
|
||||
for (const auto &Scope : Scopes)
|
||||
NestedScopes[static_cast<int>(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
|
||||
|
|
|
@ -25,7 +25,9 @@ namespace clangd {
|
|||
|
||||
enum class HighlightingKind {
|
||||
Variable = 0,
|
||||
Function = 1,
|
||||
Function,
|
||||
|
||||
NumKinds,
|
||||
};
|
||||
|
||||
// Contains all information needed for the highlighting a token.
|
||||
|
@ -40,9 +42,9 @@ bool operator==(const HighlightingToken &Lhs, const HighlightingToken &Rhs);
|
|||
// main AST.
|
||||
std::vector<HighlightingToken> getSemanticHighlightings(ParsedAST &AST);
|
||||
|
||||
// Gets the TextMate scopes as a double nested array where the
|
||||
// SemanticHighlightKind indexes correctly into this vector.
|
||||
std::vector<std::vector<std::string>> 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<SemanticHighlightingInformation>
|
||||
|
|
|
@ -12,15 +12,6 @@ namespace clang {
|
|||
namespace clangd {
|
||||
namespace {
|
||||
|
||||
// FIXME: move it to SemanticHighlighting.h.
|
||||
llvm::StringRef toTextMateScope(HighlightingKind Kind) {
|
||||
static const auto &TextMateLookupTable = getTextMateScopeLookupTable();
|
||||
auto LookupIndex = static_cast<size_t>(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:
|
||||
|
|
Loading…
Reference in New Issue