mirror of
https://github.com/MaskRay/ccls.git
synced 2025-06-07 16:54:54 +00:00
Fix outline of member definition in namespace
This commit is contained in:
parent
d0edae6ef4
commit
7f438dc999
@ -785,7 +785,10 @@ public:
|
|||||||
entity->def.spell = {use,
|
entity->def.spell = {use,
|
||||||
fromTokenRangeDefaulted(sm, lang, sr, fid, loc)};
|
fromTokenRangeDefaulted(sm, lang, sr, fid, loc)};
|
||||||
entity->def.parent_kind = SymbolKind::File;
|
entity->def.parent_kind = SymbolKind::File;
|
||||||
getKind(cast<Decl>(sem_dc), entity->def.parent_kind);
|
const Decl *dc = cast<Decl>(sem_dc);
|
||||||
|
if (Kind parent_kind = getKind(dc, entity->def.parent_kind);
|
||||||
|
parent_kind != Kind::Invalid)
|
||||||
|
entity->def.parent = {getUsr(dc), parent_kind};
|
||||||
} else if (is_decl) {
|
} else if (is_decl) {
|
||||||
SourceRange sr = origD->getSourceRange();
|
SourceRange sr = origD->getSourceRange();
|
||||||
entity->declarations.push_back(
|
entity->declarations.push_back(
|
||||||
@ -1205,7 +1208,7 @@ public:
|
|||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
const int IndexFile::kMajorVersion = 21;
|
const int IndexFile::kMajorVersion = 22;
|
||||||
const int IndexFile::kMinorVersion = 0;
|
const int IndexFile::kMinorVersion = 0;
|
||||||
|
|
||||||
IndexFile::IndexFile(const std::string &path, const std::string &contents,
|
IndexFile::IndexFile(const std::string &path, const std::string &contents,
|
||||||
|
@ -65,6 +65,8 @@ struct SymbolIdx {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
REFLECT_STRUCT(SymbolIdx, usr, kind);
|
||||||
|
|
||||||
// |id,kind| refer to the referenced entity.
|
// |id,kind| refer to the referenced entity.
|
||||||
struct SymbolRef {
|
struct SymbolRef {
|
||||||
Range range;
|
Range range;
|
||||||
@ -163,6 +165,7 @@ struct FuncDef : NameMixin<FuncDef<V>> {
|
|||||||
int16_t short_name_size = 0;
|
int16_t short_name_size = 0;
|
||||||
SymbolKind kind = SymbolKind::Unknown;
|
SymbolKind kind = SymbolKind::Unknown;
|
||||||
SymbolKind parent_kind = SymbolKind::Unknown;
|
SymbolKind parent_kind = SymbolKind::Unknown;
|
||||||
|
SymbolIdx parent = {0, Kind::Invalid};
|
||||||
uint8_t storage = clang::SC_None;
|
uint8_t storage = clang::SC_None;
|
||||||
|
|
||||||
const Usr *bases_begin() const { return bases.begin(); }
|
const Usr *bases_begin() const { return bases.begin(); }
|
||||||
@ -170,7 +173,7 @@ struct FuncDef : NameMixin<FuncDef<V>> {
|
|||||||
};
|
};
|
||||||
REFLECT_STRUCT(FuncDef<VectorAdapter>, detailed_name, hover, comments, spell,
|
REFLECT_STRUCT(FuncDef<VectorAdapter>, detailed_name, hover, comments, spell,
|
||||||
bases, vars, callees, qual_name_offset, short_name_offset,
|
bases, vars, callees, qual_name_offset, short_name_offset,
|
||||||
short_name_size, kind, parent_kind, storage);
|
short_name_size, kind, parent_kind, parent, storage);
|
||||||
|
|
||||||
struct IndexFunc : NameMixin<IndexFunc> {
|
struct IndexFunc : NameMixin<IndexFunc> {
|
||||||
using Def = FuncDef<VectorAdapter>;
|
using Def = FuncDef<VectorAdapter>;
|
||||||
@ -203,13 +206,14 @@ struct TypeDef : NameMixin<TypeDef<V>> {
|
|||||||
int16_t short_name_size = 0;
|
int16_t short_name_size = 0;
|
||||||
SymbolKind kind = SymbolKind::Unknown;
|
SymbolKind kind = SymbolKind::Unknown;
|
||||||
SymbolKind parent_kind = SymbolKind::Unknown;
|
SymbolKind parent_kind = SymbolKind::Unknown;
|
||||||
|
SymbolIdx parent = {0, Kind::Invalid};
|
||||||
|
|
||||||
const Usr *bases_begin() const { return bases.begin(); }
|
const Usr *bases_begin() const { return bases.begin(); }
|
||||||
const Usr *bases_end() const { return bases.end(); }
|
const Usr *bases_end() const { return bases.end(); }
|
||||||
};
|
};
|
||||||
REFLECT_STRUCT(TypeDef<VectorAdapter>, detailed_name, hover, comments, spell,
|
REFLECT_STRUCT(TypeDef<VectorAdapter>, detailed_name, hover, comments, spell,
|
||||||
bases, funcs, types, vars, alias_of, qual_name_offset,
|
bases, funcs, types, vars, alias_of, qual_name_offset,
|
||||||
short_name_offset, short_name_size, kind, parent_kind);
|
short_name_offset, short_name_size, kind, parent_kind, parent);
|
||||||
|
|
||||||
struct IndexType {
|
struct IndexType {
|
||||||
using Def = TypeDef<VectorAdapter>;
|
using Def = TypeDef<VectorAdapter>;
|
||||||
@ -236,6 +240,7 @@ struct VarDef : NameMixin<VarDef> {
|
|||||||
int16_t short_name_size = 0;
|
int16_t short_name_size = 0;
|
||||||
SymbolKind kind = SymbolKind::Unknown;
|
SymbolKind kind = SymbolKind::Unknown;
|
||||||
SymbolKind parent_kind = SymbolKind::Unknown;
|
SymbolKind parent_kind = SymbolKind::Unknown;
|
||||||
|
SymbolIdx parent = {0, Kind::Invalid};
|
||||||
// Note a variable may have instances of both |None| and |Extern|
|
// Note a variable may have instances of both |None| and |Extern|
|
||||||
// (declaration).
|
// (declaration).
|
||||||
uint8_t storage = clang::SC_None;
|
uint8_t storage = clang::SC_None;
|
||||||
@ -255,7 +260,7 @@ struct VarDef : NameMixin<VarDef> {
|
|||||||
};
|
};
|
||||||
REFLECT_STRUCT(VarDef, detailed_name, hover, comments, spell, type,
|
REFLECT_STRUCT(VarDef, detailed_name, hover, comments, spell, type,
|
||||||
qual_name_offset, short_name_offset, short_name_size, kind,
|
qual_name_offset, short_name_offset, short_name_size, kind,
|
||||||
parent_kind, storage);
|
parent_kind, parent, storage);
|
||||||
|
|
||||||
struct IndexVar {
|
struct IndexVar {
|
||||||
using Def = VarDef;
|
using Def = VarDef;
|
||||||
|
@ -247,6 +247,26 @@ void MessageHandler::textDocument_documentSymbol(JsonReader &reader,
|
|||||||
ds->children.push_back(std::move(it->second));
|
ds->children.push_back(std::move(it->second));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// put member definition in their namespace
|
||||||
|
// when definition is in separate file(cpp), we have NS -> Type -> member
|
||||||
|
// but the Type is not defined here(in .cpp), so we do NS -> member instead
|
||||||
|
for (auto &[sym, ds] : sym2ds) {
|
||||||
|
if (!ds)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
SymbolKind sym_kind = getSymbolKind(db, sym);
|
||||||
|
std::optional<SymbolIdx> ns;
|
||||||
|
bool is_member = sym_kind == SymbolKind::Field ||
|
||||||
|
sym_kind == SymbolKind::Method ||
|
||||||
|
sym_kind == SymbolKind::StaticMethod;
|
||||||
|
if (is_member && (ns = getNamespace(db, sym))) {
|
||||||
|
auto it = sym2ds.find(*ns);
|
||||||
|
if (it != sym2ds.end() && it->second)
|
||||||
|
it->second->children.push_back(std::move(ds));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
18
src/query.cc
18
src/query.cc
@ -90,6 +90,7 @@ QueryFunc::Def convert(const IndexFunc::Def &o) {
|
|||||||
r.short_name_size = o.short_name_size;
|
r.short_name_size = o.short_name_size;
|
||||||
r.kind = o.kind;
|
r.kind = o.kind;
|
||||||
r.parent_kind = o.parent_kind;
|
r.parent_kind = o.parent_kind;
|
||||||
|
r.parent = o.parent;
|
||||||
r.storage = o.storage;
|
r.storage = o.storage;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
@ -111,6 +112,7 @@ QueryType::Def convert(const IndexType::Def &o) {
|
|||||||
r.short_name_size = o.short_name_size;
|
r.short_name_size = o.short_name_size;
|
||||||
r.kind = o.kind;
|
r.kind = o.kind;
|
||||||
r.parent_kind = o.parent_kind;
|
r.parent_kind = o.parent_kind;
|
||||||
|
r.parent = o.parent;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -839,4 +841,20 @@ std::vector<SymbolRef> findSymbolsAtLocation(WorkingFile *wfile,
|
|||||||
|
|
||||||
return symbols;
|
return symbols;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<SymbolIdx> getNamespace(DB *db, SymbolIdx sym) {
|
||||||
|
SymbolKind kind;
|
||||||
|
do {
|
||||||
|
withEntity(db, sym,
|
||||||
|
[&sym](auto const &entity) { sym = entity.anyDef()->parent; });
|
||||||
|
kind = getSymbolKind(db, sym);
|
||||||
|
} while (kind != SymbolKind::Namespace && kind != SymbolKind::File &&
|
||||||
|
kind != SymbolKind::Unknown);
|
||||||
|
|
||||||
|
if (kind == SymbolKind::Namespace)
|
||||||
|
return sym;
|
||||||
|
else
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ccls
|
} // namespace ccls
|
||||||
|
@ -258,6 +258,8 @@ void eachOccurrence(DB *db, SymbolIdx sym, bool include_decl, Fn &&fn) {
|
|||||||
|
|
||||||
SymbolKind getSymbolKind(DB *db, SymbolIdx sym);
|
SymbolKind getSymbolKind(DB *db, SymbolIdx sym);
|
||||||
|
|
||||||
|
std::optional<SymbolIdx> getNamespace(DB *db, SymbolIdx sym);
|
||||||
|
|
||||||
template <typename C, typename Fn>
|
template <typename C, typename Fn>
|
||||||
void eachDefinedFunc(DB *db, const C &usrs, Fn &&fn) {
|
void eachDefinedFunc(DB *db, const C &usrs, Fn &&fn) {
|
||||||
for (Usr usr : usrs) {
|
for (Usr usr : usrs) {
|
||||||
|
@ -297,6 +297,7 @@ template <typename TVisitor> void reflect1(TVisitor &vis, IndexFunc &v) {
|
|||||||
REFLECT_MEMBER2("callees", v.def.callees);
|
REFLECT_MEMBER2("callees", v.def.callees);
|
||||||
REFLECT_MEMBER2("kind", v.def.kind);
|
REFLECT_MEMBER2("kind", v.def.kind);
|
||||||
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
||||||
|
REFLECT_MEMBER2("parent", v.def.parent);
|
||||||
REFLECT_MEMBER2("storage", v.def.storage);
|
REFLECT_MEMBER2("storage", v.def.storage);
|
||||||
|
|
||||||
REFLECT_MEMBER2("declarations", v.declarations);
|
REFLECT_MEMBER2("declarations", v.declarations);
|
||||||
@ -324,6 +325,7 @@ template <typename Vis> void reflect1(Vis &vis, IndexType &v) {
|
|||||||
REFLECT_MEMBER2("alias_of", v.def.alias_of);
|
REFLECT_MEMBER2("alias_of", v.def.alias_of);
|
||||||
REFLECT_MEMBER2("kind", v.def.kind);
|
REFLECT_MEMBER2("kind", v.def.kind);
|
||||||
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
||||||
|
REFLECT_MEMBER2("parent", v.def.parent);
|
||||||
|
|
||||||
REFLECT_MEMBER2("declarations", v.declarations);
|
REFLECT_MEMBER2("declarations", v.declarations);
|
||||||
REFLECT_MEMBER2("derived", v.derived);
|
REFLECT_MEMBER2("derived", v.derived);
|
||||||
@ -347,6 +349,7 @@ template <typename TVisitor> void reflect1(TVisitor &vis, IndexVar &v) {
|
|||||||
REFLECT_MEMBER2("type", v.def.type);
|
REFLECT_MEMBER2("type", v.def.type);
|
||||||
REFLECT_MEMBER2("kind", v.def.kind);
|
REFLECT_MEMBER2("kind", v.def.kind);
|
||||||
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
REFLECT_MEMBER2("parent_kind", v.def.parent_kind);
|
||||||
|
REFLECT_MEMBER2("parent", v.def.parent);
|
||||||
REFLECT_MEMBER2("storage", v.def.storage);
|
REFLECT_MEMBER2("storage", v.def.storage);
|
||||||
|
|
||||||
REFLECT_MEMBER2("declarations", v.declarations);
|
REFLECT_MEMBER2("declarations", v.declarations);
|
||||||
|
Loading…
Reference in New Issue
Block a user