void CXIndexDataConsumer::getEntityInfo(const NamedDecl *D, EntityInfo &EntityInfo, ScratchAlloc &SA) { if (!D) return; D = getEntityDecl(D); EntityInfo.cursor = getCursor(D); EntityInfo.Dcl = D; EntityInfo.IndexCtx = this; SymbolInfo SymInfo = getSymbolInfo(D); EntityInfo.kind = getEntityKindFromSymbolKind(SymInfo.Kind); EntityInfo.templateKind = getEntityKindFromSymbolCXXTemplateKind(SymInfo.TemplateKind); EntityInfo.lang = getEntityLangFromSymbolLang(SymInfo.Lang); if (D->hasAttrs()) { EntityInfo.AttrList = AttrListInfo::create(D, *this); EntityInfo.attributes = EntityInfo.AttrList->getAttrs(); EntityInfo.numAttributes = EntityInfo.AttrList->getNumAttrs(); } if (EntityInfo.kind == CXIdxEntity_Unexposed) return; if (IdentifierInfo *II = D->getIdentifier()) { EntityInfo.name = SA.toCStr(II->getName()); } else if (isa<TagDecl>(D) || isa<FieldDecl>(D) || isa<NamespaceDecl>(D)) { EntityInfo.name = nullptr; // anonymous tag/field/namespace. } else { SmallString<256> StrBuf; { llvm::raw_svector_ostream OS(StrBuf); D->printName(OS); } EntityInfo.name = SA.copyCStr(StrBuf.str()); } { SmallString<512> StrBuf; bool Ignore = getDeclCursorUSR(D, StrBuf); if (Ignore) { EntityInfo.USR = nullptr; } else { EntityInfo.USR = SA.copyCStr(StrBuf.str()); } } }
void IndexingContext::getEntityInfo(const NamedDecl *D, EntityInfo &EntityInfo, ScratchAlloc &SA) { if (!D) return; D = getEntityDecl(D); EntityInfo.cursor = getCursor(D); EntityInfo.Dcl = D; EntityInfo.IndexCtx = this; EntityInfo.kind = CXIdxEntity_Unexposed; EntityInfo.templateKind = CXIdxEntity_NonTemplate; EntityInfo.lang = CXIdxEntityLang_C; if (D->hasAttrs()) { EntityInfo.AttrList = AttrListInfo::create(D, *this); EntityInfo.attributes = EntityInfo.AttrList->getAttrs(); EntityInfo.numAttributes = EntityInfo.AttrList->getNumAttrs(); } if (const TagDecl *TD = dyn_cast<TagDecl>(D)) { switch (TD->getTagKind()) { case TTK_Struct: EntityInfo.kind = CXIdxEntity_Struct; break; case TTK_Union: EntityInfo.kind = CXIdxEntity_Union; break; case TTK_Class: EntityInfo.kind = CXIdxEntity_CXXClass; EntityInfo.lang = CXIdxEntityLang_CXX; break; case TTK_Interface: EntityInfo.kind = CXIdxEntity_CXXInterface; EntityInfo.lang = CXIdxEntityLang_CXX; break; case TTK_Enum: EntityInfo.kind = CXIdxEntity_Enum; break; } if (const CXXRecordDecl *CXXRec = dyn_cast<CXXRecordDecl>(D)) if (!CXXRec->isCLike()) EntityInfo.lang = CXIdxEntityLang_CXX; if (isa<ClassTemplatePartialSpecializationDecl>(D)) { EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization; } else if (isa<ClassTemplateSpecializationDecl>(D)) { EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization; } } else { switch (D->getKind()) { case Decl::Typedef: EntityInfo.kind = CXIdxEntity_Typedef; break; case Decl::Function: EntityInfo.kind = CXIdxEntity_Function; break; case Decl::ParmVar: EntityInfo.kind = CXIdxEntity_Variable; break; case Decl::Var: EntityInfo.kind = CXIdxEntity_Variable; if (isa<CXXRecordDecl>(D->getDeclContext())) { EntityInfo.kind = CXIdxEntity_CXXStaticVariable; EntityInfo.lang = CXIdxEntityLang_CXX; } break; case Decl::Field: EntityInfo.kind = CXIdxEntity_Field; if (const CXXRecordDecl * CXXRec = dyn_cast<CXXRecordDecl>(D->getDeclContext())) { // FIXME: isPOD check is not sufficient, a POD can contain methods, // we want a isCStructLike check. if (!CXXRec->isPOD()) EntityInfo.lang = CXIdxEntityLang_CXX; } break; case Decl::EnumConstant: EntityInfo.kind = CXIdxEntity_EnumConstant; break; case Decl::ObjCInterface: EntityInfo.kind = CXIdxEntity_ObjCClass; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::ObjCProtocol: EntityInfo.kind = CXIdxEntity_ObjCProtocol; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::ObjCCategory: EntityInfo.kind = CXIdxEntity_ObjCCategory; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::ObjCMethod: if (cast<ObjCMethodDecl>(D)->isInstanceMethod()) EntityInfo.kind = CXIdxEntity_ObjCInstanceMethod; else EntityInfo.kind = CXIdxEntity_ObjCClassMethod; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::ObjCProperty: EntityInfo.kind = CXIdxEntity_ObjCProperty; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::ObjCIvar: EntityInfo.kind = CXIdxEntity_ObjCIvar; EntityInfo.lang = CXIdxEntityLang_ObjC; break; case Decl::Namespace: EntityInfo.kind = CXIdxEntity_CXXNamespace; EntityInfo.lang = CXIdxEntityLang_CXX; break; case Decl::NamespaceAlias: EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias; EntityInfo.lang = CXIdxEntityLang_CXX; break; case Decl::CXXConstructor: EntityInfo.kind = CXIdxEntity_CXXConstructor; EntityInfo.lang = CXIdxEntityLang_CXX; break; case Decl::CXXDestructor: EntityInfo.kind = CXIdxEntity_CXXDestructor; EntityInfo.lang = CXIdxEntityLang_CXX; break; case Decl::CXXConversion: EntityInfo.kind = CXIdxEntity_CXXConversionFunction; EntityInfo.lang = CXIdxEntityLang_CXX; break; case Decl::CXXMethod: { const CXXMethodDecl *MD = cast<CXXMethodDecl>(D); if (MD->isStatic()) EntityInfo.kind = CXIdxEntity_CXXStaticMethod; else EntityInfo.kind = CXIdxEntity_CXXInstanceMethod; EntityInfo.lang = CXIdxEntityLang_CXX; break; } case Decl::ClassTemplate: EntityInfo.kind = CXIdxEntity_CXXClass; EntityInfo.templateKind = CXIdxEntity_Template; break; case Decl::FunctionTemplate: EntityInfo.kind = CXIdxEntity_Function; EntityInfo.templateKind = CXIdxEntity_Template; if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>( cast<FunctionTemplateDecl>(D)->getTemplatedDecl())) { if (isa<CXXConstructorDecl>(MD)) EntityInfo.kind = CXIdxEntity_CXXConstructor; else if (isa<CXXDestructorDecl>(MD)) EntityInfo.kind = CXIdxEntity_CXXDestructor; else if (isa<CXXConversionDecl>(MD)) EntityInfo.kind = CXIdxEntity_CXXConversionFunction; else { if (MD->isStatic()) EntityInfo.kind = CXIdxEntity_CXXStaticMethod; else EntityInfo.kind = CXIdxEntity_CXXInstanceMethod; } } break; case Decl::TypeAliasTemplate: EntityInfo.kind = CXIdxEntity_CXXTypeAlias; EntityInfo.templateKind = CXIdxEntity_Template; break; case Decl::TypeAlias: EntityInfo.kind = CXIdxEntity_CXXTypeAlias; EntityInfo.lang = CXIdxEntityLang_CXX; break; default: break; } } if (EntityInfo.kind == CXIdxEntity_Unexposed) return; if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { if (FD->getTemplatedKind() == FunctionDecl::TK_FunctionTemplateSpecialization) EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization; } if (EntityInfo.templateKind != CXIdxEntity_NonTemplate) EntityInfo.lang = CXIdxEntityLang_CXX; if (IdentifierInfo *II = D->getIdentifier()) { EntityInfo.name = SA.toCStr(II->getName()); } else if (isa<TagDecl>(D) || isa<FieldDecl>(D) || isa<NamespaceDecl>(D)) { EntityInfo.name = 0; // anonymous tag/field/namespace. } else { SmallString<256> StrBuf; { llvm::raw_svector_ostream OS(StrBuf); D->printName(OS); } EntityInfo.name = SA.copyCStr(StrBuf.str()); } { SmallString<512> StrBuf; bool Ignore = getDeclCursorUSR(D, StrBuf); if (Ignore) { EntityInfo.USR = 0; } else { EntityInfo.USR = SA.copyCStr(StrBuf.str()); } } }