From: Argyrios Kyrtzidis Date: Tue, 22 Nov 2011 07:24:51 +0000 (+0000) Subject: [libclang] Indexing API: Support C++ symbols. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2957e6f8c4c2e58a4b9cb639949fea801970fe36;p=clang [libclang] Indexing API: Support C++ symbols. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145058 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 8434ccf8cf..2745ac9bd0 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3940,6 +3940,11 @@ void clang_findReferencesInFileWithBlock(CXCursor, CXFile, */ typedef void *CXIdxClientFile; +/** + * \brief The client's data object that is associated with a semantic entity. + */ +typedef void *CXIdxClientEntity; + /** * \brief The client's data object that is associated with a semantic container * of entities. @@ -4016,16 +4021,49 @@ typedef enum { CXIdxEntity_Enum = 13, CXIdxEntity_Struct = 14, CXIdxEntity_Union = 15, - CXIdxEntity_CXXClass = 16 + + CXIdxEntity_CXXClass = 16, + CXIdxEntity_CXXNamespace = 17, + CXIdxEntity_CXXNamespaceAlias = 18, + CXIdxEntity_CXXStaticVariable = 19, + CXIdxEntity_CXXStaticMethod = 20, + CXIdxEntity_CXXInstanceMethod = 21, + CXIdxEntity_CXXConstructor = 22, + CXIdxEntity_CXXDestructor = 23, + CXIdxEntity_CXXConversionFunction = 24, + CXIdxEntity_CXXTypeAlias = 25 } CXIdxEntityKind; +/** + * \brief Extra C++ template information for an entity. This can apply to: + * CXIdxEntity_Function + * CXIdxEntity_CXXClass + * CXIdxEntity_CXXStaticMethod + * CXIdxEntity_CXXInstanceMethod + * CXIdxEntity_CXXConstructor + * CXIdxEntity_CXXConversionFunction + * CXIdxEntity_CXXTypeAlias + */ +typedef enum { + CXIdxEntity_NonTemplate = 0, + CXIdxEntity_Template = 1, + CXIdxEntity_TemplatePartialSpecialization = 2, + CXIdxEntity_TemplateSpecialization = 3 +} CXIdxEntityCXXTemplateKind; + typedef struct { CXIdxEntityKind kind; + CXIdxEntityCXXTemplateKind templateKind; const char *name; const char *USR; + CXCursor cursor; } CXIdxEntityInfo; +typedef struct { + CXCursor cursor; +} CXIdxContainerInfo; + typedef enum { CXIdxAttr_Unexposed = 0, CXIdxAttr_IBAction = 1, @@ -4050,10 +4088,11 @@ typedef struct { const CXIdxEntityInfo *entityInfo; CXCursor cursor; CXIdxLoc loc; - CXIdxClientContainer container; + const CXIdxContainerInfo *container; int isRedeclaration; int isDefinition; int isContainer; + const CXIdxContainerInfo *declAsContainer; /** * \brief Whether the declaration exists in code or was created implicitly * by the compiler, e.g. implicit objc methods for properties. @@ -4063,10 +4102,6 @@ typedef struct { unsigned numAttributes; } CXIdxDeclInfo; -typedef struct { - CXIdxClientContainer *outContainer; -} CXIdxDeclOut; - typedef enum { CXIdxObjCContainer_ForwardRef = 0, CXIdxObjCContainer_Interface = 1, @@ -4108,6 +4143,12 @@ typedef struct { const CXIdxObjCProtocolRefListInfo *protocols; } CXIdxObjCInterfaceDeclInfo; +typedef struct { + const CXIdxDeclInfo *declInfo; + const CXIdxBaseClassInfo *const *bases; + unsigned numBases; +} CXIdxCXXClassDeclInfo; + /** * \brief Data for \see indexEntityReference callback. */ @@ -4150,7 +4191,7 @@ typedef struct { /** * \brief Container context of the reference. */ - CXIdxClientContainer container; + const CXIdxContainerInfo *container; CXIdxEntityRefKind kind; } CXIdxEntityRefInfo; @@ -4194,7 +4235,7 @@ typedef struct { void *reserved); void (*indexDeclaration)(CXClientData client_data, - const CXIdxDeclInfo *, const CXIdxDeclOut *); + const CXIdxDeclInfo *); /** * \brief Called to index a reference of an entity. @@ -4221,6 +4262,59 @@ clang_index_getObjCProtocolRefListInfo(const CXIdxDeclInfo *); CINDEX_LINKAGE const CXIdxIBOutletCollectionAttrInfo * clang_index_getIBOutletCollectionAttrInfo(const CXIdxAttrInfo *); +CINDEX_LINKAGE const CXIdxCXXClassDeclInfo * +clang_index_getCXXClassDeclInfo(const CXIdxDeclInfo *); + +/** + * \brief For retrieving a custom CXIdxClientContainer attached to a + * container. + */ +CINDEX_LINKAGE CXIdxClientContainer +clang_index_getClientContainer(const CXIdxContainerInfo *); + +/** + * \brief For setting a custom CXIdxClientContainer attached to a + * container. + */ +CINDEX_LINKAGE void +clang_index_setClientContainer(const CXIdxContainerInfo *,CXIdxClientContainer); + +/** + * \brief For retrieving a custom CXIdxClientEntity attached to an entity. + */ +CINDEX_LINKAGE CXIdxClientEntity +clang_index_getClientEntity(const CXIdxEntityInfo *); + +/** + * \brief For setting a custom CXIdxClientEntity attached to an entity. + */ +CINDEX_LINKAGE void +clang_index_setClientEntity(const CXIdxEntityInfo *, CXIdxClientEntity); + +/** + * \brief An indexing action, to be applied to one or multiple translation units + * but not on concurrent threads. If there are threads doing indexing + * concurrently, they should use different CXIndexAction objects. + */ +typedef void *CXIndexAction; + +/** + * \brief An indexing action, to be applied to one or multiple translation units + * but not on concurrent threads. If there are threads doing indexing + * concurrently, they should use different CXIndexAction objects. + * + * \param CIdx The index object with which the index action will be associated. + */ +CINDEX_LINKAGE CXIndexAction clang_IndexAction_create(CXIndex CIdx); + +/** + * \brief Destroy the given index action. + * + * The index action must not be destroyed until all of the translation units + * created within that index action have been destroyed. + */ +CINDEX_LINKAGE void clang_IndexAction_dispose(CXIndexAction); + typedef enum { /** * \brief Used to indicate that no special indexing options are needed. @@ -4259,7 +4353,7 @@ typedef enum { * * The rest of the parameters are the same as \see clang_parseTranslationUnit. */ -CINDEX_LINKAGE int clang_indexSourceFile(CXIndex CIdx, +CINDEX_LINKAGE int clang_indexSourceFile(CXIndexAction, CXClientData client_data, IndexerCallbacks *index_callbacks, unsigned index_callbacks_size, @@ -4288,11 +4382,12 @@ CINDEX_LINKAGE int clang_indexSourceFile(CXIndex CIdx, * \returns If there is a failure from which the there is no recovery, returns * non-zero, otherwise returns 0. */ -CINDEX_LINKAGE int clang_indexTranslationUnit(CXTranslationUnit, +CINDEX_LINKAGE int clang_indexTranslationUnit(CXIndexAction, CXClientData client_data, IndexerCallbacks *index_callbacks, unsigned index_callbacks_size, - unsigned index_options); + unsigned index_options, + CXTranslationUnit); /** * \brief Retrieve the CXIdxFile, file, line, column, and offset represented by diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 43f09836ce..0e7193ee10 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1609,7 +1609,9 @@ static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info, return (CXIdxClientContainer)newStr; } -static void printCXIndexContainer(CXIdxClientContainer container) { +static void printCXIndexContainer(const CXIdxContainerInfo *info) { + CXIdxClientContainer container; + container = clang_index_getClientContainer(info); if (!container) printf("[<>]"); else @@ -1635,6 +1637,27 @@ static const char *getEntityKindString(CXIdxEntityKind kind) { case CXIdxEntity_Struct: return "struct"; case CXIdxEntity_Union: return "union"; case CXIdxEntity_CXXClass: return "c++-class"; + case CXIdxEntity_CXXNamespace: return "namespace"; + case CXIdxEntity_CXXNamespaceAlias: return "namespace-alias"; + case CXIdxEntity_CXXStaticVariable: return "c++-static-var"; + case CXIdxEntity_CXXStaticMethod: return "c++-static-method"; + case CXIdxEntity_CXXInstanceMethod: return "c++-instance-method"; + case CXIdxEntity_CXXConstructor: return "constructor"; + case CXIdxEntity_CXXDestructor: return "destructor"; + case CXIdxEntity_CXXConversionFunction: return "conversion-func"; + case CXIdxEntity_CXXTypeAlias: return "type-alias"; + } + assert(0 && "Garbage entity kind"); + return 0; +} + +static const char *getEntityTemplateKindString(CXIdxEntityCXXTemplateKind kind) { + switch (kind) { + case CXIdxEntity_NonTemplate: return ""; + case CXIdxEntity_Template: return "-template"; + case CXIdxEntity_TemplatePartialSpecialization: + return "-template-partial-spec"; + case CXIdxEntity_TemplateSpecialization: return "-template-spec"; } assert(0 && "Garbage entity kind"); return 0; @@ -1657,7 +1680,8 @@ static void printEntityInfo(const char *cb, if (!name) name = ""; - printf("%s: kind: %s", cb, getEntityKindString(info->kind)); + printf("%s: kind: %s%s", cb, getEntityKindString(info->kind), + getEntityTemplateKindString(info->templateKind)); printf(" | name: %s", name); printf(" | USR: %s", info->USR); } @@ -1735,8 +1759,7 @@ static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_dat } static void index_indexDeclaration(CXClientData client_data, - const CXIdxDeclInfo *info, - const CXIdxDeclOut *outData) { + const CXIdxDeclInfo *info) { IndexData *index_data; const CXIdxObjCCategoryDeclInfo *CatInfo; const CXIdxObjCInterfaceDeclInfo *InterInfo; @@ -1804,8 +1827,9 @@ static void index_indexDeclaration(CXClientData client_data, printProtocolList(ProtoInfo, client_data); } - if (outData->outContainer) - *outData->outContainer = makeClientContainer(info->entityInfo, info->loc); + if (info->declAsContainer) + clang_index_setClientContainer(info->declAsContainer, + makeClientContainer(info->entityInfo, info->loc)); } static void index_indexEntityReference(CXClientData client_data, @@ -1839,7 +1863,8 @@ static IndexerCallbacks IndexCB = { static int index_file(int argc, const char **argv) { const char *check_prefix; - CXIndex CIdx; + CXIndex Idx; + CXIndexAction idxAction; IndexData index_data; unsigned index_opts; int result; @@ -1858,7 +1883,14 @@ static int index_file(int argc, const char **argv) { return -1; } - CIdx = clang_createIndex(0, 1); + if (!(Idx = clang_createIndex(/* excludeDeclsFromPCH */ 1, + /* displayDiagnosics=*/1))) { + fprintf(stderr, "Could not create Index\n"); + return 1; + } + idxAction = 0; + result = 1; + index_data.check_prefix = check_prefix; index_data.first_check_printed = 0; index_data.fail_for_error = 0; @@ -1867,17 +1899,21 @@ static int index_file(int argc, const char **argv) { if (getenv("CINDEXTEST_SUPPRESSREFS")) index_opts |= CXIndexOpt_SuppressRedundantRefs; - result = clang_indexSourceFile(CIdx, &index_data, + idxAction = clang_IndexAction_create(Idx); + result = clang_indexSourceFile(idxAction, &index_data, &IndexCB,sizeof(IndexCB), index_opts, 0, argv, argc, 0, 0, 0, 0); if (index_data.fail_for_error) - return -1; + result = -1; + clang_IndexAction_dispose(idxAction); + clang_disposeIndex(Idx); return result; } static int index_tu(int argc, const char **argv) { CXIndex Idx; + CXIndexAction idxAction; CXTranslationUnit TU; const char *check_prefix; IndexData index_data; @@ -1903,9 +1939,11 @@ static int index_tu(int argc, const char **argv) { fprintf(stderr, "Could not create Index\n"); return 1; } + idxAction = 0; + result = 1; if (!CreateTranslationUnit(Idx, argv[0], &TU)) - return 1; + goto finished; index_data.check_prefix = check_prefix; index_data.first_check_printed = 0; @@ -1914,13 +1952,18 @@ static int index_tu(int argc, const char **argv) { index_opts = 0; if (getenv("CINDEXTEST_SUPPRESSREFS")) index_opts |= CXIndexOpt_SuppressRedundantRefs; - - result = clang_indexTranslationUnit(TU, &index_data, + + idxAction = clang_IndexAction_create(Idx); + result = clang_indexTranslationUnit(idxAction, &index_data, &IndexCB,sizeof(IndexCB), - index_opts); + index_opts, TU); if (index_data.fail_for_error) - return -1; + goto finished; + finished: + clang_IndexAction_dispose(idxAction); + clang_disposeIndex(Idx); + return result; } diff --git a/tools/libclang/CXCursor.cpp b/tools/libclang/CXCursor.cpp index bba0928cea..e9cc372fe0 100644 --- a/tools/libclang/CXCursor.cpp +++ b/tools/libclang/CXCursor.cpp @@ -588,9 +588,9 @@ cxcursor::getCursorMemberRef(CXCursor C) { reinterpret_cast(C.data[1]))); } -CXCursor cxcursor::MakeCursorCXXBaseSpecifier(CXXBaseSpecifier *B, +CXCursor cxcursor::MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B, CXTranslationUnit TU){ - CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { B, 0, TU } }; + CXCursor C = { CXCursor_CXXBaseSpecifier, 0, { (void*)B, 0, TU } }; return C; } diff --git a/tools/libclang/CXCursor.h b/tools/libclang/CXCursor.h index e54e43b2c8..7423560085 100644 --- a/tools/libclang/CXCursor.h +++ b/tools/libclang/CXCursor.h @@ -120,7 +120,7 @@ CXCursor MakeCursorMemberRef(const FieldDecl *Field, SourceLocation Loc, std::pair getCursorMemberRef(CXCursor C); /// \brief Create a CXX base specifier cursor. -CXCursor MakeCursorCXXBaseSpecifier(CXXBaseSpecifier *B, +CXCursor MakeCursorCXXBaseSpecifier(const CXXBaseSpecifier *B, CXTranslationUnit TU); /// \brief Unpack a CXXBaseSpecifier cursor into a CXXBaseSpecifier. diff --git a/tools/libclang/IndexBody.cpp b/tools/libclang/IndexBody.cpp index 60fe2cf021..9418ed7bb1 100644 --- a/tools/libclang/IndexBody.cpp +++ b/tools/libclang/IndexBody.cpp @@ -80,6 +80,12 @@ public: SaveAndRestore InPseudo(InPseudoObject, true); return base::TraversePseudoObjectExpr(E); } + + bool VisitCXXConstructExpr(CXXConstructExpr *E) { + IndexCtx.handleReference(E->getConstructor(), E->getLocation(), 0, + ParentDC, E); + return true; + } }; } // anonymous namespace diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 20b22052f7..777dea1d15 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -52,8 +52,8 @@ public: return true; } - bool VisitTypedefDecl(TypedefDecl *D) { - IndexCtx.handleTypedef(D); + bool VisitTypedefDecl(TypedefNameDecl *D) { + IndexCtx.handleTypedefName(D); IndexCtx.indexTypeSourceInfo(D->getTypeSourceInfo(), D); return true; } @@ -182,7 +182,32 @@ public: if (MD->isSynthesized()) IndexCtx.handleSynthesizedObjCMethod(MD, D->getLocation()); } + return true; + } + + bool VisitClassTemplateDecl(ClassTemplateDecl *D) { + IndexCtx.handleClassTemplate(D); + if (D->isThisDeclarationADefinition()) + IndexCtx.indexDeclContext(D->getTemplatedDecl()); + return true; + } + + bool VisitFunctionTemplateDecl(FunctionTemplateDecl *D) { + IndexCtx.handleFunctionTemplate(D); + FunctionDecl *FD = D->getTemplatedDecl(); + IndexCtx.indexTypeSourceInfo(FD->getTypeSourceInfo(), D); + if (FD->isThisDeclarationADefinition()) { + const Stmt *Body = FD->getBody(); + if (Body) { + IndexCtx.indexBody(Body, FD); + } + } + return true; + } + bool VisitTypeAliasTemplateDecl(TypeAliasTemplateDecl *D) { + IndexCtx.handleTypeAliasTemplate(D); + IndexCtx.indexTypeSourceInfo(D->getTemplatedDecl()->getTypeSourceInfo(), D); return true; } }; diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index 3fa5a20ffc..af9fad8ced 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -183,7 +183,7 @@ public: //===----------------------------------------------------------------------===// struct IndexSourceFileInfo { - CXIndex CIdx; + CXIndexAction idxAction; CXClientData client_data; IndexerCallbacks *index_callbacks; unsigned index_callbacks_size; @@ -213,7 +213,7 @@ struct MemBufferOwner { static void clang_indexSourceFile_Impl(void *UserData) { IndexSourceFileInfo *ITUI = static_cast(UserData); - CXIndex CIdx = ITUI->CIdx; + CXIndex CIdx = (CXIndex)ITUI->idxAction; CXClientData client_data = ITUI->client_data; IndexerCallbacks *client_index_callbacks = ITUI->index_callbacks; unsigned index_callbacks_size = ITUI->index_callbacks_size; @@ -352,11 +352,12 @@ static void clang_indexSourceFile_Impl(void *UserData) { namespace { struct IndexTranslationUnitInfo { - CXTranslationUnit TU; + CXIndexAction idxAction; CXClientData client_data; IndexerCallbacks *index_callbacks; unsigned index_callbacks_size; unsigned index_options; + CXTranslationUnit TU; int result; }; @@ -560,24 +561,76 @@ clang_index_getIBOutletCollectionAttrInfo(const CXIdxAttrInfo *AInfo) { return 0; } -int clang_indexSourceFile(CXIndex CIdx, - CXClientData client_data, - IndexerCallbacks *index_callbacks, - unsigned index_callbacks_size, - unsigned index_options, - const char *source_filename, - const char * const *command_line_args, - int num_command_line_args, - struct CXUnsavedFile *unsaved_files, - unsigned num_unsaved_files, - CXTranslationUnit *out_TU, - unsigned TU_options) { - - IndexSourceFileInfo ITUI = { CIdx, client_data, index_callbacks, - index_callbacks_size, index_options, - source_filename, command_line_args, - num_command_line_args, unsaved_files, - num_unsaved_files, out_TU, TU_options, 0 }; +const CXIdxCXXClassDeclInfo * +clang_index_getCXXClassDeclInfo(const CXIdxDeclInfo *DInfo) { + if (!DInfo) + return 0; + + const DeclInfo *DI = static_cast(DInfo); + if (const CXXClassDeclInfo *ClassInfo = dyn_cast(DI)) + return &ClassInfo->CXXClassInfo; + + return 0; +} + +CXIdxClientContainer +clang_index_getClientContainer(const CXIdxContainerInfo *info) { + if (!info) + return 0; + ContainerInfo *Container = (ContainerInfo*)info; + return Container->IndexCtx->getClientContainerForDC(Container->DC); +} + +void clang_index_setClientContainer(const CXIdxContainerInfo *info, + CXIdxClientContainer client) { + if (!info) + return; + ContainerInfo *Container = (ContainerInfo*)info; + Container->IndexCtx->addContainerInMap(Container->DC, client); +} + +CXIdxClientEntity clang_index_getClientEntity(const CXIdxEntityInfo *info) { + if (!info) + return 0; + EntityInfo *Entity = (EntityInfo*)info; + return Entity->IndexCtx->getClientEntity(Entity->Dcl); +} + +void clang_index_setClientEntity(const CXIdxEntityInfo *info, + CXIdxClientEntity client) { + if (!info) + return; + EntityInfo *Entity = (EntityInfo*)info; + Entity->IndexCtx->setClientEntity(Entity->Dcl, client); +} + +CXIndexAction clang_IndexAction_create(CXIndex CIdx) { + // For now, CXIndexAction is featureless. + return CIdx; +} + +void clang_IndexAction_dispose(CXIndexAction idxAction) { + // For now, CXIndexAction is featureless. +} + +int clang_indexSourceFile(CXIndexAction idxAction, + CXClientData client_data, + IndexerCallbacks *index_callbacks, + unsigned index_callbacks_size, + unsigned index_options, + const char *source_filename, + const char * const *command_line_args, + int num_command_line_args, + struct CXUnsavedFile *unsaved_files, + unsigned num_unsaved_files, + CXTranslationUnit *out_TU, + unsigned TU_options) { + + IndexSourceFileInfo ITUI = { idxAction, client_data, index_callbacks, + index_callbacks_size, index_options, + source_filename, command_line_args, + num_command_line_args, unsaved_files, + num_unsaved_files, out_TU, TU_options, 0 }; if (getenv("LIBCLANG_NOTHREADS")) { clang_indexSourceFile_Impl(&ITUI); @@ -616,14 +669,16 @@ int clang_indexSourceFile(CXIndex CIdx, return ITUI.result; } -int clang_indexTranslationUnit(CXTranslationUnit TU, +int clang_indexTranslationUnit(CXIndexAction idxAction, CXClientData client_data, IndexerCallbacks *index_callbacks, unsigned index_callbacks_size, - unsigned index_options) { + unsigned index_options, + CXTranslationUnit TU) { - IndexTranslationUnitInfo ITUI = { TU, client_data, index_callbacks, - index_callbacks_size, index_options, 0 }; + IndexTranslationUnitInfo ITUI = { idxAction, client_data, index_callbacks, + index_callbacks_size, index_options, TU, + 0 }; if (getenv("LIBCLANG_NOTHREADS")) { clang_indexTranslationUnit_Impl(&ITUI); diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index d31ccdf061..77d4801113 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -12,7 +12,7 @@ #include "CIndexDiagnostic.h" #include "clang/Frontend/ASTUnit.h" -#include "clang/AST/DeclObjC.h" +#include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" using namespace clang; @@ -28,7 +28,7 @@ IndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) { SourceLocation Loc = *LI; ObjCProtocolDecl *PD = *I; - ProtEntities.push_back(CXIdxEntityInfo()); + ProtEntities.push_back(EntityInfo()); IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA); CXIdxObjCProtocolRefInfo ProtInfo = { 0, MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU), @@ -80,8 +80,8 @@ IndexingContext::AttrListInfo::AttrListInfo(const Decl *D, QualType Ty = IBAttr->getInterface(); if (const ObjCInterfaceType *InterTy = Ty->getAs()) { if (const ObjCInterfaceDecl *InterD = InterTy->getInterface()) { - IdxCtx.getEntityInfo(InterD, IBInfo.CXClassInfo, SA); - IBInfo.IBCollInfo.objcClass = &IBInfo.CXClassInfo; + IdxCtx.getEntityInfo(InterD, IBInfo.ClassInfo, SA); + IBInfo.IBCollInfo.objcClass = &IBInfo.ClassInfo; IBInfo.IBCollInfo.classCursor = MakeCursorObjCClassRef(InterD, IBAttr->getInterfaceLoc(), IdxCtx.CXTU); } @@ -92,6 +92,32 @@ IndexingContext::AttrListInfo::AttrListInfo(const Decl *D, CXAttrs.push_back(&Attrs[i]); } +IndexingContext::CXXBasesListInfo::CXXBasesListInfo(const CXXRecordDecl *D, + IndexingContext &IdxCtx, + IndexingContext::StrAdapter &SA) { + for (CXXRecordDecl::base_class_const_iterator + I = D->bases_begin(), E = D->bases_end(); I != E; ++I) { + const CXXBaseSpecifier &Base = *I; + BaseEntities.push_back(EntityInfo()); + const CXXRecordDecl *BaseRD = 0; + if (const RecordType *RT = Base.getType()->getAs()) + BaseRD = dyn_cast_or_null(RT->getDecl()); + IdxCtx.getEntityInfo(BaseRD, BaseEntities.back(), SA); + CXIdxBaseClassInfo BaseInfo = { 0, + MakeCursorCXXBaseSpecifier(&Base, IdxCtx.CXTU), + IdxCtx.getIndexLoc(Base.getSourceRange().getBegin()) }; + BaseInfos.push_back(BaseInfo); + } + + for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) { + if (BaseEntities[i].USR) + BaseInfos[i].base = &BaseEntities[i]; + } + + for (unsigned i = 0, e = BaseInfos.size(); i != e; ++i) + CXBases.push_back(&BaseInfos[i]); +} + const char *IndexingContext::StrAdapter::toCStr(StringRef Str) { if (Str.empty()) return ""; @@ -155,31 +181,33 @@ bool IndexingContext::handleDecl(const NamedDecl *D, DeclInfo &DInfo) { if (!CB.indexDeclaration || !D) return false; + if (D->isImplicit() && shouldIgnoreIfImplicit(D)) + return false; StrAdapter SA(*this); - getEntityInfo(D, DInfo.CXEntInfo, SA); - if (!DInfo.CXEntInfo.USR || Loc.isInvalid()) + getEntityInfo(D, DInfo.EntInfo, SA); + if (!DInfo.EntInfo.USR || Loc.isInvalid()) return false; markEntityOccurrenceInFile(D, Loc); - DInfo.entityInfo = &DInfo.CXEntInfo; + DInfo.entityInfo = &DInfo.EntInfo; DInfo.cursor = Cursor; DInfo.loc = getIndexLoc(Loc); - DInfo.container = getIndexContainer(D); DInfo.isImplicit = D->isImplicit(); AttrListInfo AttrList(D, *this, SA); DInfo.attributes = AttrList.getAttrs(); DInfo.numAttributes = AttrList.getNumAttrs(); - CXIdxClientContainer clientCont = 0; - CXIdxDeclOut DeclOut = { DInfo.isContainer ? &clientCont : 0 }; - CB.indexDeclaration(ClientData, &DInfo, &DeclOut); - - if (DInfo.isContainer) - addContainerInMap(cast(D), clientCont); + getContainerInfo(D->getDeclContext(), DInfo.Container); + DInfo.container = &DInfo.Container; + if (DInfo.isContainer) { + getContainerInfo(getEntityContainer(D), DInfo.DeclAsContainer); + DInfo.declAsContainer = &DInfo.DeclAsContainer; + } + CB.indexDeclaration(ClientData, &DInfo); return true; } @@ -215,12 +243,15 @@ bool IndexingContext::handleEnumerator(const EnumConstantDecl *D) { } bool IndexingContext::handleTagDecl(const TagDecl *D) { + if (const CXXRecordDecl *CXXRD = dyn_cast(D)) + return handleCXXRecordDecl(CXXRD, D); + DeclInfo DInfo(!D->isFirstDeclaration(), D->isThisDeclarationADefinition(), D->isThisDeclarationADefinition()); return handleDecl(D, D->getLocation(), getCursor(D), DInfo); } -bool IndexingContext::handleTypedef(const TypedefDecl *D) { +bool IndexingContext::handleTypedefName(const TypedefNameDecl *D) { DeclInfo DInfo(!D->isFirstDeclaration(), /*isDefinition=*/true, /*isContainer=*/false); return handleDecl(D, D->getLocation(), getCursor(D), DInfo); @@ -242,7 +273,7 @@ bool IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { StrAdapter SA(*this); CXIdxBaseClassInfo BaseClass; - CXIdxEntityInfo BaseEntity; + EntityInfo BaseEntity; BaseClass.cursor = clang_getNullCursor(); if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) { getEntityInfo(SuperD, BaseEntity, SA); @@ -293,7 +324,7 @@ bool IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { bool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/false); - CXIdxEntityInfo ClassEntity; + EntityInfo ClassEntity; StrAdapter SA(*this); const ObjCInterfaceDecl *IFaceD = D->getClassInterface(); SourceLocation ClassLoc = D->getLocation(); @@ -317,7 +348,7 @@ bool IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { bool IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { const ObjCCategoryDecl *CatD = D->getCategoryDecl(); ObjCCategoryDeclInfo CatDInfo(/*isImplementation=*/true); - CXIdxEntityInfo ClassEntity; + EntityInfo ClassEntity; StrAdapter SA(*this); const ObjCInterfaceDecl *IFaceD = CatD->getClassInterface(); SourceLocation ClassLoc = D->getLocation(); @@ -362,6 +393,23 @@ bool IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { return handleDecl(D, D->getLocation(), getCursor(D), DInfo); } +bool IndexingContext::handleClassTemplate(const ClassTemplateDecl *D) { + return handleCXXRecordDecl(D->getTemplatedDecl(), D); +} + +bool IndexingContext::handleFunctionTemplate(const FunctionTemplateDecl *D) { + DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(), + /*isDefinition=*/D->isThisDeclarationADefinition(), + /*isContainer=*/D->isThisDeclarationADefinition()); + return handleDecl(D, D->getLocation(), getCursor(D), DInfo); +} + +bool IndexingContext::handleTypeAliasTemplate(const TypeAliasTemplateDecl *D) { + DeclInfo DInfo(/*isRedeclaration=*/!D->isCanonicalDecl(), + /*isDefinition=*/true, /*isContainer=*/false); + return handleDecl(D, D->getLocation(), getCursor(D), DInfo); +} + bool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, const NamedDecl *Parent, const DeclContext *DC, @@ -382,35 +430,41 @@ bool IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, const DeclContext *DC, const Expr *E, CXIdxEntityRefKind Kind) { - if (!D) + if (!CB.indexEntityReference) return false; - if (D->getParentFunctionOrMethod()) + + if (!D) return false; if (Loc.isInvalid()) return false; - if (!CB.indexEntityReference) + if (D->getParentFunctionOrMethod()) return false; if (isNotFromSourceFile(D->getLocation())) return false; + if (D->isImplicit() && shouldIgnoreIfImplicit(D)) + return false; + + if (suppressRefs()) { + if (markEntityOccurrenceInFile(D, Loc)) + return false; // already occurred. + } StrAdapter SA(*this); - CXIdxEntityInfo RefEntity, ParentEntity; + EntityInfo RefEntity, ParentEntity; getEntityInfo(D, RefEntity, SA); if (!RefEntity.USR) return false; getEntityInfo(Parent, ParentEntity, SA); - if (suppressRefs()) { - if (markEntityOccurrenceInFile(D, Loc)) - return false; // already occurred. - } + ContainerInfo Container; + getContainerInfo(DC, Container); CXIdxEntityRefInfo Info = { Cursor, getIndexLoc(Loc), &RefEntity, Parent ? &ParentEntity : 0, - getIndexContainerForDC(DC), + &Container, Kind }; CB.indexEntityReference(ClientData, &Info); return true; @@ -427,6 +481,9 @@ bool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { void IndexingContext::addContainerInMap(const DeclContext *DC, CXIdxClientContainer container) { + if (!DC) + return; + assert(getScopedContext(DC) == DC); ContainerMapTy::iterator I = ContainerMap.find(DC); if (I == ContainerMap.end()) { @@ -442,6 +499,34 @@ void IndexingContext::addContainerInMap(const DeclContext *DC, ContainerMap.erase(I); } +CXIdxClientEntity IndexingContext::getClientEntity(const Decl *D) const { + if (!D) + return 0; + EntityMapTy::const_iterator I = EntityMap.find(D); + if (I == EntityMap.end()) + return 0; + return I->second; +} + +void IndexingContext::setClientEntity(const Decl *D, CXIdxClientEntity client) { + if (!D) + return; + EntityMap[D] = client; +} + +bool IndexingContext::handleCXXRecordDecl(const CXXRecordDecl *RD, + const NamedDecl *OrigD) { + StrAdapter SA(*this); + CXXClassDeclInfo DInfo(/*isRedeclaration=*/!OrigD->isCanonicalDecl(), + /*isDefinition=*/RD->isThisDeclarationADefinition()); + CXXBasesListInfo BaseList(RD, *this, SA); + DInfo.CXXClassInfo.declInfo = &DInfo; + DInfo.CXXClassInfo.bases = BaseList.getBases(); + DInfo.CXXClassInfo.numBases = BaseList.getNumBases(); + + return handleDecl(OrigD, OrigD->getLocation(), getCursor(OrigD), DInfo); +} + bool IndexingContext::markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc) { SourceManager &SM = Ctx->getSourceManager(); @@ -476,11 +561,33 @@ const NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { } else if (const ObjCCategoryImplDecl * CatImplD = dyn_cast(D)) { return getEntityDecl(CatImplD->getCategoryDecl()); + } else if (const FunctionDecl *FD = dyn_cast(D)) { + if (FunctionTemplateDecl *TemplD = FD->getDescribedFunctionTemplate()) + return getEntityDecl(TemplD); + } else if (const CXXRecordDecl *RD = dyn_cast(D)) { + if (ClassTemplateDecl *TemplD = RD->getDescribedClassTemplate()) + return getEntityDecl(TemplD); } return D; } +const DeclContext * +IndexingContext::getEntityContainer(const Decl *D) const { + const DeclContext *DC = dyn_cast(D); + if (DC) + return DC; + + if (const ClassTemplateDecl *ClassTempl = dyn_cast(D)) { + DC = ClassTempl->getTemplatedDecl(); + } if (const FunctionTemplateDecl * + FuncTempl = dyn_cast(D)) { + DC = FuncTempl->getTemplatedDecl(); + } + + return DC; +} + const DeclContext * IndexingContext::getScopedContext(const DeclContext *DC) const { // Local contexts are ignored for indexing. @@ -502,13 +609,15 @@ IndexingContext::getScopedContext(const DeclContext *DC) const { } CXIdxClientContainer -IndexingContext::getIndexContainerForDC(const DeclContext *DC) const { +IndexingContext::getClientContainerForDC(const DeclContext *DC) const { + if (!DC) + return 0; + DC = getScopedContext(DC); ContainerMapTy::const_iterator I = ContainerMap.find(DC); if (I == ContainerMap.end()) return 0; -// assert(I != ContainerMap.end() && -// "Failed to include a scoped context in the container map"); + return I->second; } @@ -564,12 +673,18 @@ void IndexingContext::translateLoc(SourceLocation Loc, } void IndexingContext::getEntityInfo(const NamedDecl *D, - CXIdxEntityInfo &EntityInfo, - StrAdapter &SA) { + EntityInfo &EntityInfo, + StrAdapter &SA) { + EntityInfo.name = EntityInfo.USR = 0; if (!D) return; + D = getEntityDecl(D); + EntityInfo.cursor = getCursor(D); + EntityInfo.Dcl = D; + EntityInfo.IndexCtx = this; EntityInfo.kind = CXIdxEntity_Unexposed; + EntityInfo.templateKind = CXIdxEntity_NonTemplate; if (const TagDecl *TD = dyn_cast(D)) { switch (TD->getTagKind()) { @@ -583,14 +698,29 @@ void IndexingContext::getEntityInfo(const NamedDecl *D, EntityInfo.kind = CXIdxEntity_Enum; break; } + if (const CXXRecordDecl *CXXRec = dyn_cast(D)) { + if (TD->getTagKind() == TTK_Struct && !CXXRec->isPOD()) + EntityInfo.kind = CXIdxEntity_CXXClass; + } + + if (isa(D)) { + EntityInfo.templateKind = CXIdxEntity_TemplatePartialSpecialization; + } else if (isa(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; + EntityInfo.kind = CXIdxEntity_Function; + break; case Decl::Var: - EntityInfo.kind = CXIdxEntity_Variable; break; + EntityInfo.kind = CXIdxEntity_Variable; + if (isa(D->getDeclContext())) + EntityInfo.kind = CXIdxEntity_CXXStaticVariable; + break; case Decl::Field: EntityInfo.kind = CXIdxEntity_Field; break; case Decl::EnumConstant: @@ -611,11 +741,67 @@ void IndexingContext::getEntityInfo(const NamedDecl *D, EntityInfo.kind = CXIdxEntity_ObjCProperty; break; case Decl::ObjCIvar: EntityInfo.kind = CXIdxEntity_ObjCIvar; break; + case Decl::Namespace: + EntityInfo.kind = CXIdxEntity_CXXNamespace; break; + case Decl::NamespaceAlias: + EntityInfo.kind = CXIdxEntity_CXXNamespaceAlias; break; + case Decl::CXXConstructor: + EntityInfo.kind = CXIdxEntity_CXXConstructor; break; + case Decl::CXXDestructor: + EntityInfo.kind = CXIdxEntity_CXXDestructor; break; + case Decl::CXXConversion: + EntityInfo.kind = CXIdxEntity_CXXConversionFunction; break; + case Decl::CXXMethod: { + const CXXMethodDecl *MD = cast(D); + if (MD->isStatic()) + EntityInfo.kind = CXIdxEntity_CXXStaticMethod; + else + EntityInfo.kind = CXIdxEntity_CXXInstanceMethod; + 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( + cast(D)->getTemplatedDecl())) { + if (isa(MD)) + EntityInfo.kind = CXIdxEntity_CXXConstructor; + else if (isa(MD)) + EntityInfo.kind = CXIdxEntity_CXXDestructor; + else if (isa(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; break; default: break; } } + if (EntityInfo.kind == CXIdxEntity_Unexposed) + return; + + if (const FunctionDecl *FD = dyn_cast(D)) { + if (FD->getTemplatedKind() == + FunctionDecl::TK_FunctionTemplateSpecialization) + EntityInfo.templateKind = CXIdxEntity_TemplateSpecialization; + } + if (IdentifierInfo *II = D->getIdentifier()) { EntityInfo.name = SA.toCStr(II->getName()); @@ -642,6 +828,13 @@ void IndexingContext::getEntityInfo(const NamedDecl *D, } } +void IndexingContext::getContainerInfo(const DeclContext *DC, + ContainerInfo &ContInfo) { + ContInfo.cursor = getCursor(cast(DC)); + ContInfo.DC = DC; + ContInfo.IndexCtx = this; +} + CXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { if (const TypeDecl *TD = dyn_cast(D)) return MakeCursorTypeRef(TD, Loc, CXTU); @@ -660,3 +853,11 @@ CXCursor IndexingContext::getRefCursor(const NamedDecl *D, SourceLocation Loc) { return clang_getNullCursor(); } + +bool IndexingContext::shouldIgnoreIfImplicit(const NamedDecl *D) { + if (isa(D)) + return false; + if (isa(D)) + return false; + return true; +} diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index a18d8c6f8b..cbf96d8dbb 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -18,23 +18,41 @@ namespace clang { class FileEntry; class ObjCPropertyDecl; class ObjCClassDecl; + class ClassTemplateDecl; + class FunctionTemplateDecl; + class TypeAliasTemplateDecl; namespace cxindex { class IndexingContext; +struct EntityInfo : public CXIdxEntityInfo { + const NamedDecl *Dcl; + IndexingContext *IndexCtx; +}; + +struct ContainerInfo : public CXIdxContainerInfo { + const DeclContext *DC; + IndexingContext *IndexCtx; +}; + struct DeclInfo : public CXIdxDeclInfo { - CXIdxEntityInfo CXEntInfo; enum DInfoKind { Info_Decl, Info_ObjCContainer, Info_ObjCInterface, Info_ObjCProtocol, - Info_ObjCCategory + Info_ObjCCategory, + + Info_CXXClass }; DInfoKind Kind; + EntityInfo EntInfo; + ContainerInfo Container; + ContainerInfo DeclAsContainer; + DeclInfo(bool isRedeclaration, bool isDefinition, bool isContainer) : Kind(Info_Decl) { this->isRedeclaration = isRedeclaration; @@ -42,6 +60,7 @@ struct DeclInfo : public CXIdxDeclInfo { this->isContainer = isContainer; attributes = 0; numAttributes = 0; + declAsContainer = container = 0; } DeclInfo(DInfoKind K, bool isRedeclaration, bool isDefinition, bool isContainer) @@ -51,6 +70,7 @@ struct DeclInfo : public CXIdxDeclInfo { this->isContainer = isContainer; attributes = 0; numAttributes = 0; + declAsContainer = container = 0; } static bool classof(const DeclInfo *) { return true; } @@ -137,6 +157,18 @@ struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo { static bool classof(const ObjCCategoryDeclInfo *D) { return true; } }; +struct CXXClassDeclInfo : public DeclInfo { + CXIdxCXXClassDeclInfo CXXClassInfo; + + CXXClassDeclInfo(bool isRedeclaration, bool isDefinition) + : DeclInfo(Info_CXXClass, isRedeclaration, isDefinition, isDefinition) { } + + static bool classof(const DeclInfo *D) { + return D->Kind == Info_CXXClass; + } + static bool classof(const CXXClassDeclInfo *D) { return true; } +}; + struct AttrInfo : public CXIdxAttrInfo { const Attr *A; @@ -151,7 +183,7 @@ struct AttrInfo : public CXIdxAttrInfo { }; struct IBOutletCollectionInfo : public AttrInfo { - CXIdxEntityInfo CXClassInfo; + EntityInfo ClassInfo; CXIdxIBOutletCollectionAttrInfo IBCollInfo; IBOutletCollectionInfo(CXCursor C, CXIdxLoc Loc, const Attr *A) : @@ -181,9 +213,13 @@ class IndexingContext { CXTranslationUnit CXTU; typedef llvm::DenseMap FileMapTy; - typedef llvm::DenseMap ContainerMapTy; + typedef llvm::DenseMap + ContainerMapTy; + typedef llvm::DenseMap EntityMapTy; + FileMapTy FileMap; ContainerMapTy ContainerMap; + EntityMapTy EntityMap; llvm::DenseSet RefFileOccurences; @@ -222,7 +258,7 @@ class IndexingContext { struct ObjCProtocolListInfo { SmallVector ProtInfos; - SmallVector ProtEntities; + SmallVector ProtEntities; SmallVector Prots; CXIdxObjCProtocolRefListInfo getListInfo() const { @@ -249,7 +285,21 @@ class IndexingContext { AttrListInfo(const Decl *D, IndexingContext &IdxCtx, IndexingContext::StrAdapter &SA); -}; + }; + + struct CXXBasesListInfo { + SmallVector BaseInfos; + SmallVector BaseEntities; + SmallVector CXBases; + + const CXIdxBaseClassInfo *const *getBases() const { + return CXBases.data(); + } + unsigned getNumBases() const { return (unsigned)CXBases.size(); } + + CXXBasesListInfo(const CXXRecordDecl *D, + IndexingContext &IdxCtx, IndexingContext::StrAdapter &SA); + }; public: IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks, @@ -301,7 +351,7 @@ public: bool handleTagDecl(const TagDecl *D); - bool handleTypedef(const TypedefDecl *D); + bool handleTypedefName(const TypedefNameDecl *D); bool handleObjCClass(const ObjCClassDecl *D); bool handleObjCInterface(const ObjCInterfaceDecl *D); @@ -323,6 +373,10 @@ public: bool handleObjCProperty(const ObjCPropertyDecl *D); + bool handleClassTemplate(const ClassTemplateDecl *D); + bool handleFunctionTemplate(const FunctionTemplateDecl *D); + bool handleTypeAliasTemplate(const TypeAliasTemplateDecl *D); + bool handleReference(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor, const NamedDecl *Parent, const DeclContext *DC, @@ -348,6 +402,12 @@ public: void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file, unsigned *line, unsigned *column, unsigned *offset); + CXIdxClientContainer getClientContainerForDC(const DeclContext *DC) const; + void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container); + + CXIdxClientEntity getClientEntity(const Decl *D) const; + void setClientEntity(const Decl *D, CXIdxClientEntity client); + private: bool handleDecl(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor, @@ -357,32 +417,37 @@ private: SourceLocation Loc, CXCursor Cursor, ObjCContainerDeclInfo &ContDInfo); - void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container); + bool handleCXXRecordDecl(const CXXRecordDecl *RD, const NamedDecl *OrigD); bool markEntityOccurrenceInFile(const NamedDecl *D, SourceLocation Loc); const NamedDecl *getEntityDecl(const NamedDecl *D) const; - CXIdxClientContainer getIndexContainer(const NamedDecl *D) const { - return getIndexContainerForDC(D->getDeclContext()); + const DeclContext *getEntityContainer(const Decl *D) const; + + CXIdxClientContainer getClientContainer(const NamedDecl *D) const { + return getClientContainerForDC(D->getDeclContext()); } const DeclContext *getScopedContext(const DeclContext *DC) const; - CXIdxClientContainer getIndexContainerForDC(const DeclContext *DC) const; CXIdxClientFile getIndexFile(const FileEntry *File); CXIdxLoc getIndexLoc(SourceLocation Loc) const; void getEntityInfo(const NamedDecl *D, - CXIdxEntityInfo &EntityInfo, + EntityInfo &EntityInfo, StrAdapter &SA); + void getContainerInfo(const DeclContext *DC, ContainerInfo &ContInfo); + CXCursor getCursor(const Decl *D) { return cxcursor::MakeCXCursor(const_cast(D), CXTU); } CXCursor getRefCursor(const NamedDecl *D, SourceLocation Loc); + + static bool shouldIgnoreIfImplicit(const NamedDecl *D); }; }} // end clang::cxindex diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index 2cb5436c84..cf261c8f78 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -135,12 +135,19 @@ clang_getTranslationUnitSpelling clang_getTypeDeclaration clang_getTypeKindSpelling clang_hashCursor +clang_IndexAction_create +clang_IndexAction_dispose +clang_index_getClientContainer +clang_index_getClientEntity +clang_index_getCXXClassDeclInfo clang_index_getIBOutletCollectionAttrInfo clang_index_getObjCCategoryDeclInfo clang_index_getObjCContainerDeclInfo clang_index_getObjCInterfaceDeclInfo clang_index_getObjCProtocolRefListInfo clang_index_isEntityObjCContainerKind +clang_index_setClientContainer +clang_index_setClientEntity clang_indexLoc_getCXSourceLocation clang_indexLoc_getFileLocation clang_indexSourceFile