QueryableLocation now stores a file index

This commit is contained in:
Jacob Dufault 2017-04-08 00:21:00 -07:00
parent 74b1fe7194
commit d61cc7a077
4 changed files with 44 additions and 28 deletions

View File

@ -378,13 +378,20 @@ lsRange GetLsRange(const Range& location) {
lsPosition(location.end.line - 1, location.end.column - 1)); lsPosition(location.end.line - 1, location.end.column - 1));
} }
lsLocation GetLsLocation(const QueryableLocation& location) { lsDocumentUri GetLsDocumentUri(QueryableDatabase* db, QueryFileId file_id) {
std::string path = db->files[file_id.id].def.usr;
return lsDocumentUri::FromPath(path);
}
lsLocation GetLsLocation(QueryableDatabase* db, const QueryableLocation& location) {
return lsLocation( return lsLocation(
lsDocumentUri::FromPath(location.path), GetLsDocumentUri(db, location.path),
GetLsRange(location.range)); GetLsRange(location.range));
} }
void AddCodeLens(std::vector<TCodeLens>* result, void AddCodeLens(
QueryableDatabase* db,
std::vector<TCodeLens>* result,
QueryableLocation loc, QueryableLocation loc,
const std::vector<QueryableLocation>& uses, const std::vector<QueryableLocation>& uses,
bool exclude_loc, bool exclude_loc,
@ -395,7 +402,7 @@ void AddCodeLens(std::vector<TCodeLens>* result,
code_lens.range = GetLsRange(loc.range); code_lens.range = GetLsRange(loc.range);
code_lens.command = lsCommand<lsCodeLensCommandArguments>(); code_lens.command = lsCommand<lsCodeLensCommandArguments>();
code_lens.command->command = "superindex.showReferences"; code_lens.command->command = "superindex.showReferences";
code_lens.command->arguments.uri = lsDocumentUri::FromPath(loc.path); code_lens.command->arguments.uri = GetLsDocumentUri(db, loc.path);
code_lens.command->arguments.position = code_lens.range.start; code_lens.command->arguments.position = code_lens.range.start;
// Add unique uses. // Add unique uses.
@ -405,7 +412,7 @@ void AddCodeLens(std::vector<TCodeLens>* result,
continue; continue;
if (only_interesting && !use.range.interesting) if (only_interesting && !use.range.interesting)
continue; continue;
unique_uses.insert(GetLsLocation(use)); unique_uses.insert(GetLsLocation(db, use));
} }
code_lens.command->arguments.locations.assign(unique_uses.begin(), code_lens.command->arguments.locations.assign(unique_uses.begin(),
unique_uses.end()); unique_uses.end());
@ -422,7 +429,9 @@ void AddCodeLens(std::vector<TCodeLens>* result,
result->push_back(code_lens); result->push_back(code_lens);
} }
void AddCodeLens(std::vector<TCodeLens>* result, void AddCodeLens(
QueryableDatabase* db,
std::vector<TCodeLens>* result,
QueryableLocation loc, QueryableLocation loc,
const std::vector<UsrRef>& uses, const std::vector<UsrRef>& uses,
bool exclude_loc, bool exclude_loc,
@ -433,11 +442,12 @@ void AddCodeLens(std::vector<TCodeLens>* result,
uses0.reserve(uses.size()); uses0.reserve(uses.size());
for (const UsrRef& use : uses) for (const UsrRef& use : uses)
uses0.push_back(use.loc); uses0.push_back(use.loc);
AddCodeLens(result, loc, uses0, exclude_loc, only_interesting, singular, plural); AddCodeLens(db, result, loc, uses0, exclude_loc, only_interesting, singular, plural);
} }
void AddCodeLens(std::vector<TCodeLens>* result, void AddCodeLens(
QueryableDatabase* db, QueryableDatabase* db,
std::vector<TCodeLens>* result,
QueryableLocation loc, QueryableLocation loc,
const std::vector<Usr>& usrs, const std::vector<Usr>& usrs,
bool exclude_loc, bool exclude_loc,
@ -451,7 +461,7 @@ void AddCodeLens(std::vector<TCodeLens>* result,
if (loc) if (loc)
uses0.push_back(loc.value()); uses0.push_back(loc.value());
} }
AddCodeLens(result, loc, uses0, exclude_loc, only_interesting, singular, plural); AddCodeLens(db, result, loc, uses0, exclude_loc, only_interesting, singular, plural);
} }
void QueryDbMainLoop( void QueryDbMainLoop(
@ -563,7 +573,7 @@ void QueryDbMainLoop(
ref.loc.range.start.column <= target_column && ref.loc.range.end.column >= target_column) { ref.loc.range.start.column <= target_column && ref.loc.range.end.column >= target_column) {
optional<QueryableLocation> location = GetDefinitionSpellingOfSymbol(db, ref.idx); optional<QueryableLocation> location = GetDefinitionSpellingOfSymbol(db, ref.idx);
if (location) if (location)
response.result.push_back(GetLsLocation(location.value())); response.result.push_back(GetLsLocation(db, location.value()));
break; break;
} }
} }
@ -589,7 +599,7 @@ void QueryDbMainLoop(
SymbolIdx symbol = ref.idx; SymbolIdx symbol = ref.idx;
lsSymbolInformation info; lsSymbolInformation info;
info.location = GetLsLocation(ref.loc); info.location = GetLsLocation(db, ref.loc);
switch (symbol.kind) { switch (symbol.kind) {
case SymbolKind::Type: { case SymbolKind::Type: {
@ -655,15 +665,15 @@ void QueryDbMainLoop(
switch (symbol.kind) { switch (symbol.kind) {
case SymbolKind::Type: { case SymbolKind::Type: {
QueryableTypeDef& def = db->types[symbol.idx]; QueryableTypeDef& def = db->types[symbol.idx];
AddCodeLens(&response.result, ref.loc.OffsetStartColumn(0), def.uses, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(0), def.uses,
false /*exclude_loc*/, false /*only_interesting*/, "ref", false /*exclude_loc*/, false /*only_interesting*/, "ref",
"refs"); "refs");
AddCodeLens(&response.result, ref.loc.OffsetStartColumn(1), def.uses, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(1), def.uses,
false /*exclude_loc*/, true /*only_interesting*/, "iref", false /*exclude_loc*/, true /*only_interesting*/, "iref",
"irefs"); "irefs");
AddCodeLens(&response.result, db, ref.loc.OffsetStartColumn(2), def.derived, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(2), def.derived,
false /*exclude_loc*/, false /*only_interesting*/, "derived", "derived"); false /*exclude_loc*/, false /*only_interesting*/, "derived", "derived");
AddCodeLens(&response.result, db, ref.loc.OffsetStartColumn(3), def.instantiations, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(3), def.instantiations,
false /*exclude_loc*/, false /*only_interesting*/, "instantiation", "instantiations"); false /*exclude_loc*/, false /*only_interesting*/, "instantiation", "instantiations");
break; break;
} }
@ -672,17 +682,17 @@ void QueryDbMainLoop(
//AddCodeLens(&response.result, ref.loc.OffsetStartColumn(0), def.uses, //AddCodeLens(&response.result, ref.loc.OffsetStartColumn(0), def.uses,
// false /*exclude_loc*/, false /*only_interesting*/, "reference", // false /*exclude_loc*/, false /*only_interesting*/, "reference",
// "references"); // "references");
AddCodeLens(&response.result, ref.loc.OffsetStartColumn(1), def.callers, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(1), def.callers,
true /*exclude_loc*/, false /*only_interesting*/, "caller", "callers"); true /*exclude_loc*/, false /*only_interesting*/, "caller", "callers");
//AddCodeLens(&response.result, ref.loc.OffsetColumn(2), def.def.callees, //AddCodeLens(&response.result, ref.loc.OffsetColumn(2), def.def.callees,
// false /*exclude_loc*/, false /*only_interesting*/, "callee", "callees"); // false /*exclude_loc*/, false /*only_interesting*/, "callee", "callees");
AddCodeLens(&response.result, db, ref.loc.OffsetStartColumn(3), def.derived, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(3), def.derived,
false /*exclude_loc*/, false /*only_interesting*/, "derived", "derived"); false /*exclude_loc*/, false /*only_interesting*/, "derived", "derived");
break; break;
} }
case SymbolKind::Var: { case SymbolKind::Var: {
QueryableVarDef& def = db->vars[symbol.idx]; QueryableVarDef& def = db->vars[symbol.idx];
AddCodeLens(&response.result, ref.loc.OffsetStartColumn(0), def.uses, AddCodeLens(db, &response.result, ref.loc.OffsetStartColumn(0), def.uses,
true /*exclude_loc*/, false /*only_interesting*/, "reference", true /*exclude_loc*/, false /*only_interesting*/, "reference",
"references"); "references");
break; break;
@ -742,7 +752,7 @@ void QueryDbMainLoop(
info.kind = lsSymbolKind::Class; info.kind = lsSymbolKind::Class;
if (def.def.definition_extent.has_value()) if (def.def.definition_extent.has_value())
info.location = GetLsLocation(def.def.definition_extent.value()); info.location = GetLsLocation(db, def.def.definition_extent.value());
break; break;
} }
case SymbolKind::Func: { case SymbolKind::Func: {
@ -760,7 +770,7 @@ void QueryDbMainLoop(
} }
if (def.def.definition_extent.has_value()) { if (def.def.definition_extent.has_value()) {
info.location = GetLsLocation(def.def.definition_extent.value()); info.location = GetLsLocation(db, def.def.definition_extent.value());
} }
break; break;
} }
@ -770,7 +780,7 @@ void QueryDbMainLoop(
info.kind = lsSymbolKind::Variable; info.kind = lsSymbolKind::Variable;
if (def.def.definition_extent.has_value()) { if (def.def.definition_extent.has_value()) {
info.location = GetLsLocation(def.def.definition_extent.value()); info.location = GetLsLocation(db, def.def.definition_extent.value());
} }
break; break;
} }

