mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-25 00:55:08 +00:00
remove part of macro expansion from ignore function
rename is_macro_expansion to isPartOfMacroExpansion
This commit is contained in:
parent
5208eb6be6
commit
0b57c9503d
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user