mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-25 09:05:10 +00:00
hierarchicalDocumentSymbol: support SymbolKind::Function declaration and uniquify by range
Also ensure selectionRange is a subrange of range, otherwise VSCode won't show the item. Use detailed_name for 'detail'
This commit is contained in:
parent
89faa7a6ef
commit
95bba3ed15
@ -89,6 +89,9 @@ struct Position {
|
|||||||
bool operator<(const Position &o) const {
|
bool operator<(const Position &o) const {
|
||||||
return line != o.line ? line < o.line : character < o.character;
|
return line != o.line ? line < o.line : character < o.character;
|
||||||
}
|
}
|
||||||
|
bool operator<=(const Position &o) const {
|
||||||
|
return line != o.line ? line < o.line : character <= o.character;
|
||||||
|
}
|
||||||
std::string ToString() const;
|
std::string ToString() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -125,6 +125,16 @@ template<>
|
|||||||
bool Ignore(const QueryVar::Def *def) {
|
bool Ignore(const QueryVar::Def *def) {
|
||||||
return !def || def->is_local();
|
return !def || def->is_local();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Uniquify(std::vector<std::unique_ptr<DocumentSymbol>> &cs) {
|
||||||
|
std::sort(cs.begin(), cs.end(),
|
||||||
|
[](auto &l, auto &r) { return l->range < r->range; });
|
||||||
|
cs.erase(std::unique(cs.begin(), cs.end(),
|
||||||
|
[](auto &l, auto &r) { return l->range == r->range; }),
|
||||||
|
cs.end());
|
||||||
|
for (auto &c : cs)
|
||||||
|
Uniquify(c->children);
|
||||||
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
||||||
@ -165,8 +175,13 @@ void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
|||||||
if (auto range = GetLsRange(wfile, sym.range)) {
|
if (auto range = GetLsRange(wfile, sym.range)) {
|
||||||
ds->selectionRange = *range;
|
ds->selectionRange = *range;
|
||||||
ds->range = ds->selectionRange;
|
ds->range = ds->selectionRange;
|
||||||
|
// For a macro expansion, M(name), we may use `M` for extent and `name`
|
||||||
|
// for spell, do the check as selectionRange must be a subrange of
|
||||||
|
// range.
|
||||||
if (sym.extent.Valid())
|
if (sym.extent.Valid())
|
||||||
if (auto range1 = GetLsRange(wfile, sym.extent))
|
if (auto range1 = GetLsRange(wfile, sym.extent);
|
||||||
|
range1 && range1->start <= range->start &&
|
||||||
|
range->end <= range1->end)
|
||||||
ds->range = *range1;
|
ds->range = *range1;
|
||||||
}
|
}
|
||||||
std::vector<const void *> def_ptrs;
|
std::vector<const void *> def_ptrs;
|
||||||
@ -175,7 +190,7 @@ void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
|||||||
if (!def)
|
if (!def)
|
||||||
return;
|
return;
|
||||||
ds->name = def->Name(false);
|
ds->name = def->Name(false);
|
||||||
ds->detail = def->Name(true);
|
ds->detail = def->detailed_name;
|
||||||
for (auto &def : entity.def)
|
for (auto &def : entity.def)
|
||||||
if (def.file_id == file_id && !Ignore(&def)) {
|
if (def.file_id == file_id && !Ignore(&def)) {
|
||||||
ds->kind = def.kind;
|
ds->kind = def.kind;
|
||||||
@ -184,6 +199,7 @@ void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (!(param.all || sym.role & Role::Definition ||
|
if (!(param.all || sym.role & Role::Definition ||
|
||||||
|
ds->kind == SymbolKind::Function ||
|
||||||
ds->kind == SymbolKind::Method ||
|
ds->kind == SymbolKind::Method ||
|
||||||
ds->kind == SymbolKind::Namespace)) {
|
ds->kind == SymbolKind::Namespace)) {
|
||||||
ds.reset();
|
ds.reset();
|
||||||
@ -225,8 +241,11 @@ void MessageHandler::textDocument_documentSymbol(Reader &reader,
|
|||||||
}
|
}
|
||||||
std::vector<std::unique_ptr<DocumentSymbol>> result;
|
std::vector<std::unique_ptr<DocumentSymbol>> result;
|
||||||
for (auto &[_, ds] : sym2ds)
|
for (auto &[_, ds] : sym2ds)
|
||||||
if (ds)
|
if (ds) {
|
||||||
|
Uniquify(ds->children);
|
||||||
result.push_back(std::move(ds));
|
result.push_back(std::move(ds));
|
||||||
|
}
|
||||||
|
Uniquify(result);
|
||||||
reply(result);
|
reply(result);
|
||||||
} else {
|
} else {
|
||||||
std::vector<SymbolInformation> result;
|
std::vector<SymbolInformation> result;
|
||||||
|
Loading…
Reference in New Issue
Block a user