#pragma once #include "indexer.h" // NOTE: If updating this enum, make sure to also update the parser and the // help text. enum class Command { Callees, Callers, FindAllUsages, FindInterestingUsages, GotoReferenced, Hierarchy, Outline, Search }; // NOTE: If updating this enum, make sure to also update the parser and the // help text. enum class PreferredSymbolLocation { Declaration, Definition }; using Usr = std::string; struct UsrRef { Usr usr; Location loc; bool operator==(const UsrRef& other) const { return usr == other.usr && loc == other.loc; } }; // There are two sources of reindex updates: the (single) definition of a // symbol has changed, or one of many users of the symbol has changed. // // For simplicitly, if the single definition has changed, we update all of the // associated single-owner definition data. See |Update*DefId|. // // If one of the many symbol users submits an update, we store the update such // that it can be merged with other updates before actually being applied to // the main database. See |MergeableUpdate|. template struct MergeableUpdate { // The type/func/var which is getting new usages. Usr usr; // Entries to add and remove. std::vector to_add; std::vector to_remove; }; struct QueryableTypeDef { TypeDefDefinitionData def; std::vector derived; std::vector uses; using DefUpdate = TypeDefDefinitionData; using DerivedUpdate = MergeableUpdate; using UsesUpdate = MergeableUpdate; QueryableTypeDef(IdCache& id_cache, IndexedTypeDef& indexed); }; struct QueryableFuncDef { FuncDefDefinitionData def; std::vector declarations; std::vector derived; std::vector callers; std::vector uses; using DefUpdate = FuncDefDefinitionData; using DeclarationsUpdate = MergeableUpdate; using DerivedUpdate = MergeableUpdate; using CallersUpdate = MergeableUpdate; using UsesUpdate = MergeableUpdate; QueryableFuncDef(IdCache& id_cache, IndexedFuncDef& indexed); }; struct QueryableVarDef { VarDefDefinitionData def; std::vector uses; using DefUpdate = VarDefDefinitionData; using UsesUpdate = MergeableUpdate; QueryableVarDef(IdCache& id_cache, IndexedVarDef& indexed); }; enum class SymbolKind { Invalid, Type, Func, Var }; struct SymbolIdx { SymbolKind kind; uint64_t idx; SymbolIdx() : kind(SymbolKind::Invalid), idx(-1) {} // Default ctor needed by stdlib. Do not use. SymbolIdx(SymbolKind kind, uint64_t idx) : kind(kind), idx(idx) {} }; struct QueryableFile { FileId file_id; // Symbols declared in the file. std::vector declared_symbols; // Symbols which have definitions in the file. std::vector defined_symbols; };