mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-28 18:41:57 +00:00
$ccls/vars: differentiate local/field/parameter
This commit is contained in:
parent
bb08fdfa02
commit
da545f1139
@ -8,9 +8,17 @@ MethodType kMethodType = "$ccls/vars";
|
|||||||
|
|
||||||
struct In_CclsVars : public RequestInMessage {
|
struct In_CclsVars : public RequestInMessage {
|
||||||
MethodType GetMethodType() const override { return kMethodType; }
|
MethodType GetMethodType() const override { return kMethodType; }
|
||||||
|
struct Params : lsTextDocumentPositionParams {
|
||||||
lsTextDocumentPositionParams params;
|
// 1: field
|
||||||
|
// 2: local
|
||||||
|
// 4: parameter
|
||||||
|
unsigned kind = ~0u;
|
||||||
|
} params;
|
||||||
};
|
};
|
||||||
|
MAKE_REFLECT_STRUCT(In_CclsVars::Params,
|
||||||
|
textDocument,
|
||||||
|
position,
|
||||||
|
kind);
|
||||||
MAKE_REFLECT_STRUCT(In_CclsVars, id, params);
|
MAKE_REFLECT_STRUCT(In_CclsVars, id, params);
|
||||||
REGISTER_IN_MESSAGE(In_CclsVars);
|
REGISTER_IN_MESSAGE(In_CclsVars);
|
||||||
|
|
||||||
@ -18,11 +26,11 @@ struct Handler_CclsVars : BaseMessageHandler<In_CclsVars> {
|
|||||||
MethodType GetMethodType() const override { return kMethodType; }
|
MethodType GetMethodType() const override { return kMethodType; }
|
||||||
|
|
||||||
void Run(In_CclsVars* request) override {
|
void Run(In_CclsVars* request) override {
|
||||||
|
auto& params = request->params;
|
||||||
QueryFile* file;
|
QueryFile* file;
|
||||||
if (!FindFileOrFail(db, project, request->id,
|
if (!FindFileOrFail(db, project, request->id,
|
||||||
request->params.textDocument.uri.GetPath(), &file)) {
|
params.textDocument.uri.GetPath(), &file))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
WorkingFile* working_file =
|
WorkingFile* working_file =
|
||||||
working_files->GetFileByFilename(file->def->path);
|
working_files->GetFileByFilename(file->def->path);
|
||||||
@ -30,7 +38,7 @@ struct Handler_CclsVars : BaseMessageHandler<In_CclsVars> {
|
|||||||
Out_LocationList out;
|
Out_LocationList out;
|
||||||
out.id = request->id;
|
out.id = request->id;
|
||||||
for (SymbolRef sym :
|
for (SymbolRef sym :
|
||||||
FindSymbolsAtLocation(working_file, file, request->params.position)) {
|
FindSymbolsAtLocation(working_file, file, params.position)) {
|
||||||
Usr usr = sym.usr;
|
Usr usr = sym.usr;
|
||||||
switch (sym.kind) {
|
switch (sym.kind) {
|
||||||
default:
|
default:
|
||||||
@ -43,9 +51,9 @@ struct Handler_CclsVars : BaseMessageHandler<In_CclsVars> {
|
|||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
}
|
}
|
||||||
case SymbolKind::Type:
|
case SymbolKind::Type:
|
||||||
out.result =
|
out.result = GetLsLocationExs(
|
||||||
GetLsLocationExs(db, working_files,
|
db, working_files,
|
||||||
GetVarDeclarations(db, db->Type(usr).instances));
|
GetVarDeclarations(db, db->Type(usr).instances, params.kind));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ struct Handler_TextDocumentCodeLens
|
|||||||
GetTypeDeclarations(db, type.derived),
|
GetTypeDeclarations(db, type.derived),
|
||||||
false /*force_display*/);
|
false /*force_display*/);
|
||||||
AddCodeLens("var", "vars", &common, OffsetStartColumn(use, 2),
|
AddCodeLens("var", "vars", &common, OffsetStartColumn(use, 2),
|
||||||
GetVarDeclarations(db, type.instances),
|
GetVarDeclarations(db, type.instances, true),
|
||||||
false /*force_display*/);
|
false /*force_display*/);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -59,8 +59,35 @@ std::vector<Use> GetFuncDeclarations(DB* db, const std::vector<Usr>& usrs) {
|
|||||||
std::vector<Use> GetTypeDeclarations(DB* db, const std::vector<Usr>& usrs) {
|
std::vector<Use> GetTypeDeclarations(DB* db, const std::vector<Usr>& usrs) {
|
||||||
return GetDeclarations(db->type_usr, db->types, usrs);
|
return GetDeclarations(db->type_usr, db->types, usrs);
|
||||||
}
|
}
|
||||||
std::vector<Use> GetVarDeclarations(DB* db, const std::vector<Usr>& usrs) {
|
std::vector<Use> GetVarDeclarations(DB* db,
|
||||||
return GetDeclarations(db->var_usr, db->vars, usrs);
|
const std::vector<Usr>& usrs,
|
||||||
|
unsigned kind) {
|
||||||
|
std::vector<Use> ret;
|
||||||
|
ret.reserve(usrs.size());
|
||||||
|
for (Usr usr : usrs) {
|
||||||
|
QueryVar& var = db->Var(usr);
|
||||||
|
bool has_def = false;
|
||||||
|
for (auto& def : var.def)
|
||||||
|
if (def.spell) {
|
||||||
|
has_def = true;
|
||||||
|
// See messages/ccls_vars.cc
|
||||||
|
if (def.kind == lsSymbolKind::Field) {
|
||||||
|
if (!(kind & 1))
|
||||||
|
break;
|
||||||
|
} else if (def.kind == lsSymbolKind::Variable) {
|
||||||
|
if (!(kind & 2))
|
||||||
|
break;
|
||||||
|
} else if (def.kind == lsSymbolKind::Parameter) {
|
||||||
|
if (!(kind & 4))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret.push_back(*def.spell);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!has_def && var.declarations.size())
|
||||||
|
ret.push_back(var.declarations[0]);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Use> GetNonDefDeclarations(DB* db, SymbolIdx sym) {
|
std::vector<Use> GetNonDefDeclarations(DB* db, SymbolIdx sym) {
|
||||||
|
@ -12,7 +12,7 @@ Maybe<Use> GetDefinitionExtent(DB* db, SymbolIdx sym);
|
|||||||
// for each id.
|
// for each id.
|
||||||
std::vector<Use> GetFuncDeclarations(DB*, const std::vector<Usr>&);
|
std::vector<Use> GetFuncDeclarations(DB*, const std::vector<Usr>&);
|
||||||
std::vector<Use> GetTypeDeclarations(DB*, const std::vector<Usr>&);
|
std::vector<Use> GetTypeDeclarations(DB*, const std::vector<Usr>&);
|
||||||
std::vector<Use> GetVarDeclarations(DB*, const std::vector<Usr>&);
|
std::vector<Use> GetVarDeclarations(DB*, const std::vector<Usr>&, unsigned);
|
||||||
|
|
||||||
// Get non-defining declarations.
|
// Get non-defining declarations.
|
||||||
std::vector<Use> GetNonDefDeclarations(DB* db, SymbolIdx sym);
|
std::vector<Use> GetNonDefDeclarations(DB* db, SymbolIdx sym);
|
||||||
|
Loading…
Reference in New Issue
Block a user