documentSymbol: ignore TypeParameter

Reported by Riatre
This commit is contained in:
Fangrui Song 2018-09-23 10:20:05 -07:00
parent e320ce42ab
commit 71e9835b8c

View File

@ -76,6 +76,14 @@ struct Out_HierarchicalDocumentSymbol
};
MAKE_REFLECT_STRUCT(Out_HierarchicalDocumentSymbol, jsonrpc, id, result);
bool IgnoreType(const QueryType::Def *def) {
return !def || def->kind == lsSymbolKind::TypeParameter;
}
bool IgnoreVar(const QueryVar::Def *def) {
return !def || def->is_local();
}
struct Handler_TextDocumentDocumentSymbol
: BaseMessageHandler<In_TextDocumentDocumentSymbol> {
MethodType GetMethodType() const override { return kMethodType; }
@ -140,9 +148,11 @@ struct Handler_TextDocumentDocumentSymbol
kv.first = static_cast<const void *>(&def);
}
});
if (kv.first && sym.kind == SymbolKind::Var)
if (static_cast<const QueryVar::Def *>(kv.first)->is_local())
kv.first = nullptr;
if (kv.first && ((sym.kind == SymbolKind::Type &&
IgnoreType((const QueryType::Def *)kv.first)) ||
(sym.kind == SymbolKind::Var &&
IgnoreVar((const QueryVar::Def *)kv.first))))
kv.first = nullptr;
if (!kv.first) {
kv.second.reset();
continue;
@ -198,12 +208,11 @@ struct Handler_TextDocumentDocumentSymbol
if (refcnt <= 0) continue;
if (std::optional<lsSymbolInformation> info =
GetSymbolInfo(db, sym, false)) {
if (sym.kind == SymbolKind::Var) {
QueryVar &var = db->GetVar(sym);
auto *def = var.AnyDef();
if (!def || !def->spell || def->is_local())
continue;
}
if ((sym.kind == SymbolKind::Type &&
IgnoreType(db->GetType(sym).AnyDef())) ||
(sym.kind == SymbolKind::Var &&
IgnoreVar(db->GetVar(sym).AnyDef())))
continue;
if (std::optional<lsLocation> location = GetLsLocation(
db, working_files,
Use{{sym.range, sym.usr, sym.kind, sym.role}, file_id})) {