mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-29 11:01:57 +00:00
QueryableLocation now stores a file index
This commit is contained in:
parent
74b1fe7194
commit
d61cc7a077
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user