mirror of
https://github.com/MaskRay/ccls.git
synced 2025-02-07 17:32:14 +00:00
[indexer] Add uses of types of (non-type template parameter)
This commit is contained in:
parent
93f92d57b7
commit
9dc34103d8
@ -995,22 +995,25 @@ struct TemplateVisitorData {
|
|||||||
ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
||||||
ClangCursor parent,
|
ClangCursor parent,
|
||||||
TemplateVisitorData* data) {
|
TemplateVisitorData* data) {
|
||||||
|
IndexFile* db = data->db;
|
||||||
switch (cursor.get_kind()) {
|
switch (cursor.get_kind()) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case CXCursor_DeclRefExpr: {
|
case CXCursor_DeclRefExpr: {
|
||||||
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
||||||
if (ref_cursor.get_kind() == CXCursor_NonTypeTemplateParameter) {
|
if (ref_cursor.get_kind() == CXCursor_NonTypeTemplateParameter) {
|
||||||
IndexVar* ref_index =
|
IndexVar* ref_index = db->Resolve(db->ToVarId(ref_cursor.get_usr()));
|
||||||
data->db->Resolve(data->db->ToVarId(ref_cursor.get_usr()));
|
|
||||||
if (ref_index->def.short_name.empty()) {
|
if (ref_index->def.short_name.empty()) {
|
||||||
ref_index->def.definition_spelling =
|
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
||||||
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.short_name = ref_cursor.get_spelling();
|
||||||
SetVarDetail(ref_index, ref_cursor, nullptr, true, data->db, data->param);
|
SetVarDetail(ref_index, ref_cursor, nullptr, true, db, data->param);
|
||||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||||
|
|
||||||
|
ClangType ref_type = clang_getCursorType(ref_cursor.cx_cursor);
|
||||||
|
IndexType* ref_type_index =
|
||||||
|
db->Resolve(db->ToTypeId(ref_type.get_usr()));
|
||||||
|
ref_type_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||||
}
|
}
|
||||||
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
UniqueAdd(ref_index->uses, cursor.get_spelling_range());
|
||||||
}
|
}
|
||||||
@ -1026,10 +1029,9 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
|||||||
case CXCursor_FunctionDecl:
|
case CXCursor_FunctionDecl:
|
||||||
case CXCursor_FunctionTemplate: {
|
case CXCursor_FunctionTemplate: {
|
||||||
std::string ref_usr = overloaded.get_usr();
|
std::string ref_usr = overloaded.get_usr();
|
||||||
IndexFuncId called_id = data->db->ToFuncId(ref_usr);
|
IndexFuncId called_id = db->ToFuncId(ref_usr);
|
||||||
IndexFunc* called = data->db->Resolve(called_id);
|
IndexFunc* called = db->Resolve(called_id);
|
||||||
OnIndexReference_Function(data->db,
|
OnIndexReference_Function(db, cursor.get_spelling_range(),
|
||||||
cursor.get_spelling_range(),
|
|
||||||
data->container, called_id, called,
|
data->container, called_id, called,
|
||||||
/*implicit=*/false);
|
/*implicit=*/false);
|
||||||
break;
|
break;
|
||||||
@ -1041,18 +1043,15 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
|||||||
case CXCursor_TemplateRef: {
|
case CXCursor_TemplateRef: {
|
||||||
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
||||||
if (ref_cursor.get_kind() == CXCursor_TemplateTemplateParameter) {
|
if (ref_cursor.get_kind() == CXCursor_TemplateTemplateParameter) {
|
||||||
IndexType* ref_index =
|
IndexType* ref_index = db->Resolve(db->ToTypeId(ref_cursor.get_usr()));
|
||||||
data->db->Resolve(data->db->ToTypeId(ref_cursor.get_usr()));
|
|
||||||
// TODO It seems difficult to get references to template template
|
// TODO It seems difficult to get references to template template
|
||||||
// parameters.
|
// parameters.
|
||||||
// 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.short_name.empty()) {
|
||||||
ref_index->def.definition_spelling =
|
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
||||||
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.short_name = ref_cursor.get_spelling();
|
||||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
ref_index->def.detailed_name = ref_index->def.short_name;
|
||||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||||
@ -1064,18 +1063,15 @@ ClangCursor::VisitResult TemplateVisitor(ClangCursor cursor,
|
|||||||
case CXCursor_TypeRef: {
|
case CXCursor_TypeRef: {
|
||||||
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
ClangCursor ref_cursor = clang_getCursorReferenced(cursor.cx_cursor);
|
||||||
if (ref_cursor.get_kind() == CXCursor_TemplateTypeParameter) {
|
if (ref_cursor.get_kind() == CXCursor_TemplateTypeParameter) {
|
||||||
IndexType* ref_index =
|
IndexType* ref_index = db->Resolve(db->ToTypeId(ref_cursor.get_usr()));
|
||||||
data->db->Resolve(data->db->ToTypeId(ref_cursor.get_usr()));
|
|
||||||
// TODO It seems difficult to get a FunctionTemplate's template
|
// TODO It seems difficult to get a FunctionTemplate's template
|
||||||
// parameters.
|
// parameters.
|
||||||
// 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.short_name.empty()) {
|
||||||
ref_index->def.definition_spelling =
|
ref_index->def.definition_spelling = ref_cursor.get_spelling_range();
|
||||||
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.short_name = ref_cursor.get_spelling();
|
||||||
ref_index->def.detailed_name = ref_index->def.short_name;
|
ref_index->def.detailed_name = ref_index->def.short_name;
|
||||||
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
ref_index->uses.push_back(ref_cursor.get_spelling_range());
|
||||||
|
Loading…
Reference in New Issue
Block a user