remove part of macro expansion from ignore function

rename is_macro_expansion to isPartOfMacroExpansion
This commit is contained in:
Ludovic Jozeau 2021-05-10 16:20:14 +02:00
parent 5208eb6be6
commit 0b57c9503d
No known key found for this signature in database
GPG Key ID: 881AEC6AAD9BEA6C

View File

@ -121,29 +121,41 @@ void reflect(JsonWriter &vis, std::unique_ptr<DocumentSymbol> &v) {
reflect(vis, *v); reflect(vis, *v);
} }
template <typename Def> bool ignore(const Def *def) { return false; } template <typename Def>
template <> bool ignore(const QueryType::Def *def) { bool isPartOfMacroExpansion(DB *db, WorkingFile *wf, QueryFile *file,
return !def || def->kind == SymbolKind::TypeParameter; Def const *def) noexcept {
} if (def->kind == SymbolKind::Macro) {
template <> bool ignore(const QueryVar::Def *def) {
return !def || def->is_local();
}
} // namespace
bool is_macro_expansion(DB *db, WorkingFile *wf, QueryFile *file,
DocumentSymbol const &ds) noexcept {
if (ds.kind == SymbolKind::Macro) {
return false; return false;
} }
auto start = ds.range.start; auto range = getLsRange(wf, def->spell->range);
auto syms = findSymbolsAtLocation(wf, file, start, true); if (range) {
auto syms = findSymbolsAtLocation(wf, file, range->start, true);
auto end = std::end(syms); auto end = std::end(syms);
return std::find_if(std::begin(syms), end, [db](SymbolRef sym) { return std::find_if(std::begin(syms), end, [db](SymbolRef sym) {
return getSymbolKind(db, sym) == SymbolKind::Macro; return getSymbolKind(db, sym) == SymbolKind::Macro;
}) != end; }) != end;
}
return false;
} }
template <typename Def>
bool ignore(DB *db, WorkingFile *wf, QueryFile *file, const Def *def) {
return isPartOfMacroExpansion(db, wf, file, def);
}
template <>
bool ignore(DB *db, WorkingFile *wf, QueryFile *file,
const QueryType::Def *def) {
return !def || def->kind == SymbolKind::TypeParameter ||
isPartOfMacroExpansion(db, wf, file, def);
}
template <>
bool ignore(DB *db, WorkingFile *wf, QueryFile *file,
const QueryVar::Def *def) {
return !def || def->is_local() || isPartOfMacroExpansion(db, wf, file, def);
}
} // namespace
void MessageHandler::textDocument_documentSymbol(JsonReader &reader, void MessageHandler::textDocument_documentSymbol(JsonReader &reader,
ReplyOnce &reply) { ReplyOnce &reply) {
DocumentSymbolParam param; DocumentSymbolParam param;
@ -205,9 +217,8 @@ void MessageHandler::textDocument_documentSymbol(JsonReader &reader,
ds->detail = def->detailed_name; ds->detail = def->detailed_name;
ds->kind = def->kind; ds->kind = def->kind;
if (!ignore(def) && if (!ignore(db, wf, file, def) &&
(ds->kind == SymbolKind::Namespace || allows(sym)) && (ds->kind == SymbolKind::Namespace || allows(sym))) {
!is_macro_expansion(db, wf, file, *ds)) {
// Drop scopes which are before selectionRange.start. In // Drop scopes which are before selectionRange.start. In
// `int i, j, k;`, the scope of i will be ended by j. // `int i, j, k;`, the scope of i will be ended by j.
while (!scopes.empty() && while (!scopes.empty() &&
@ -230,8 +241,10 @@ void MessageHandler::textDocument_documentSymbol(JsonReader &reader,
continue; continue;
if (std::optional<SymbolInformation> info = if (std::optional<SymbolInformation> info =
getSymbolInfo(db, sym, false)) { getSymbolInfo(db, sym, false)) {
if ((sym.kind == Kind::Type && ignore(db->getType(sym).anyDef())) || if ((sym.kind == Kind::Type &&
(sym.kind == Kind::Var && ignore(db->getVar(sym).anyDef()))) ignore(db, wf, file, db->getType(sym).anyDef())) ||
(sym.kind == Kind::Var &&
ignore(db, wf, file, db->getVar(sym).anyDef())))
continue; continue;
if (auto loc = getLsLocation(db, wfiles, sym, file_id)) { if (auto loc = getLsLocation(db, wfiles, sym, file_id)) {
info->location = *loc; info->location = *loc;