Index namespaces as Type

This commit is contained in:
Fangrui Song 2018-01-24 00:19:42 -08:00
parent 98d75ae79c
commit c4e8db2964
2 changed files with 39 additions and 3 deletions

View File

@ -758,6 +758,7 @@ bool IsTypeDefinition(const CXIdxContainerInfo* container) {
return false; return false;
switch (container->cursor.kind) { switch (container->cursor.kind) {
case CXCursor_Namespace:
case CXCursor_EnumDecl: case CXCursor_EnumDecl:
case CXCursor_UnionDecl: case CXCursor_UnionDecl:
case CXCursor_StructDecl: case CXCursor_StructDecl:
@ -1293,8 +1294,33 @@ void OnIndexDeclaration(CXClientData client_data, const CXIdxDeclInfo* decl) {
NamespaceHelper* ns = &param->ns; NamespaceHelper* ns = &param->ns;
switch (decl->entityInfo->kind) { switch (decl->entityInfo->kind) {
case CXIdxEntity_CXXNamespace: case CXIdxEntity_CXXNamespace: {
ClangCursor decl_cursor = decl->cursor;
Range decl_spell = decl_cursor.get_spelling_range();
IndexTypeId ns_id = db->ToTypeId(HashUsr(decl->entityInfo->USR));
IndexType* ns = db->Resolve(ns_id);
ns->def.kind = GetSymbolKind(decl->entityInfo->kind);
if (ns->def.short_name.empty()) {
if (decl->entityInfo->name)
ns->def.short_name = decl->entityInfo->name;
else
ns->def.short_name = "(anon)";
ns->def.detailed_name = param->ns.QualifiedName(decl->semanticContainer,
ns->def.short_name);
ns->def.definition_spelling = decl_spell;
ns->def.definition_extent = decl_cursor.get_extent();
if (decl->semanticContainer) {
IndexTypeId parent_id = db->ToTypeId(
ClangCursor(decl->semanticContainer->cursor).get_usr_hash());
db->Resolve(parent_id)->derived.push_back(ns_id);
// |ns| may be invalidated.
ns = db->Resolve(ns_id);
ns->def.parents.push_back(parent_id);
}
}
ns->uses.push_back(decl_spell);
break; break;
}
case CXIdxEntity_ObjCProperty: case CXIdxEntity_ObjCProperty:
case CXIdxEntity_ObjCIvar: case CXIdxEntity_ObjCIvar:
@ -1691,7 +1717,9 @@ void OnIndexReference(CXClientData client_data, const CXIdxEntityRefInfo* ref) {
switch (ref->referencedEntity->kind) { switch (ref->referencedEntity->kind) {
case CXIdxEntity_CXXNamespaceAlias: case CXIdxEntity_CXXNamespaceAlias:
case CXIdxEntity_CXXNamespace: { case CXIdxEntity_CXXNamespace: {
// We don't index namespace usages. ClangCursor referenced = ref->referencedEntity->cursor;
IndexType* ns = db->Resolve(db->ToTypeId(referenced.get_usr_hash()));
ns->uses.push_back(cursor.get_spelling_range());
break; break;
} }

View File

@ -435,7 +435,15 @@ optional<lsSymbolInformation> GetSymbolInfo(QueryDatabase* db,
use_short_name ? type.def->short_name : type.def->detailed_name; use_short_name ? type.def->short_name : type.def->detailed_name;
if (type.def->detailed_name != type.def->short_name) if (type.def->detailed_name != type.def->short_name)
info.containerName = type.def->detailed_name; info.containerName = type.def->detailed_name;
// TODO ClangSymbolKind -> lsSymbolKind
switch (type.def->kind) {
default:
info.kind = lsSymbolKind::Class; info.kind = lsSymbolKind::Class;
break;
case ClangSymbolKind::Namespace:
info.kind = lsSymbolKind::Namespace;
break;
}
return info; return info;
} }
case SymbolKind::Func: { case SymbolKind::Func: {