mirror of
https://github.com/MaskRay/ccls.git
synced 2024-11-22 23:55:08 +00:00
Better template specialization
This commit is contained in:
parent
fb3cd89b05
commit
777193d02f
@ -1698,15 +1698,42 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
|
|||||||
type = db->Resolve(type_id);
|
type = db->Resolve(type_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
UniqueAdd(type->uses, decl_spell);
|
UniqueAdd(type->uses, decl_spell);
|
||||||
|
|
||||||
if (decl->entityInfo->templateKind == CXIdxEntity_Template) {
|
switch (decl->entityInfo->templateKind) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
case CXIdxEntity_Template: {
|
||||||
TemplateVisitorData data;
|
TemplateVisitorData data;
|
||||||
data.db = db;
|
data.db = db;
|
||||||
data.container = decl_cursor;
|
data.container = decl_cursor;
|
||||||
data.param = param;
|
data.param = param;
|
||||||
decl_cursor.VisitChildren(&TemplateVisitor, &data);
|
decl_cursor.VisitChildren(&TemplateVisitor, &data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CXIdxEntity_TemplateSpecialization:
|
||||||
|
case CXIdxEntity_TemplatePartialSpecialization: {
|
||||||
|
// TODO Use a different dimension
|
||||||
|
ClangCursor origin_cursor =
|
||||||
|
decl_cursor.template_specialization_to_template_definition();
|
||||||
|
IndexTypeId origin_id = db->ToTypeId(origin_cursor.get_usr_hash());
|
||||||
|
IndexType* origin = db->Resolve(origin_id);
|
||||||
|
// |type| may be invalidated.
|
||||||
|
type = db->Resolve(type_id);
|
||||||
|
// template<class T> class function; // not visited by OnIndexDeclaration
|
||||||
|
// template<> class function<int> {}; // current cursor
|
||||||
|
if (origin->def.short_name.empty()) {
|
||||||
|
SetTypeName(origin, origin_cursor, nullptr,
|
||||||
|
type->def.short_name.c_str(), ns);
|
||||||
|
origin->def.kind = type->def.kind;
|
||||||
|
origin->def.definition_spelling = origin_cursor.get_spelling_range();
|
||||||
|
origin->def.definition_extent = origin_cursor.get_extent();
|
||||||
|
}
|
||||||
|
origin->derived.push_back(type_id);
|
||||||
|
type->def.parents.push_back(origin_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// type_def->alias_of
|
// type_def->alias_of
|
||||||
@ -1952,22 +1979,6 @@ void OnIndexReference(CXClientData client_data, const CXIdxEntityRefInfo* ref) {
|
|||||||
ref_cursor = ref_cursor.template_specialization_to_template_definition();
|
ref_cursor = ref_cursor.template_specialization_to_template_definition();
|
||||||
IndexType* ref_type = db->Resolve(db->ToTypeId(ref_cursor.get_usr_hash()));
|
IndexType* ref_type = db->Resolve(db->ToTypeId(ref_cursor.get_usr_hash()));
|
||||||
|
|
||||||
// TODO
|
|
||||||
// This example is handled by OnIndexReference, not OnIndexDeclaration,
|
|
||||||
// and it does not have |short_name|.
|
|
||||||
//
|
|
||||||
// template <class T> class A;
|
|
||||||
if (ref_type->def.short_name.empty()) {
|
|
||||||
// TODO Replace |nullptr| with semantic container.
|
|
||||||
SetTypeName(ref_type, ref_cursor, nullptr, ref->referencedEntity->name,
|
|
||||||
¶m->ns);
|
|
||||||
// if (!ref_type->def.definition_spelling) {
|
|
||||||
// ref_type->def.definition_spelling = ref_cursor.get_spelling_range();
|
|
||||||
// ref_type->def.definition_extent = ref_cursor.get_extent();
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// The following will generate two TypeRefs to Foo, both located at the
|
// The following will generate two TypeRefs to Foo, both located at the
|
||||||
// same spot (line 3, column 3). One of the parents will be set to
|
// same spot (line 3, column 3). One of the parents will be set to
|
||||||
// CXIdxEntity_Variable, the other will be CXIdxEntity_Function. There
|
// CXIdxEntity_Variable, the other will be CXIdxEntity_Function. There
|
||||||
|
Loading…
Reference in New Issue
Block a user