textDocument/references: add excludeRole

This commit is contained in:
Fangrui Song 2018-07-04 19:16:56 -07:00
parent 6a8837d612
commit f81454b9ec

View File

@ -12,10 +12,12 @@ struct In_TextDocumentReferences : public RequestInMessage {
MethodType GetMethodType() const override { return kMethodType; }
struct lsReferenceContext {
bool base = true;
// Exclude references with any |Role| bits set.
Role excludeRole = Role::None;
// Include the declaration of the current symbol.
bool includeDeclaration = false;
// Include references with these |Role| bits set.
Role role = Role::All;
// Include references with all |Role| bits set.
Role role = Role::None;
};
struct Params {
lsTextDocumentIdentifier textDocument;
@ -27,6 +29,7 @@ struct In_TextDocumentReferences : public RequestInMessage {
};
MAKE_REFLECT_STRUCT(In_TextDocumentReferences::lsReferenceContext,
base,
excludeRole,
includeDeclaration,
role);
MAKE_REFLECT_STRUCT(In_TextDocumentReferences::Params,
@ -72,7 +75,8 @@ struct Handler_TextDocumentReferences
sym.usr = stack.back();
stack.pop_back();
auto fn = [&](Use use, lsSymbolKind parent_kind) {
if (use.role & params.context.role)
if (Role(use.role & params.context.role) == params.context.role &&
!(use.role & params.context.excludeRole))
if (std::optional<lsLocationEx> ls_loc =
GetLsLocationEx(db, working_files, use, container)) {
if (container)