From 5fa7fbf0d2c5f649f365e912c7ac194d4fb7b08e Mon Sep 17 00:00:00 2001 From: Jacob Dufault Date: Sat, 11 Nov 2017 11:18:55 -0800 Subject: [PATCH] More improvements to semantic highlighting. Still not done though. --- src/command_line.cc | 52 ++++++++++++++++++++++++++++----------- src/indexer.h | 4 +-- src/language_server_api.h | 4 ++- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/command_line.cc b/src/command_line.cc index 7dc00b7f..675b010e 100644 --- a/src/command_line.cc +++ b/src/command_line.cc @@ -161,29 +161,51 @@ void EmitSemanticHighlighting(QueryDatabase* db, }; // Group symbols together. - std::unordered_map> grouped_symbols; + std::unordered_map + grouped_symbols; for (SymbolRef sym : file->def->all_symbols) { - if (sym.idx.kind == SymbolKind::Var) { - QueryVar* var = &db->vars[sym.idx.idx]; - if (!var->def) - continue; - if (!var->def->is_local) - continue; + bool is_type_member = false; + switch (sym.idx.kind) { + case SymbolKind::Func: { + QueryFunc* func = &db->funcs[sym.idx.idx]; + if (!func->def) + continue; // applies to for loop + is_type_member = func->def->declaring_type.has_value(); + break; + } + case SymbolKind::Var: { + QueryVar* var = &db->vars[sym.idx.idx]; + if (!var->def) + continue; // applies to for loop + if (!var->def->is_local && !var->def->declaring_type) + continue; // applies to for loop + is_type_member = var->def->declaring_type.has_value(); + break; + } + default: + continue; // applies to for loop } + optional loc = GetLsRange(working_file, sym.loc.range); - if (loc) - grouped_symbols[sym.idx].push_back(*loc); + if (loc) { + auto it = grouped_symbols.find(sym.idx); + if (it != grouped_symbols.end()) { + it->second.ranges.push_back(*loc); + } else { + Out_CqueryPublishSemanticHighlighting::Symbol symbol; + symbol.type = map_symbol_kind_to_symbol_type(sym.idx.kind); + symbol.is_type_member = is_type_member; + symbol.ranges.push_back(*loc); + grouped_symbols[sym.idx] = symbol; + } + } } // Publish. Out_CqueryPublishSemanticHighlighting out; out.params.uri = lsDocumentUri::FromPath(working_file->filename); - for (auto& entry : grouped_symbols) { - Out_CqueryPublishSemanticHighlighting::Symbol symbol; - symbol.type = map_symbol_kind_to_symbol_type(entry.first.kind); - symbol.ranges = entry.second; - out.params.symbols.push_back(symbol); - } + for (auto& entry : grouped_symbols) + out.params.symbols.push_back(entry.second); IpcManager::instance()->SendOutMessageToClient( IpcId::CqueryPublishSemanticHighlighting, out); } diff --git a/src/indexer.h b/src/indexer.h index 21a857e7..ff2beabc 100644 --- a/src/indexer.h +++ b/src/indexer.h @@ -373,10 +373,10 @@ struct VarDefDefinitionData { // Type of the variable. optional variable_type; - // Type which declares this one (ie, it is a method) + // Type which declares this one. optional declaring_type; - // Is this a "local" variable, ie, a parameter or function variable? + // Is this a parameter or function variable? bool is_local = false; // Is this a macro, ie, #define FOO? bool is_macro = false; diff --git a/src/language_server_api.h b/src/language_server_api.h index ad9b7e6c..0b11cb58 100644 --- a/src/language_server_api.h +++ b/src/language_server_api.h @@ -1484,7 +1484,8 @@ struct Out_CqueryPublishSemanticHighlighting : public lsOutMessage { enum class SymbolType { Type = 0, Function, Variable }; struct Symbol { - SymbolType type; + SymbolType type = SymbolType::Type; + bool is_type_member = false; NonElidedVector ranges; }; struct Params { @@ -1497,6 +1498,7 @@ struct Out_CqueryPublishSemanticHighlighting MAKE_REFLECT_TYPE_PROXY(Out_CqueryPublishSemanticHighlighting::SymbolType, int); MAKE_REFLECT_STRUCT(Out_CqueryPublishSemanticHighlighting::Symbol, type, + is_type_member, ranges); MAKE_REFLECT_STRUCT(Out_CqueryPublishSemanticHighlighting::Params, uri,