mirror of
https://github.com/MaskRay/ccls.git
synced 2025-01-19 03:55:49 +00:00
Change TypeDefDefinition::short_name from string to string_view
This commit is contained in:
parent
93269ecfd4
commit
77dca1936b
@ -411,11 +411,16 @@ void SetTypeName(IndexType* type,
|
|||||||
CXIdxContainerInfo parent;
|
CXIdxContainerInfo parent;
|
||||||
// |name| can be null in an anonymous struct (see
|
// |name| can be null in an anonymous struct (see
|
||||||
// tests/types/anonymous_struct.cc).
|
// tests/types/anonymous_struct.cc).
|
||||||
type->def.short_name = name ? name : "(anon)";
|
if (!name)
|
||||||
|
name = "(anon)";
|
||||||
if (!container)
|
if (!container)
|
||||||
parent.cursor = cursor.get_semantic_parent().cx_cursor;
|
parent.cursor = cursor.get_semantic_parent().cx_cursor;
|
||||||
type->def.detailed_name =
|
type->def.detailed_name =
|
||||||
ns->QualifiedName(container ? container : &parent, type->def.short_name);
|
ns->QualifiedName(container ? container : &parent, name);
|
||||||
|
auto idx = type->def.detailed_name.find(name);
|
||||||
|
assert(idx != std::string::npos);
|
||||||
|
type->def.short_name_offset = idx;
|
||||||
|
type->def.short_name_size = strlen(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finds the cursor associated with the declaration type of |cursor|. This
|
// Finds the cursor associated with the declaration type of |cursor|. This
|
||||||
@ -452,7 +457,7 @@ optional<IndexTypeId> ResolveToDeclarationType(IndexFile* db,
|
|||||||
clang_disposeString(cx_usr);
|
clang_disposeString(cx_usr);
|
||||||
IndexTypeId type_id = db->ToTypeId(usr);
|
IndexTypeId type_id = db->ToTypeId(usr);
|
||||||
IndexType* typ = db->Resolve(type_id);
|
IndexType* typ = db->Resolve(type_id);
|
||||||
if (typ->def.short_name.empty()) {
|
if (typ->def.detailed_name.empty()) {
|
||||||
std::string name = declaration.get_spelling();
|
std::string name = declaration.get_spelling();
|
||||||
SetTypeName(typ, declaration, nullptr, name.c_str(), ns);
|
SetTypeName(typ, declaration, nullptr, name.c_str(), ns);
|
||||||
}
|
}
|
||||||
@ -846,7 +851,7 @@ void VisitDeclForTypeUsageVisitorHandler(ClangCursor cursor,
|
|||||||
if (param->toplevel_type) {
|
if (param->toplevel_type) {
|
||||||
IndexType* ref_type = db->Resolve(*param->toplevel_type);
|
IndexType* ref_type = db->Resolve(*param->toplevel_type);
|
||||||
std::string name = cursor.get_referenced().get_spelling();
|
std::string name = cursor.get_referenced().get_spelling();
|
||||||
if (name == ref_type->def.short_name) {
|
if (name == ref_type->def.ShortName()) {
|
||||||
UniqueAdd(ref_type->uses, cursor.get_spelling_range());
|
UniqueAdd(ref_type->uses, cursor.get_spelling_range());
|
||||||
param->toplevel_type = nullopt;
|
param->toplevel_type = nullopt;
|
||||||
return;
|
return;
|
||||||
@ -1240,11 +1245,12 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
|||||||
// CXCursor_TemplateTemplateParameter can be visited by visiting
|
// CXCursor_TemplateTemplateParameter can be visited by visiting
|
||||||
// CXCursor_TranslationUnit, but not (confirm this) by visiting
|
// CXCursor_TranslationUnit, but not (confirm this) by visiting
|
||||||
// {Class,Function}Template. Thus we need to initialize it here.
|
// {Class,Function}Template. Thus we need to initialize it here.
|
||||||
if (ref_index->def.short_name.empty()) {
|
if (ref_index->def.detailed_name.empty()) {
|
||||||
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
||||||
ref_index->def.definition_extent = ref_cursor.get_extent();
|
ref_index->def.definition_extent = ref_cursor.get_extent();
|
||||||
ref_index->def.short_name = ref_cursor.get_spelling();
|
ref_index->def.detailed_name = ref_cursor.get_spelling();
|
||||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
ref_index->def.short_name_offset = 0;
|
||||||
|
ref_index->def.short_name_size = ref_index->def.detailed_name.size();
|
||||||
}
|
}
|
||||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||||
}
|
}
|
||||||
@ -1260,11 +1266,12 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
|||||||
// CXCursor_TemplateTypeParameter can be visited by visiting
|
// CXCursor_TemplateTypeParameter can be visited by visiting
|
||||||
// CXCursor_TranslationUnit, but not (confirm this) by visiting
|
// CXCursor_TranslationUnit, but not (confirm this) by visiting
|
||||||
// {Class,Function}Template. Thus we need to initialize it here.
|
// {Class,Function}Template. Thus we need to initialize it here.
|
||||||
if (ref_index->def.short_name.empty()) {
|
if (ref_index->def.detailed_name.empty()) {
|
||||||
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
||||||
ref_index->def.definition_extent = ref_cursor.get_extent();
|
ref_index->def.definition_extent = ref_cursor.get_extent();
|
||||||
ref_index->def.short_name = ref_cursor.get_spelling();
|
ref_index->def.detailed_name = ref_cursor.get_spelling();
|
||||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
ref_index->def.short_name_offset = 0;
|
||||||
|
ref_index->def.short_name_size = ref_index->def.detailed_name.size();
|
||||||
}
|
}
|
||||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||||
}
|
}
|
||||||
@ -1378,7 +1385,7 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
|||||||
IndexTypeId ns_id = db->ToTypeId(HashUsr(decl->entityInfo->USR));
|
IndexTypeId ns_id = db->ToTypeId(HashUsr(decl->entityInfo->USR));
|
||||||
IndexType* ns = db->Resolve(ns_id);
|
IndexType* ns = db->Resolve(ns_id);
|
||||||
ns->def.kind = GetSymbolKind(decl->entityInfo->kind);
|
ns->def.kind = GetSymbolKind(decl->entityInfo->kind);
|
||||||
if (ns->def.short_name.empty()) {
|
if (ns->def.detailed_name.empty()) {
|
||||||
SetTypeName(ns, decl_cursor, decl->semanticContainer,
|
SetTypeName(ns, decl_cursor, decl->semanticContainer,
|
||||||
decl->entityInfo->name, ¶m->ns);
|
decl->entityInfo->name, ¶m->ns);
|
||||||
ns->def.definition_spelling = decl_spell;
|
ns->def.definition_spelling = decl_spell;
|
||||||
@ -1717,9 +1724,9 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
|||||||
// template<class T> class function; // not visited by
|
// template<class T> class function; // not visited by
|
||||||
// OnIndexDeclaration template<> class function<int> {}; // current
|
// OnIndexDeclaration template<> class function<int> {}; // current
|
||||||
// cursor
|
// cursor
|
||||||
if (origin->def.short_name.empty()) {
|
if (origin->def.detailed_name.empty()) {
|
||||||
SetTypeName(origin, origin_cursor, nullptr,
|
SetTypeName(origin, origin_cursor, nullptr,
|
||||||
type->def.short_name.c_str(), ns);
|
&type->def.ShortName()[0], ns);
|
||||||
origin->def.kind = type->def.kind;
|
origin->def.kind = type->def.kind;
|
||||||
}
|
}
|
||||||
// TODO The name may be assigned in |ResolveToDeclarationType| but
|
// TODO The name may be assigned in |ResolveToDeclarationType| but
|
||||||
|
@ -154,7 +154,6 @@ inline void Reflect(Writer& visitor, IndexFuncRef& value) {
|
|||||||
template <typename TypeId, typename FuncId, typename VarId, typename Range>
|
template <typename TypeId, typename FuncId, typename VarId, typename Range>
|
||||||
struct TypeDefDefinitionData {
|
struct TypeDefDefinitionData {
|
||||||
// General metadata.
|
// General metadata.
|
||||||
std::string short_name;
|
|
||||||
std::string detailed_name;
|
std::string detailed_name;
|
||||||
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
||||||
optional<std::string> hover;
|
optional<std::string> hover;
|
||||||
@ -184,6 +183,9 @@ struct TypeDefDefinitionData {
|
|||||||
std::vector<FuncId> funcs;
|
std::vector<FuncId> funcs;
|
||||||
std::vector<VarId> vars;
|
std::vector<VarId> vars;
|
||||||
|
|
||||||
|
int16_t short_name_offset = 0;
|
||||||
|
int16_t short_name_size = 0;
|
||||||
|
|
||||||
bool operator==(
|
bool operator==(
|
||||||
const TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& other) const {
|
const TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& other) const {
|
||||||
return detailed_name == other.detailed_name && hover == other.hover &&
|
return detailed_name == other.detailed_name && hover == other.hover &&
|
||||||
@ -198,6 +200,11 @@ struct TypeDefDefinitionData {
|
|||||||
const TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& other) const {
|
const TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& other) const {
|
||||||
return !(*this == other);
|
return !(*this == other);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string_view ShortName() const {
|
||||||
|
return std::string_view(detailed_name.c_str() + short_name_offset,
|
||||||
|
short_name_size);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
template <typename TVisitor,
|
template <typename TVisitor,
|
||||||
typename TypeId,
|
typename TypeId,
|
||||||
@ -207,8 +214,9 @@ template <typename TVisitor,
|
|||||||
void Reflect(TVisitor& visitor,
|
void Reflect(TVisitor& visitor,
|
||||||
TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& value) {
|
TypeDefDefinitionData<TypeId, FuncId, VarId, Range>& value) {
|
||||||
REFLECT_MEMBER_START();
|
REFLECT_MEMBER_START();
|
||||||
REFLECT_MEMBER(short_name);
|
|
||||||
REFLECT_MEMBER(detailed_name);
|
REFLECT_MEMBER(detailed_name);
|
||||||
|
REFLECT_MEMBER(short_name_offset);
|
||||||
|
REFLECT_MEMBER(short_name_size);
|
||||||
REFLECT_MEMBER(kind);
|
REFLECT_MEMBER(kind);
|
||||||
REFLECT_MEMBER(hover);
|
REFLECT_MEMBER(hover);
|
||||||
REFLECT_MEMBER(comments);
|
REFLECT_MEMBER(comments);
|
||||||
@ -273,8 +281,8 @@ struct FuncDefDefinitionData {
|
|||||||
// Functions that this function calls.
|
// Functions that this function calls.
|
||||||
std::vector<FuncRef> callees;
|
std::vector<FuncRef> callees;
|
||||||
|
|
||||||
int16_t short_name_offset;
|
int16_t short_name_offset = 0;
|
||||||
int16_t short_name_size;
|
int16_t short_name_size = 0;
|
||||||
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
||||||
StorageClass storage = StorageClass::Invalid;
|
StorageClass storage = StorageClass::Invalid;
|
||||||
|
|
||||||
@ -392,8 +400,8 @@ struct VarDefDefinitionData {
|
|||||||
|
|
||||||
// Function/type which declares this one.
|
// Function/type which declares this one.
|
||||||
size_t parent_id = size_t(-1);
|
size_t parent_id = size_t(-1);
|
||||||
int16_t short_name_offset;
|
int16_t short_name_offset = 0;
|
||||||
int16_t short_name_size;
|
int16_t short_name_size = 0;
|
||||||
SymbolKind parent_kind = SymbolKind::Invalid;
|
SymbolKind parent_kind = SymbolKind::Invalid;
|
||||||
|
|
||||||
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
ClangSymbolKind kind = ClangSymbolKind::Unknown;
|
||||||
|
@ -47,7 +47,7 @@ BuildInitial(QueryDatabase* db, WorkingFiles* working_files, QueryTypeId root) {
|
|||||||
return {};
|
return {};
|
||||||
|
|
||||||
Out_CqueryMemberHierarchy::Entry entry;
|
Out_CqueryMemberHierarchy::Entry entry;
|
||||||
entry.name = root_type.def->short_name;
|
entry.name = std::string(root_type.def->ShortName());
|
||||||
entry.type_id = root.id;
|
entry.type_id = root.id;
|
||||||
entry.location = *def_loc;
|
entry.location = *def_loc;
|
||||||
return {entry};
|
return {entry};
|
||||||
|
@ -161,7 +161,7 @@ optional<lsTextEdit> BuildAutoImplementForFunction(QueryDatabase* db,
|
|||||||
if (func.def->declaring_type) {
|
if (func.def->declaring_type) {
|
||||||
QueryType& declaring_type = db->types[func.def->declaring_type->id];
|
QueryType& declaring_type = db->types[func.def->declaring_type->id];
|
||||||
if (declaring_type.def) {
|
if (declaring_type.def) {
|
||||||
type_name = declaring_type.def->short_name;
|
type_name = std::string(declaring_type.def->ShortName());
|
||||||
optional<lsRange> ls_type_def_extent = GetLsRange(
|
optional<lsRange> ls_type_def_extent = GetLsRange(
|
||||||
working_file, declaring_type.def->definition_extent->range);
|
working_file, declaring_type.def->definition_extent->range);
|
||||||
if (ls_type_def_extent) {
|
if (ls_type_def_extent) {
|
||||||
@ -390,7 +390,7 @@ struct TextDocumentCodeActionHandler
|
|||||||
|
|
||||||
command.arguments.textDocumentUri = *impl_uri;
|
command.arguments.textDocumentUri = *impl_uri;
|
||||||
command.title = "Auto-Implement " + std::to_string(num_edits) +
|
command.title = "Auto-Implement " + std::to_string(num_edits) +
|
||||||
" methods on " + type.def->short_name;
|
" methods on " + std::string(type.def->ShortName());
|
||||||
command.command = "cquery._autoImplement";
|
command.command = "cquery._autoImplement";
|
||||||
out.result.push_back(command);
|
out.result.push_back(command);
|
||||||
break;
|
break;
|
||||||
|
@ -36,8 +36,9 @@ optional<QueryType::Def> ToQuery(const IdMap& id_map,
|
|||||||
return nullopt;
|
return nullopt;
|
||||||
|
|
||||||
QueryType::Def result;
|
QueryType::Def result;
|
||||||
result.short_name = type.short_name;
|
|
||||||
result.detailed_name = type.detailed_name;
|
result.detailed_name = type.detailed_name;
|
||||||
|
result.short_name_offset = type.short_name_offset;
|
||||||
|
result.short_name_size = type.short_name_size;
|
||||||
result.kind = type.kind;
|
result.kind = type.kind;
|
||||||
result.hover = type.hover;
|
result.hover = type.hover;
|
||||||
result.comments = type.comments;
|
result.comments = type.comments;
|
||||||
@ -883,7 +884,7 @@ void QueryDatabase::ImportOrUpdate(
|
|||||||
|
|
||||||
existing.def = def.value;
|
existing.def = def.value;
|
||||||
UpdateDetailedNames(&existing.detailed_name_idx, SymbolKind::Type,
|
UpdateDetailedNames(&existing.detailed_name_idx, SymbolKind::Type,
|
||||||
it->second.id, def.value.short_name,
|
it->second.id, std::string(def.value.ShortName()),
|
||||||
def.value.detailed_name);
|
def.value.detailed_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,8 +440,8 @@ optional<lsSymbolInformation> GetSymbolInfo(QueryDatabase* db,
|
|||||||
|
|
||||||
lsSymbolInformation info;
|
lsSymbolInformation info;
|
||||||
info.name =
|
info.name =
|
||||||
use_short_name ? type.def->short_name : type.def->detailed_name;
|
use_short_name ? std::string(type.def->ShortName()) : type.def->detailed_name;
|
||||||
if (type.def->detailed_name != type.def->short_name)
|
if (type.def->detailed_name != type.def->ShortName())
|
||||||
info.containerName = type.def->detailed_name;
|
info.containerName = type.def->detailed_name;
|
||||||
// TODO ClangSymbolKind -> lsSymbolKind
|
// TODO ClangSymbolKind -> lsSymbolKind
|
||||||
switch (type.def->kind) {
|
switch (type.def->kind) {
|
||||||
|
@ -155,8 +155,9 @@ void Reflect(TVisitor& visitor, IndexType& value) {
|
|||||||
REFLECT_MEMBER_START();
|
REFLECT_MEMBER_START();
|
||||||
REFLECT_MEMBER2("id", value.id);
|
REFLECT_MEMBER2("id", value.id);
|
||||||
REFLECT_MEMBER2("usr", value.usr);
|
REFLECT_MEMBER2("usr", value.usr);
|
||||||
REFLECT_MEMBER2("short_name", value.def.short_name);
|
|
||||||
REFLECT_MEMBER2("detailed_name", value.def.detailed_name);
|
REFLECT_MEMBER2("detailed_name", value.def.detailed_name);
|
||||||
|
REFLECT_MEMBER2("short_name_offset", value.def.short_name_offset);
|
||||||
|
REFLECT_MEMBER2("short_name_size", value.def.short_name_size);
|
||||||
REFLECT_MEMBER2("kind", value.def.kind);
|
REFLECT_MEMBER2("kind", value.def.kind);
|
||||||
REFLECT_MEMBER2("hover", value.def.hover);
|
REFLECT_MEMBER2("hover", value.def.hover);
|
||||||
REFLECT_MEMBER2("comments", value.def.comments);
|
REFLECT_MEMBER2("comments", value.def.comments);
|
||||||
@ -224,7 +225,7 @@ bool ReflectMemberStart(Writer& visitor, IndexFile& value) {
|
|||||||
// FIXME
|
// FIXME
|
||||||
auto it = value.id_cache.usr_to_type_id.find(HashUsr(""));
|
auto it = value.id_cache.usr_to_type_id.find(HashUsr(""));
|
||||||
if (it != value.id_cache.usr_to_type_id.end()) {
|
if (it != value.id_cache.usr_to_type_id.end()) {
|
||||||
value.Resolve(it->second)->def.short_name = "<fundamental>";
|
value.Resolve(it->second)->def.detailed_name = "<fundamental>";
|
||||||
assert(value.Resolve(it->second)->uses.size() == 0);
|
assert(value.Resolve(it->second)->uses.size() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user