use SemanticTokensWithId internally

- Move SemanticTokens to QueryFile
- Add SemanticTokensId (though still returning SemanticTokens)
- Save latest SemanticTokensId in QueryFile (latest semantic token sent
is associated to a file)
This commit is contained in:
Felipe Lema 2021-05-28 13:20:50 -04:00
parent 16d7ef6aa8
commit ab53802497
2 changed files with 35 additions and 11 deletions

View File

@ -15,13 +15,13 @@
MAKE_HASHABLE(ccls::SymbolIdx, t.usr, t.kind); MAKE_HASHABLE(ccls::SymbolIdx, t.usr, t.kind);
namespace ccls { namespace ccls {
REFLECT_STRUCT(QueryFile::SemanticTokens, data);
REFLECT_STRUCT(QueryFile::SemanticTokensWithId, tokens, id);
using namespace clang; using namespace clang;
namespace { namespace {
struct SemanticTokens {
std::vector<int> data;
};
REFLECT_STRUCT(SemanticTokens, data);
struct CclsSemanticHighlightSymbol { struct CclsSemanticHighlightSymbol {
using Id=int; using Id=int;
@ -97,7 +97,7 @@ void MessageHandler::textDocument_semanticTokensRange(
return; return;
} }
SemanticTokens result; QueryFile::SemanticTokensWithId result;
static GroupMatch match(g_config->highlight.whitelist, static GroupMatch match(g_config->highlight.whitelist,
g_config->highlight.blacklist); g_config->highlight.blacklist);
@ -264,9 +264,13 @@ void MessageHandler::textDocument_semanticTokensRange(
if (r.start.line != line) { if (r.start.line != line) {
column = 0; column = 0;
} }
result.data.push_back(r.start.line - line); line = r.start.line;
result.data.push_back(r.start.character - column); column = r.start.character; auto &serialized = result.tokens.data;
result.data.push_back(r.end.character - r.start.character);
serialized.push_back(r.start.line - line); line = r.start.line;
serialized.push_back(r.start.character - column); column = r.start.character;
serialized.push_back(r.end.character - r.start.character);
uint8_t kindId; uint8_t kindId;
int modifiers = entry.second->storage == SC_Static ? 4 : 0; int modifiers = entry.second->storage == SC_Static ? 4 : 0;
if (entry.first.second & Role::Declaration) { if (entry.first.second & Role::Declaration) {
@ -284,12 +288,17 @@ void MessageHandler::textDocument_semanticTokensRange(
kindId--; kindId--;
if (kindId >= 252) kindId = 27 + kindId - 252; if (kindId >= 252) kindId = 27 + kindId - 252;
} }
result.data.push_back(kindId); serialized.push_back(kindId);
result.data.push_back(modifiers); serialized.push_back(modifiers);
} }
// tokens ready, let's tag them with "the next id"
result.id = queryFile->latestSemanticTokens.id +1;
// before sending data, we'll cache the token we're sending
queryFile->latestSemanticTokens = result;
reply(result); reply(result.tokens);
} }
void MessageHandler::textDocument_semanticTokensFull( void MessageHandler::textDocument_semanticTokensFull(
SemanticTokensParams &param, ReplyOnce &reply){ SemanticTokensParams &param, ReplyOnce &reply){
lsRange fullRange{documentBegin, documentEnd}; lsRange fullRange{documentBegin, documentEnd};

View File

@ -45,6 +45,21 @@ struct QueryFile {
//! `extent` is valid => declaration; invalid => regular reference //! `extent` is valid => declaration; invalid => regular reference
using SymbolToRefCount=llvm::DenseMap<ExtentRef, int>; using SymbolToRefCount=llvm::DenseMap<ExtentRef, int>;
SymbolToRefCount symbol2refcnt; SymbolToRefCount symbol2refcnt;
//! List of 5-integers that describe (line, column, length, token id, token mod)
struct SemanticTokens {
std::vector<int> data;
};
//! Semantic tokens with an id
struct SemanticTokensWithId {
using Id=int;
static constexpr Id invalidId=-1;
SemanticTokens tokens;
//! Id local to a file
Id id = invalidId;
};
//! Latest tokens sent to the client
SemanticTokensWithId latestSemanticTokens;
}; };
template <typename Q, typename QDef> struct QueryEntity { template <typename Q, typename QDef> struct QueryEntity {