View File

@ -86,6 +86,13 @@ IndexedTypeDef::IndexedTypeDef(IndexTypeId id, const std::string& usr)
void AddUsage(std::vector<Range>& uses, void AddUsage(std::vector<Range>& uses,
Range loc, Range loc,
bool insert_if_not_present = true) { bool insert_if_not_present = true) {
// cannot sub 1 from size_t in loop below; check explicitly here
if (uses.empty()) {
if (insert_if_not_present)
uses.push_back(loc);
return;
}
// TODO: think about if we need to also consider |uses[i].end| // TODO: think about if we need to also consider |uses[i].end|
// First thought makes me think no, we don't. // First thought makes me think no, we don't.
for (int i = uses.size() - 1; i >= 0; --i) { for (int i = uses.size() - 1; i >= 0; --i) {
@ -749,7 +756,7 @@ void indexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
// Don't treat enum definition variables as instantiations. // Don't treat enum definition variables as instantiations.
bool is_enum_member = decl->semanticContainer && decl->semanticContainer->cursor.kind == CXCursor_EnumDecl; bool is_enum_member = decl->semanticContainer && decl->semanticContainer->cursor.kind == CXCursor_EnumDecl;
if (!is_enum_member) if (!is_enum_member)
db->Resolve(var_type.value())->instantiations.push_back(var_id.id); db->Resolve(var_type.value())->instantiations.push_back(var_id);
var_def->def.variable_type = var_type.value(); var_def->def.variable_type = var_type.value();
} }

View File

@ -32,7 +32,7 @@ Usr MapIdToUsr(const IdMap& id_map, const IndexVarId& id) {
return id_map.local_ids.var_id_to_usr.find(id)->second; return id_map.local_ids.var_id_to_usr.find(id)->second;
} }
QueryableLocation MapIdToUsr(const IdMap& id_map, const Range& range) { QueryableLocation MapIdToUsr(const IdMap& id_map, const Range& range) {
return QueryableLocation(id_map.local_ids.primary_file, range); return QueryableLocation(id_map.primary_file, range);
} }
UsrRef MapIdToUsr(const IdMap& id_map, const FuncRef& id) { UsrRef MapIdToUsr(const IdMap& id_map, const FuncRef& id) {
assert(id_map.local_ids.func_id_to_usr.find(id.id) != id_map.local_ids.func_id_to_usr.end()); assert(id_map.local_ids.func_id_to_usr.find(id.id) != id_map.local_ids.func_id_to_usr.end());
@ -403,7 +403,7 @@ QueryVarId GetQueryVarIdFromUsr(QueryableDatabase* query_db, const Usr& usr) {
IdMap::IdMap(QueryableDatabase* query_db, const IdCache& local_ids) IdMap::IdMap(QueryableDatabase* query_db, const IdCache& local_ids)
: local_ids(local_ids) { : local_ids(local_ids) {
index_file_id = GetQueryFileIdFromUsr(query_db, local_ids.primary_file); primary_file = GetQueryFileIdFromUsr(query_db, local_ids.primary_file);
cached_type_ids_.set_empty_key(-1); cached_type_ids_.set_empty_key(-1);
cached_type_ids_.resize(local_ids.type_id_to_usr.size()); cached_type_ids_.resize(local_ids.type_id_to_usr.size());

View File

@ -30,10 +30,10 @@ struct IdMap;
// 'interesting' from location when that is cleaned up. // 'interesting' from location when that is cleaned up.
struct QueryableLocation { struct QueryableLocation {
Usr path; QueryFileId path;
Range range; Range range;
QueryableLocation(Usr path, Range range) QueryableLocation(QueryFileId path, Range range)
: path(path), range(range) {} : path(path), range(range) {}
QueryableLocation OffsetStartColumn(int offset) const { QueryableLocation OffsetStartColumn(int offset) const {
@ -291,6 +291,7 @@ struct IdMap {
// Then lookup in cached_* should *never* fail. // Then lookup in cached_* should *never* fail.
const IdCache& local_ids; const IdCache& local_ids;
QueryFileId primary_file;
IdMap(QueryableDatabase* query_db, const IdCache& local_ids); IdMap(QueryableDatabase* query_db, const IdCache& local_ids);
@ -301,9 +302,7 @@ struct IdMap {
SymbolIdx ToSymbol(IndexFuncId id) const; SymbolIdx ToSymbol(IndexFuncId id) const;
SymbolIdx ToSymbol(IndexVarId id) const; SymbolIdx ToSymbol(IndexVarId id) const;
// TODO
private: private:
QueryFileId index_file_id;
// TODO: make these type safe // TODO: make these type safe
google::dense_hash_map<size_t, size_t> cached_type_ids_; // IndexTypeId -> QueryTypeId google::dense_hash_map<size_t, size_t> cached_type_ids_; // IndexTypeId -> QueryTypeId
google::dense_hash_map<size_t, size_t> cached_func_ids_; // IndexFuncId -> QueryFuncId google::dense_hash_map<size_t, size_t> cached_func_ids_; // IndexFuncId -> QueryFuncId