ccls/src/query_utils.h

99 lines
4.0 KiB
C
Raw Normal View History

2017-06-15 05:32:23 +00:00
#pragma once
#include "query_utils.h"
#include "query.h"
#include "working_files.h"
#include <optional.h>
2017-09-22 01:14:57 +00:00
optional<QueryLocation> GetDefinitionSpellingOfSymbol(QueryDatabase* db,
const QueryTypeId& id);
optional<QueryLocation> GetDefinitionSpellingOfSymbol(QueryDatabase* db,
const QueryFuncId& id);
optional<QueryLocation> GetDefinitionSpellingOfSymbol(QueryDatabase* db,
const QueryVarId& id);
optional<QueryLocation> GetDefinitionSpellingOfSymbol(QueryDatabase* db,
const SymbolIdx& symbol);
optional<QueryLocation> GetDefinitionExtentOfSymbol(QueryDatabase* db,
const SymbolIdx& symbol);
optional<QueryFileId> GetDeclarationFileForSymbol(QueryDatabase* db,
const SymbolIdx& symbol);
2018-02-09 05:11:35 +00:00
QueryFileId GetFileId(QueryDatabase* db, Reference ref);
std::vector<Reference> ToReference(QueryDatabase* db,
const std::vector<QueryFuncRef>& refs);
2018-02-09 07:10:54 +00:00
template <typename Q>
std::vector<Reference> ToReference(QueryDatabase* db,
const std::vector<Id<Q>>& ids) {
std::vector<Reference> ret;
ret.reserve(ids.size());
for (auto id : ids) {
optional<QueryLocation> loc = GetDefinitionSpellingOfSymbol(db, id);
if (loc)
ret.push_back(*loc);
}
return ret;
}
2018-02-09 05:11:35 +00:00
std::vector<Reference> GetUsesOfSymbol(QueryDatabase* db,
const SymbolIdx& symbol,
bool include_decl);
std::vector<Reference> GetDeclarationsOfSymbolForGotoDefinition(
2017-09-22 01:14:57 +00:00
QueryDatabase* db,
2018-02-09 05:11:35 +00:00
SymbolIdx symbol);
bool HasCallersOnSelfOrBaseOrDerived(QueryDatabase* db, QueryFunc& root);
2017-09-22 01:14:57 +00:00
std::vector<QueryFuncRef> GetCallersForAllBaseFunctions(QueryDatabase* db,
QueryFunc& root);
std::vector<QueryFuncRef> GetCallersForAllDerivedFunctions(QueryDatabase* db,
QueryFunc& root);
optional<lsPosition> GetLsPosition(WorkingFile* working_file,
const Position& position);
2017-06-15 05:32:23 +00:00
optional<lsRange> GetLsRange(WorkingFile* working_file, const Range& location);
2017-09-22 01:14:57 +00:00
lsDocumentUri GetLsDocumentUri(QueryDatabase* db,
QueryFileId file_id,
std::string* path);
2017-06-15 05:32:23 +00:00
lsDocumentUri GetLsDocumentUri(QueryDatabase* db, QueryFileId file_id);
2018-02-09 05:11:35 +00:00
2017-09-22 01:14:57 +00:00
optional<lsLocation> GetLsLocation(QueryDatabase* db,
WorkingFiles* working_files,
2018-02-09 05:11:35 +00:00
Reference location);
2017-12-12 05:20:29 +00:00
std::vector<lsLocation> GetLsLocations(
2017-09-22 01:14:57 +00:00
QueryDatabase* db,
WorkingFiles* working_files,
2018-02-09 07:10:54 +00:00
const std::vector<Reference>& refs);
2017-06-15 05:32:23 +00:00
// Returns a symbol. The symbol will have *NOT* have a location assigned.
2017-09-22 01:14:57 +00:00
optional<lsSymbolInformation> GetSymbolInfo(QueryDatabase* db,
WorkingFiles* working_files,
SymbolIdx symbol,
bool use_short_name);
2017-06-15 05:32:23 +00:00
2017-09-22 01:14:57 +00:00
std::vector<SymbolRef> FindSymbolsAtLocation(WorkingFile* working_file,
QueryFile* file,
lsPosition position);
void EmitDiagnostics(WorkingFiles* working_files,
std::string path,
std::vector<lsDiagnostic> diagnostics);
2018-02-04 00:20:14 +00:00
2018-02-04 21:43:29 +00:00
template <typename Q, typename Fn>
void EachWithGen(std::vector<Q>& collection, Id<Q> x, Fn fn) {
Q& obj = collection[x.id];
2018-02-04 00:20:14 +00:00
// FIXME Deprecate optional<Def> def
2018-02-04 02:34:07 +00:00
// if (obj.gen == x.gen && obj.def)
if (obj.def)
2018-02-04 00:20:14 +00:00
fn(obj);
}
2018-02-04 21:43:29 +00:00
template <typename Q, typename Fn>
void EachWithGen(std::vector<Q>& collection, std::vector<Id<Q>>& ids, Fn fn) {
for (Id<Q> x : ids) {
Q& obj = collection[x.id];
if (obj.def) // FIXME Deprecate optional<Def> def
fn(obj);
2018-02-04 00:20:14 +00:00
}
}