From: Argyrios Kyrtzidis Date: Sat, 12 Nov 2011 02:16:30 +0000 (+0000) Subject: [libclang] Further simplify the indexing API. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ec43adc39006a7fce94188956d0239bd54c0363;p=clang [libclang] Further simplify the indexing API. That stuff can be added later on if we need them. Also add some const goodness. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144446 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 9684f4576d..307929f22a 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3940,57 +3940,12 @@ void clang_findReferencesInFileWithBlock(CXCursor, CXFile, */ typedef void *CXIdxClientFile; -/** - * \brief The client's data object that is associated with a unique entity in - * the current translation unit that gets indexed. For example: - * - * \code - * @class Foo; - * @interface Foo - * @end - * \endcode - * - * In the example above there is only one entity introduced, the class 'Foo'. - */ -typedef void *CXIdxClientEntity; - /** * \brief The client's data object that is associated with a semantic container * of entities. - * - * \code - * // #1 \see startedTranslationUnit - * - * void func() { } // #2 \see startedStatementBody - * - * @interface Foo // #3 \see startedObjCContainer - * -(void)meth; - * @end - * - * @implementation Foo // #4 \see startedObjCContainer - * -(void)meth {} // #5 \see startedStatementBody - * @end - * - * class C { // #6 \see startedTagTypeDefinition - * void meth(); - * }; - * void C::meth() {} // #7 \see startedStatementBody - * \endcode - * - * In the example above the markings are wherever there is a callback that - * initiates a container context. The CXIdxContainer that the client returns - * for the callbacks will be passed along the indexed entities in the - * container. Note that C++ out-of-line member functions (#7) are considered - * as part of the C++ class container, not of the translation unit. */ typedef void *CXIdxClientContainer; -/** - * \brief The client's data object that is associated with a macro definition - * in the current translation unit that gets indexed. - */ -typedef void *CXIdxClientMacro; - /** * \brief The client's data object that is associated with an AST file (PCH * or module). @@ -4041,52 +3996,6 @@ typedef struct { int isModule; } CXIdxImportedASTFileInfo; -typedef struct { - /** - * \brief Location of the macro definition. - */ - CXIdxLoc loc; - const char *name; -} CXIdxMacroInfo; - -/** - * \brief Data for \see ppMacroDefined callback. - */ -typedef struct { - CXIdxMacroInfo *macroInfo; - CXIdxLoc defBegin; - /** - * \brief Length of macro definition in characters. - */ - unsigned defLength; -} CXIdxMacroDefinedInfo; - -/** - * \brief Data for \see ppMacroUndefined callback. - */ -typedef struct { - CXIdxLoc loc; - const char *name; - CXIdxClientMacro macro; -} CXIdxMacroUndefinedInfo; - -/** - * \brief Data for \see ppMacroExpanded callback. - */ -typedef struct { - CXIdxLoc loc; - const char *name; - CXIdxClientMacro macro; -} CXIdxMacroExpandedInfo; - -/** - * \brief Data for \see importedMacro callback. - */ -typedef struct { - CXIdxMacroInfo *macroInfo; - CXIdxClientASTFile ASTFile; -} CXIdxImportedMacroInfo; - typedef enum { CXIdxEntity_Unexposed = 0, CXIdxEntity_Typedef = 1, @@ -4114,28 +4023,10 @@ typedef struct { CXIdxEntityKind kind; const char *name; const char *USR; - CXIdxClientEntity clientEntity; } CXIdxEntityInfo; -/** - * \brief Data for \see importedEntity callback. - */ -typedef struct { - CXIdxEntityInfo *entityInfo; - CXCursor cursor; - CXIdxLoc loc; - CXIdxClientASTFile ASTFile; -} CXIdxImportedEntityInfo; - -typedef struct { - CXIdxEntityInfo *entity; - CXCursor cursor; - CXIdxLoc loc; - int isObjCImpl; -} CXIdxContainerInfo; - typedef struct { - CXIdxEntityInfo *entityInfo; + const CXIdxEntityInfo *entityInfo; CXCursor cursor; CXIdxLoc loc; CXIdxClientContainer container; @@ -4144,9 +4035,8 @@ typedef struct { } CXIdxDeclInfo; typedef struct { - CXIdxDeclInfo *declInfo; - int isAnonymous; -} CXIdxTagDeclInfo; + CXIdxClientContainer *outContainer; +} CXIdxDeclOut; typedef enum { CXIdxObjCContainer_ForwardRef = 0, @@ -4155,50 +4045,39 @@ typedef enum { } CXIdxObjCContainerKind; typedef struct { - CXIdxDeclInfo *declInfo; + const CXIdxDeclInfo *declInfo; CXIdxObjCContainerKind kind; } CXIdxObjCContainerDeclInfo; typedef struct { - CXIdxObjCContainerDeclInfo *containerInfo; - CXIdxEntityInfo *objcClass; + const CXIdxObjCContainerDeclInfo *containerInfo; + const CXIdxEntityInfo *objcClass; } CXIdxObjCCategoryDeclInfo; -/** - * \brief Data for \see defineObjCClass callback. - */ typedef struct { - CXIdxEntityInfo *objcClass; + const CXIdxEntityInfo *base; + CXCursor cursor; CXIdxLoc loc; -} CXIdxObjCBaseClassInfo; +} CXIdxBaseClassInfo; -/** - * \brief Data for \see defineObjCClass callback. - */ typedef struct { - CXIdxEntityInfo *protocol; + const CXIdxEntityInfo *protocol; + CXCursor cursor; CXIdxLoc loc; } CXIdxObjCProtocolRefInfo; -/** - * \brief Data for \see defineObjCClass callback. - */ typedef struct { - CXCursor cursor; - CXIdxEntityInfo *objcClass; - CXIdxClientContainer container; - CXIdxObjCBaseClassInfo *baseInfo; - CXIdxObjCProtocolRefInfo **protocols; + const CXIdxDeclInfo *declInfo; + const CXIdxBaseClassInfo *superInfo; + const CXIdxObjCProtocolRefInfo *const *protocols; unsigned numProtocols; -} CXIdxObjCClassDefineInfo; +} CXIdxObjCInterfaceDeclInfo; -/** - * \brief Data for \see endedContainer callback. - */ typedef struct { - CXIdxClientContainer container; - CXIdxLoc endLoc; -} CXIdxEndContainerInfo; + const CXIdxDeclInfo *declInfo; + const CXIdxObjCProtocolRefInfo *const *protocols; + unsigned numProtocols; +} CXIdxObjCProtocolDeclInfo; /** * \brief Data for \see indexEntityReference callback. @@ -4226,7 +4105,7 @@ typedef struct { /** * \brief The entity that gets referenced. */ - CXIdxEntityInfo *referencedEntity; + const CXIdxEntityInfo *referencedEntity; /** * \brief Immediate "parent" of the reference. For example: * @@ -4237,7 +4116,7 @@ typedef struct { * The parent of reference of type 'Foo' is the variable 'var'. * parentEntity will be null for references inside statement bodies. */ - CXIdxEntityInfo *parentEntity; + const CXIdxEntityInfo *parentEntity; /** * \brief Container context of the reference. */ @@ -4246,6 +4125,12 @@ typedef struct { } CXIdxEntityRefInfo; typedef struct { + /** + * \brief Called periodically to check whether indexing should be aborted. + * Should return 0 to continue, and non-zero to abort. + */ + int (*abortQuery)(CXClientData client_data, void *reserved); + /** * \brief Called when a diagnostic is emitted. */ @@ -4259,25 +4144,7 @@ typedef struct { * \brief Called when a file gets #included/#imported. */ CXIdxClientFile (*ppIncludedFile)(CXClientData client_data, - CXIdxIncludedFileInfo *); - - /** - * \brief Called when a macro gets #defined. - */ - CXIdxClientMacro (*ppMacroDefined)(CXClientData client_data, - CXIdxMacroDefinedInfo *); - - /** - * \brief Called when a macro gets undefined. - */ - void (*ppMacroUndefined)(CXClientData client_data, - CXIdxMacroUndefinedInfo *); - - /** - * \brief Called when a macro gets expanded. - */ - void (*ppMacroExpanded)(CXClientData client_data, - CXIdxMacroExpandedInfo *); + const CXIdxIncludedFileInfo *); /** * \brief Called when a AST file (PCH or module) gets imported. @@ -4285,72 +4152,41 @@ typedef struct { * AST files will not get indexed (there will not be callbacks to index all * the entities in an AST file). The recommended action is that, if the AST * file is not already indexed, to block further indexing and initiate a new - * indexing job specific to the AST file, so that references of entities of - * the AST file can be later associated with CXIdxEntities returned by - * \see importedEntity callbacks. + * indexing job specific to the AST file. */ CXIdxClientASTFile (*importedASTFile)(CXClientData client_data, - CXIdxImportedASTFileInfo *); - - /** - * \brief Called when an entity gets imported from an AST file. This generally - * happens when an entity from a PCH/module is referenced for the first time. - */ - CXIdxClientEntity (*importedEntity)(CXClientData client_data, - CXIdxImportedEntityInfo *); - - /** - * \brief Called when a macro gets imported from an AST file. This generally - * happens when a macro from a PCH/module is referenced for the first time. - */ - CXIdxClientMacro (*importedMacro)(CXClientData client_data, - CXIdxImportedMacroInfo *); + const CXIdxImportedASTFileInfo *); /** * \brief Called at the beginning of indexing a translation unit. */ CXIdxClientContainer (*startedTranslationUnit)(CXClientData client_data, - void *reserved); + void *reserved); - CXIdxClientEntity (*indexDeclaration)(CXClientData client_data, - CXIdxDeclInfo *); - - /** - * \brief Called to initiate a container context. - */ - CXIdxClientContainer (*startedContainer)(CXClientData client_data, - CXIdxContainerInfo *); - - /** - * \brief Called to define an ObjC class via its @interface. - */ - void (*defineObjCClass)(CXClientData client_data, - CXIdxObjCClassDefineInfo *); - - /** - * \brief Called when a container context is ended. - */ - void (*endedContainer)(CXClientData client_data, - CXIdxEndContainerInfo *); + void (*indexDeclaration)(CXClientData client_data, + const CXIdxDeclInfo *, const CXIdxDeclOut *); /** * \brief Called to index a reference of an entity. */ void (*indexEntityReference)(CXClientData client_data, - CXIdxEntityRefInfo *); + const CXIdxEntityRefInfo *); } IndexerCallbacks; -CINDEX_LINKAGE int clang_index_isEntityTagKind(CXIdxEntityKind); -CINDEX_LINKAGE CXIdxTagDeclInfo *clang_index_getTagDeclInfo(CXIdxDeclInfo *); - CINDEX_LINKAGE int clang_index_isEntityObjCContainerKind(CXIdxEntityKind); -CINDEX_LINKAGE CXIdxObjCContainerDeclInfo * -clang_index_getObjCContainerDeclInfo(CXIdxDeclInfo *); +CINDEX_LINKAGE const CXIdxObjCContainerDeclInfo * +clang_index_getObjCContainerDeclInfo(const CXIdxDeclInfo *); + +CINDEX_LINKAGE const CXIdxObjCInterfaceDeclInfo * +clang_index_getObjCInterfaceDeclInfo(const CXIdxDeclInfo *); -CINDEX_LINKAGE int clang_index_isEntityObjCCategoryKind(CXIdxEntityKind); CINDEX_LINKAGE -CXIdxObjCCategoryDeclInfo *clang_index_getObjCCategoryDeclInfo(CXIdxDeclInfo *); +const CXIdxObjCCategoryDeclInfo * +clang_index_getObjCCategoryDeclInfo(const CXIdxDeclInfo *); + +CINDEX_LINKAGE const CXIdxObjCProtocolDeclInfo * +clang_index_getObjCProtocolDeclInfo(const CXIdxDeclInfo *); /** * \brief Index the given source file and the translation unit corresponding diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 833c5b47b2..ac2ab4fdd9 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1577,7 +1577,8 @@ static void printCXIndexLoc(CXIdxLoc loc) { printf("%d:%d", line, column); } -static CXIdxClientEntity makeClientEntity(CXIdxEntityInfo *info, CXIdxLoc loc) { +static CXIdxClientContainer makeClientContainer(const CXIdxEntityInfo *info, + CXIdxLoc loc) { const char *name; char *newStr; CXIdxClientFile file; @@ -1591,7 +1592,7 @@ static CXIdxClientEntity makeClientEntity(CXIdxEntityInfo *info, CXIdxLoc loc) { /* FIXME: free these.*/ newStr = (char *)malloc(strlen(name) + 10); sprintf(newStr, "%s:%d:%d", name, line, column); - return (CXIdxClientEntity)newStr; + return (CXIdxClientContainer)newStr; } static void printCXIndexContainer(CXIdxClientContainer container) { @@ -1617,12 +1618,13 @@ static const char *getEntityKindString(CXIdxEntityKind kind) { case CXIdxEntity_Union: return "union"; case CXIdxEntity_CXXClass: return "c++-class"; } - return ""; + assert(0 && "Garbage entity kind"); + return 0; } static void printEntityInfo(const char *cb, CXClientData client_data, - CXIdxEntityInfo *info) { + const CXIdxEntityInfo *info) { const char *name; IndexData *index_data; index_data = (IndexData *)client_data; @@ -1670,7 +1672,7 @@ static CXIdxClientFile index_enteredMainFile(CXClientData client_data, } static CXIdxClientFile index_ppIncludedFile(CXClientData client_data, - CXIdxIncludedFileInfo *info) { + const CXIdxIncludedFileInfo *info) { IndexData *index_data; index_data = (IndexData *)client_data; printCheck(index_data); @@ -1685,62 +1687,6 @@ static CXIdxClientFile index_ppIncludedFile(CXClientData client_data, return (CXIdxClientFile)info->file; } -static CXIdxClientMacro index_ppMacroDefined(CXClientData client_data, - CXIdxMacroDefinedInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printf("[ppMacroDefined]: %s", info->macroInfo->name); - printf(" | loc: "); - printCXIndexLoc(info->macroInfo->loc); - printf(" | defBegin: "); - printCXIndexLoc(info->defBegin); - printf(" | length: %d\n", info->defLength); - - return (CXIdxClientMacro)info->macroInfo->name; -} - -static void index_ppMacroUndefined(CXClientData client_data, - CXIdxMacroUndefinedInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printf("[ppMacroUndefined]: %s", info->name); - printf(" | loc: "); - printCXIndexLoc(info->loc); - printf("\n"); -} - -static void index_ppMacroExpanded(CXClientData client_data, - CXIdxMacroExpandedInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printf("[ppMacroExpanded]: %s", info->name); - printf(" | loc: "); - printCXIndexLoc(info->loc); - printf("\n"); -} - -static CXIdxClientEntity index_importedEntity(CXClientData client_data, - CXIdxImportedEntityInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printEntityInfo("[importedEntity]", client_data, info->entityInfo); - printf(" | cursor: "); - PrintCursor(info->cursor); - printf(" | loc: "); - printCXIndexLoc(info->loc); - printf("\n"); - - return makeClientEntity(info->entityInfo, info->loc); -} - static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_data, void *reserved) { IndexData *index_data; @@ -1751,9 +1697,14 @@ static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_dat return (CXIdxClientContainer)"TU"; } -static CXIdxClientEntity index_indexDeclaration(CXClientData client_data, - CXIdxDeclInfo *info) { +static void index_indexDeclaration(CXClientData client_data, + const CXIdxDeclInfo *info, + const CXIdxDeclOut *outData) { IndexData *index_data; + const CXIdxObjCCategoryDeclInfo *CatInfo; + const CXIdxObjCInterfaceDeclInfo *InterInfo; + const CXIdxObjCProtocolDeclInfo *ProtoInfo; + unsigned i; index_data = (IndexData *)client_data; printEntityInfo("[indexDeclaration]", client_data, info->entityInfo); @@ -1766,13 +1717,6 @@ static CXIdxClientEntity index_indexDeclaration(CXClientData client_data, printf(" | isRedecl: %d", info->isRedeclaration); printf(" | isDef: %d\n", info->isDefinition); - - if (clang_index_isEntityTagKind(info->entityInfo->kind)) { - printCheck(index_data); - printf(" : isAnonymous: %d\n", - clang_index_getTagDeclInfo(info)->isAnonymous); - } - if (clang_index_isEntityObjCContainerKind(info->entityInfo->kind)) { const char *kindName = 0; CXIdxObjCContainerKind K = clang_index_getObjCContainerDeclInfo(info)->kind; @@ -1788,64 +1732,51 @@ static CXIdxClientEntity index_indexDeclaration(CXClientData client_data, printf(" : kind: %s\n", kindName); } - if (clang_index_isEntityObjCCategoryKind(info->entityInfo->kind)) { - CXIdxObjCCategoryDeclInfo * - CatInfo = clang_index_getObjCCategoryDeclInfo(info); + if ((CatInfo = clang_index_getObjCCategoryDeclInfo(info))) { printEntityInfo(" : class", client_data, CatInfo->objcClass); printf("\n"); } - if (!info->isRedeclaration) - return makeClientEntity(info->entityInfo, info->loc); - - return 0; -} - -static CXIdxClientContainer -index_startedContainer(CXClientData client_data, CXIdxContainerInfo *info) { - printEntityInfo("[startedContainer]", client_data, info->entity); - printf(" | cursor: "); - PrintCursor(info->cursor); - printf(" | loc: "); - printCXIndexLoc(info->loc); - printf(" | isObjCImpl: %d\n", info->isObjCImpl); - - return (CXIdxClientContainer)info->entity->clientEntity; -} - -static void index_defineObjCClass(CXClientData client_data, - CXIdxObjCClassDefineInfo *info) { - printEntityInfo("[defineObjCClass]", client_data, info->objcClass); - printf(" | cursor: "); - PrintCursor(info->cursor); - printf(" | container: "); - printCXIndexContainer(info->container); - - if (info->baseInfo) { - printEntityInfo(" | ", client_data, info->baseInfo->objcClass); - printf(" | base loc: "); - printCXIndexLoc(info->baseInfo->loc); + if ((InterInfo = clang_index_getObjCInterfaceDeclInfo(info))) { + if (InterInfo->superInfo) { + printEntityInfo(" : base", client_data, + InterInfo->superInfo->base); + printf(" | cursor: "); + PrintCursor(InterInfo->superInfo->cursor); + printf(" | loc: "); + printCXIndexLoc(InterInfo->superInfo->loc); + printf("\n"); + } + for (i = 0; i < InterInfo->numProtocols; ++i) { + printEntityInfo(" : protocol", client_data, + InterInfo->protocols[i]->protocol); + printf(" | cursor: "); + PrintCursor(InterInfo->protocols[i]->cursor); + printf(" | loc: "); + printCXIndexLoc(InterInfo->protocols[i]->loc); + printf("\n"); + } } - printf("\n"); -} - -static void index_endedContainer(CXClientData client_data, - CXIdxEndContainerInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); + if ((ProtoInfo = clang_index_getObjCProtocolDeclInfo(info))) { + for (i = 0; i < ProtoInfo->numProtocols; ++i) { + printEntityInfo(" : protocol", client_data, + ProtoInfo->protocols[i]->protocol); + printf(" | cursor: "); + PrintCursor(ProtoInfo->protocols[i]->cursor); + printf(" | loc: "); + printCXIndexLoc(ProtoInfo->protocols[i]->loc); + printf("\n"); + } + } - printf("[endedContainer]: "); - printCXIndexContainer(info->container); - printf(" | end: "); - printCXIndexLoc(info->endLoc); - printf("\n"); + if (outData->outContainer) + *outData->outContainer = makeClientContainer(info->entityInfo, info->loc); } static void index_indexEntityReference(CXClientData client_data, - CXIdxEntityRefInfo *info) { + const CXIdxEntityRefInfo *info) { printEntityInfo("[indexEntityReference]", client_data, info->referencedEntity); printf(" | cursor: "); PrintCursor(info->cursor); @@ -1863,20 +1794,13 @@ static void index_indexEntityReference(CXClientData client_data, } static IndexerCallbacks IndexCB = { + 0, /*abortQuery*/ index_diagnostic, index_enteredMainFile, index_ppIncludedFile, - index_ppMacroDefined, - index_ppMacroUndefined, - index_ppMacroExpanded, 0, /*importedASTFile*/ - index_importedEntity, - 0,/*index_importedMacro,*/ index_startedTranslationUnit, index_indexDeclaration, - index_startedContainer, - index_defineObjCClass, - index_endedContainer, index_indexEntityReference }; diff --git a/tools/libclang/IndexDecl.cpp b/tools/libclang/IndexDecl.cpp index 5087355a8d..58f449d3cc 100644 --- a/tools/libclang/IndexDecl.cpp +++ b/tools/libclang/IndexDecl.cpp @@ -29,9 +29,7 @@ public: if (D->isThisDeclarationADefinition()) { const Stmt *Body = D->getBody(); if (Body) { - IndexCtx.startContainer(D, /*isBody=*/true); IndexCtx.indexBody(Body, D); - IndexCtx.endContainer(D); } } return true; @@ -93,10 +91,7 @@ public: IndexCtx.handleObjCInterface(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.startContainer(D); - IndexCtx.defineObjCInterface(D); IndexCtx.indexDeclContext(D); - IndexCtx.endContainer(D); return true; } @@ -108,9 +103,7 @@ public: IndexCtx.handleObjCProtocol(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.startContainer(D); IndexCtx.indexDeclContext(D); - IndexCtx.endContainer(D); return true; } @@ -118,9 +111,7 @@ public: IndexCtx.handleObjCImplementation(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.startContainer(D); IndexCtx.indexDeclContext(D); - IndexCtx.endContainer(D); return true; } @@ -128,9 +119,7 @@ public: IndexCtx.handleObjCCategory(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.startContainer(D); IndexCtx.indexDeclContext(D); - IndexCtx.endContainer(D); return true; } @@ -141,9 +130,7 @@ public: IndexCtx.handleObjCCategoryImpl(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.startContainer(D); IndexCtx.indexDeclContext(D); - IndexCtx.endContainer(D); return true; } @@ -157,9 +144,7 @@ public: if (D->isThisDeclarationADefinition()) { const Stmt *Body = D->getBody(); if (Body) { - IndexCtx.startContainer(D, /*isBody=*/true); IndexCtx.indexBody(Body, D); - IndexCtx.endContainer(D); } } return true; diff --git a/tools/libclang/IndexTypeSourceInfo.cpp b/tools/libclang/IndexTypeSourceInfo.cpp index bba9dbb6e7..b63ebddfb0 100644 --- a/tools/libclang/IndexTypeSourceInfo.cpp +++ b/tools/libclang/IndexTypeSourceInfo.cpp @@ -87,8 +87,6 @@ void IndexingContext::indexTypeLoc(TypeLoc TL, void IndexingContext::indexTagDecl(const TagDecl *D) { handleTagDecl(D); if (D->isThisDeclarationADefinition()) { - startContainer(D); indexDeclContext(D); - endContainer(D); } } diff --git a/tools/libclang/Indexing.cpp b/tools/libclang/Indexing.cpp index 4bea88f8de..8d90505971 100644 --- a/tools/libclang/Indexing.cpp +++ b/tools/libclang/Indexing.cpp @@ -75,47 +75,16 @@ public: /// MacroDefined - This hook is called whenever a macro definition is seen. virtual void MacroDefined(const Token &Id, const MacroInfo *MI) { - if (MI->isBuiltinMacro()) - return; - if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc())) - return; - - SourceLocation Loc = MI->getDefinitionLoc(); - SourceLocation DefBegin = MI->tokens_empty() ? Loc - : MI->getReplacementToken(0).getLocation(); - IndexCtx.ppMacroDefined(Loc, - Id.getIdentifierInfo()->getName(), - DefBegin, - MI->getDefinitionLength(PP.getSourceManager()), - MI); } /// MacroUndefined - This hook is called whenever a macro #undef is seen. /// MI is released immediately following this callback. virtual void MacroUndefined(const Token &MacroNameTok, const MacroInfo *MI) { - if (MI->isBuiltinMacro()) - return; - if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc())) - return; - - SourceLocation Loc = MacroNameTok.getLocation(); - IndexCtx.ppMacroUndefined(Loc, - MacroNameTok.getIdentifierInfo()->getName(), - MI); } /// MacroExpands - This is called by when a macro invocation is found. virtual void MacroExpands(const Token &MacroNameTok, const MacroInfo* MI, SourceRange Range) { - if (MI->isBuiltinMacro()) - return; - if (IndexCtx.isNotFromSourceFile(MI->getDefinitionLoc())) - return; - - SourceLocation Loc = MacroNameTok.getLocation(); - IndexCtx.ppMacroExpanded(Loc, - MacroNameTok.getIdentifierInfo()->getName(), - MI); } /// SourceRangeSkipped - This hook is called when a source range is skipped. @@ -140,11 +109,10 @@ public: virtual void Initialize(ASTContext &Context) { IndexCtx.setASTContext(Context); - IndexCtx.invokeStartedTranslationUnit(); + IndexCtx.startedTranslationUnit(); } virtual void HandleTranslationUnit(ASTContext &Ctx) { - IndexCtx.invokeFinishedTranslationUnit(); } virtual void HandleTopLevelDecl(DeclGroupRef DG) { @@ -404,41 +372,57 @@ static void clang_indexTranslationUnit_Impl(void *UserData) { extern "C" { -int clang_index_isEntityTagKind(CXIdxEntityKind K) { - return CXIdxEntity_Enum <= K && K <= CXIdxEntity_CXXClass; +int clang_index_isEntityObjCContainerKind(CXIdxEntityKind K) { + return CXIdxEntity_ObjCClass <= K && K <= CXIdxEntity_ObjCCategory; } -CXIdxTagDeclInfo *clang_index_getTagDeclInfo(CXIdxDeclInfo *DInfo) { - if (clang_index_isEntityTagKind(DInfo->entityInfo->kind)) - return &static_cast(DInfo)->CXTagDeclInfo; +const CXIdxObjCContainerDeclInfo * +clang_index_getObjCContainerDeclInfo(const CXIdxDeclInfo *DInfo) { + if (!DInfo) + return 0; + + if (clang_index_isEntityObjCContainerKind(DInfo->entityInfo->kind)) + return &static_cast(DInfo)->ObjCContDeclInfo; return 0; } -int clang_index_isEntityObjCContainerKind(CXIdxEntityKind K) { - return CXIdxEntity_ObjCClass <= K && K <= CXIdxEntity_ObjCCategory; -} +const CXIdxObjCInterfaceDeclInfo * +clang_index_getObjCInterfaceDeclInfo(const CXIdxDeclInfo *DInfo) { + if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCClass) + return 0; -CXIdxObjCContainerDeclInfo * -clang_index_getObjCContainerDeclInfo(CXIdxDeclInfo *DInfo) { - if (clang_index_isEntityObjCContainerKind(DInfo->entityInfo->kind)) - return &static_cast(DInfo)->CXObjCContDeclInfo; + if (const CXIdxObjCContainerDeclInfo * + ContInfo = clang_index_getObjCContainerDeclInfo(DInfo)) { + if (ContInfo->kind == CXIdxObjCContainer_Interface) + return &static_cast(DInfo)->ObjCInterDeclInfo; + } return 0; } -int clang_index_isEntityObjCCategoryKind(CXIdxEntityKind K) { - return K == CXIdxEntity_ObjCCategory; -} +const CXIdxObjCProtocolDeclInfo * +clang_index_getObjCProtocolDeclInfo(const CXIdxDeclInfo *DInfo) { + if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCProtocol) + return 0; -CXIdxObjCCategoryDeclInfo * -clang_index_getObjCCategoryDeclInfo(CXIdxDeclInfo *DInfo){ - if (clang_index_isEntityObjCCategoryKind(DInfo->entityInfo->kind)) - return &static_cast(DInfo)->CXObjCCatDeclInfo; + if (const CXIdxObjCContainerDeclInfo * + ContInfo = clang_index_getObjCContainerDeclInfo(DInfo)) { + if (ContInfo->kind == CXIdxObjCContainer_Interface) + return &static_cast(DInfo)->ObjCProtoDeclInfo; + } return 0; } +const CXIdxObjCCategoryDeclInfo * +clang_index_getObjCCategoryDeclInfo(const CXIdxDeclInfo *DInfo){ + if (!DInfo || DInfo->entityInfo->kind != CXIdxEntity_ObjCCategory) + return 0; + + return &static_cast(DInfo)->ObjCCatDeclInfo; +} + int clang_indexTranslationUnit(CXIndex CIdx, CXClientData client_data, IndexerCallbacks *index_callbacks, diff --git a/tools/libclang/IndexingContext.cpp b/tools/libclang/IndexingContext.cpp index 3d3277210e..d612a3b213 100644 --- a/tools/libclang/IndexingContext.cpp +++ b/tools/libclang/IndexingContext.cpp @@ -18,6 +18,30 @@ using namespace clang; using namespace cxindex; using namespace cxcursor; +IndexingContext::ObjCProtocolListInfo::ObjCProtocolListInfo( + const ObjCProtocolList &ProtList, + IndexingContext &IdxCtx, + StrAdapter &SA) { + ObjCInterfaceDecl::protocol_loc_iterator LI = ProtList.loc_begin(); + for (ObjCInterfaceDecl::protocol_iterator + I = ProtList.begin(), E = ProtList.end(); I != E; ++I, ++LI) { + SourceLocation Loc = *LI; + ObjCProtocolDecl *PD = *I; + ProtEntities.push_back(CXIdxEntityInfo()); + IdxCtx.getEntityInfo(PD, ProtEntities.back(), SA); + CXIdxObjCProtocolRefInfo ProtInfo = { 0, + MakeCursorObjCProtocolRef(PD, Loc, IdxCtx.CXTU), + IdxCtx.getIndexLoc(Loc) }; + ProtInfos.push_back(ProtInfo); + } + + for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) + ProtInfos[i].protocol = &ProtEntities[i]; + + for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) + Prots.push_back(&ProtInfos[i]); +} + const char *IndexingContext::StrAdapter::toCStr(StringRef Str) { if (Str.empty()) return ""; @@ -56,53 +80,13 @@ void IndexingContext::ppIncludedFile(SourceLocation hashLoc, FileMap[File] = idxFile; } -void IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name, - SourceLocation DefBegin, unsigned Length, - const void *OpaqueMacro) { - if (!CB.ppMacroDefined) - return; - - StrAdapter SA(*this); - CXIdxMacroInfo MacroInfo = { getIndexLoc(Loc), SA.toCStr(Name) }; - CXIdxMacroDefinedInfo Info = { &MacroInfo, - getIndexLoc(DefBegin), Length }; - CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info); - MacroMap[OpaqueMacro] = idxMacro; -} - -void IndexingContext::ppMacroUndefined(SourceLocation Loc, StringRef Name, - const void *OpaqueMacro) { - if (!CB.ppMacroUndefined) - return; - - StrAdapter SA(*this); - CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc), - SA.toCStr(Name), 0 }; - CB.ppMacroUndefined(ClientData, &Info); -} - -void IndexingContext::ppMacroExpanded(SourceLocation Loc, StringRef Name, - const void *OpaqueMacro) { - if (!CB.ppMacroExpanded) - return; - - StrAdapter SA(*this); - CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc), - SA.toCStr(Name), 0 }; - CB.ppMacroExpanded(ClientData, &Info); -} - -void IndexingContext::invokeStartedTranslationUnit() { +void IndexingContext::startedTranslationUnit() { CXIdxClientContainer idxCont = 0; if (CB.startedTranslationUnit) idxCont = CB.startedTranslationUnit(ClientData, 0); addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont); } -void IndexingContext::invokeFinishedTranslationUnit() { - endContainer(Ctx->getTranslationUnitDecl()); -} - void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) { if (!CB.diagnostic) return; @@ -114,6 +98,7 @@ void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) { void IndexingContext::handleDecl(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor, bool isRedeclaration, bool isDefinition, + bool isContainer, DeclInfo &DInfo) { if (!CB.indexDeclaration) return; @@ -127,11 +112,12 @@ void IndexingContext::handleDecl(const NamedDecl *D, DInfo.isRedeclaration = isRedeclaration; DInfo.isDefinition = isDefinition; - CXIdxClientEntity - clientEnt = CB.indexDeclaration(ClientData, &DInfo); + CXIdxClientContainer clientCont = 0; + CXIdxDeclOut DeclOut = { isContainer ? &clientCont : 0 }; + CB.indexDeclaration(ClientData, &DInfo, &DeclOut); - if (!isRedeclaration) - addEntityInMap(D, clientEnt); + if (isContainer) + addContainerInMap(cast(D), clientCont); } void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D, @@ -140,57 +126,59 @@ void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D, bool isRedeclaration, bool isImplementation, ObjCContainerDeclInfo &ContDInfo) { - ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo; + ContDInfo.ObjCContDeclInfo.declInfo = &ContDInfo; if (isForwardRef) - ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef; + ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef; else if (isImplementation) - ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation; + ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation; else - ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface; + ContDInfo.ObjCContDeclInfo.kind = CXIdxObjCContainer_Interface; handleDecl(D, Loc, Cursor, - isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo); + isRedeclaration, /*isDefinition=*/!isForwardRef, + /*isContainer=*/!isForwardRef, ContDInfo); } void IndexingContext::handleFunction(const FunctionDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), - DInfo); + D->isThisDeclarationADefinition(), DInfo); } void IndexingContext::handleVar(const VarDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), - DInfo); + /*isContainer=*/false, DInfo); } void IndexingContext::handleField(const FieldDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), - /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo); + /*isRedeclaration=*/false, /*isDefinition=*/true, + /*isContainer=*/false, DInfo); } void IndexingContext::handleEnumerator(const EnumConstantDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), - /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo); + /*isRedeclaration=*/false, /*isDefinition=*/true, + /*isContainer=*/false, DInfo); } void IndexingContext::handleTagDecl(const TagDecl *D) { - TagDeclInfo TagDInfo; - TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo; - TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0; + DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), !D->isFirstDeclaration(), D->isThisDeclarationADefinition(), - TagDInfo); + D->isThisDeclarationADefinition(), DInfo); } void IndexingContext::handleTypedef(const TypedefDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), - !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo); + !D->isFirstDeclaration(), /*isDefinition=*/true, + /*isContainer=*/false, DInfo); } void IndexingContext::handleObjCClass(const ObjCClassDecl *D) { @@ -205,18 +193,38 @@ void IndexingContext::handleObjCClass(const ObjCClassDecl *D) { } void IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) { - ObjCContainerDeclInfo ContDInfo; + StrAdapter SA(*this); + + CXIdxBaseClassInfo BaseClass; + CXIdxEntityInfo BaseEntity; + BaseClass.cursor = clang_getNullCursor(); + if (ObjCInterfaceDecl *SuperD = D->getSuperClass()) { + getEntityInfo(SuperD, BaseEntity, SA); + SourceLocation SuperLoc = D->getSuperClassLoc(); + BaseClass.base = &BaseEntity; + BaseClass.cursor = MakeCursorObjCSuperClassRef(SuperD, SuperLoc, CXTU); + BaseClass.loc = getIndexLoc(SuperLoc); + } + + ObjCProtocolListInfo ProtInfo(D->getReferencedProtocols(), *this, SA); + + ObjCInterfaceDeclInfo InterInfo; + InterInfo.ObjCInterDeclInfo.declInfo = &InterInfo; + InterInfo.ObjCInterDeclInfo.superInfo = D->getSuperClass() ? &BaseClass : 0; + InterInfo.ObjCInterDeclInfo.protocols = ProtInfo.getProtocolRefs(); + InterInfo.ObjCInterDeclInfo.numProtocols = ProtInfo.getNumProtocols(); + handleObjCContainer(D, D->getLocation(), getCursor(D), /*isForwardRef=*/false, /*isRedeclaration=*/D->isInitiallyForwardDecl(), - /*isImplementation=*/false, ContDInfo); + /*isImplementation=*/false, InterInfo); } void IndexingContext::handleObjCImplementation( const ObjCImplementationDecl *D) { ObjCContainerDeclInfo ContDInfo; const ObjCInterfaceDecl *Class = D->getClassInterface(); - handleObjCContainer(Class, D->getLocation(), getCursor(D), + handleObjCContainer(D, D->getLocation(), getCursor(D), /*isForwardRef=*/false, /*isRedeclaration=*/!Class->isImplicitInterfaceDecl(), /*isImplementation=*/true, ContDInfo); @@ -233,55 +241,18 @@ void IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D, } void IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) { - ObjCContainerDeclInfo ContDInfo; - handleObjCContainer(D, D->getLocation(), getCursor(D), - /*isForwardRef=*/false, - /*isRedeclaration=*/D->isInitiallyForwardDecl(), - /*isImplementation=*/false, ContDInfo); -} - -void IndexingContext::defineObjCInterface(const ObjCInterfaceDecl *D) { - if (!CB.defineObjCClass) - return; - StrAdapter SA(*this); - CXIdxObjCBaseClassInfo BaseClass; - CXIdxEntityInfo BaseEntity; - if (D->getSuperClass()) { - getEntityInfo(D->getSuperClass(), BaseEntity, SA); - BaseClass.objcClass = &BaseEntity; - BaseClass.loc = getIndexLoc(D->getSuperClassLoc()); - } - - SmallVector ProtInfos; - SmallVector ProtEntities; - ObjCInterfaceDecl::protocol_loc_iterator LI = D->protocol_loc_begin(); - for (ObjCInterfaceDecl::protocol_iterator - I = D->protocol_begin(), E = D->protocol_end(); I != E; ++I, ++LI) { - SourceLocation Loc = *LI; - ObjCProtocolDecl *PD = *I; - ProtEntities.push_back(CXIdxEntityInfo()); - getEntityInfo(PD, ProtEntities.back(), SA); - CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) }; - ProtInfos.push_back(ProtInfo); - } + ObjCProtocolListInfo ProtListInfo(D->getReferencedProtocols(), *this, SA); - for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i) - ProtInfos[i].protocol = &ProtEntities[i]; + ObjCProtocolDeclInfo ProtInfo; + ProtInfo.ObjCProtoDeclInfo.declInfo = &ProtInfo; + ProtInfo.ObjCProtoDeclInfo.protocols = ProtListInfo.getProtocolRefs(); + ProtInfo.ObjCProtoDeclInfo.numProtocols = ProtListInfo.getNumProtocols(); - SmallVector Prots; - for (unsigned i = 0, e = Prots.size(); i != e; ++i) - Prots.push_back(&ProtInfos[i]); - - CXIdxEntityInfo ClassEntity; - getEntityInfo(D, ClassEntity, SA); - CXIdxObjCClassDefineInfo Info = { getCursor(D), - &ClassEntity, - getIndexContainerForDC(D), - D->getSuperClass() ? &BaseClass : 0, - Prots.data(), - static_cast(Prots.size()) }; - CB.defineObjCClass(ClientData, &Info); + handleObjCContainer(D, D->getLocation(), getCursor(D), + /*isForwardRef=*/false, + /*isRedeclaration=*/D->isInitiallyForwardDecl(), + /*isImplementation=*/false, ProtInfo); } void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { @@ -290,8 +261,8 @@ void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) { StrAdapter SA(*this); getEntityInfo(D->getClassInterface(), ClassEntity, SA); - CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo; - CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity; + CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; + CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; handleObjCContainer(D, D->getLocation(), getCursor(D), /*isForwardRef=*/false, /*isRedeclaration=*/false, @@ -305,9 +276,9 @@ void IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) { StrAdapter SA(*this); getEntityInfo(CatD->getClassInterface(), ClassEntity, SA); - CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo; - CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity; - handleObjCContainer(CatD, D->getLocation(), getCursor(D), + CatDInfo.ObjCCatDeclInfo.containerInfo = &CatDInfo.ObjCContDeclInfo; + CatDInfo.ObjCCatDeclInfo.objcClass = &ClassEntity; + handleObjCContainer(D, D->getLocation(), getCursor(D), /*isForwardRef=*/false, /*isRedeclaration=*/true, /*isImplementation=*/true, CatDInfo); @@ -317,14 +288,14 @@ void IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), !D->isCanonicalDecl(), D->isThisDeclarationADefinition(), - DInfo); + D->isThisDeclarationADefinition(), DInfo); } void IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) { DeclInfo DInfo; handleDecl(D, D->getLocation(), getCursor(D), /*isRedeclaration=*/false, /*isDefinition=*/false, - DInfo); + /*isContainer=*/false, DInfo); } void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, @@ -356,35 +327,6 @@ void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc, CB.indexEntityReference(ClientData, &Info); } -void IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody, - const DeclContext *DC) { - if (!CB.startedContainer) - return; - - if (!DC) - DC = cast(D); - - StrAdapter SA(*this); - CXIdxEntityInfo Entity; - getEntityInfo(D, Entity, SA); - CXIdxContainerInfo Info; - Info.entity = &Entity; - Info.cursor = getCursor(D); - Info.loc = getIndexLoc(D->getLocation()); - Info.isObjCImpl = isa(D); - - CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info); - addContainerInMap(DC, clientCont); -} - -void IndexingContext::endContainer(const DeclContext *DC) { - if (CB.endedContainer) { - CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC), - getIndexLoc(cast(DC)->getLocEnd()) }; - CB.endedContainer(ClientData, &Info); - } -} - bool IndexingContext::isNotFromSourceFile(SourceLocation Loc) const { if (Loc.isInvalid()) return true; @@ -411,44 +353,6 @@ void IndexingContext::addContainerInMap(const DeclContext *DC, ContainerMap.erase(I); } -void IndexingContext::addEntityInMap(const NamedDecl *D, - CXIdxClientEntity entity) { - assert(getEntityDecl(D) == D && - "Tried to add a non-entity (canonical) decl"); - assert(EntityMap.find(D) == EntityMap.end()); - if (entity || D->isFromASTFile()) - EntityMap[D] = entity; -} - -CXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) { - if (!D) - return 0; - D = getEntityDecl(D); - EntityMapTy::const_iterator I = EntityMap.find(D); - if (I != EntityMap.end()) - return I->second; - - if (!D->isFromASTFile()) { - //assert(0 && "Entity not in map"); - return 0; - } - - StrAdapter SA(*this); - - CXIdxClientEntity idxEntity = 0; - if (CB.importedEntity) { - CXIdxEntityInfo EntityInfo; - getEntityInfo(D, EntityInfo, SA); - CXIdxImportedEntityInfo Info = { &EntityInfo, - getCursor(D), - getIndexLoc(D->getLocation()), - /*CXIdxASTFile*/0 }; - idxEntity = CB.importedEntity(ClientData, &Info); - } - addEntityInMap(D, idxEntity); - return idxEntity; -} - const NamedDecl *IndexingContext::getEntityDecl(const NamedDecl *D) const { assert(D); D = cast(D->getCanonicalDecl()); @@ -554,7 +458,6 @@ void IndexingContext::getEntityInfo(const NamedDecl *D, StrAdapter &SA) { D = getEntityDecl(D); EntityInfo.kind = CXIdxEntity_Unexposed; - EntityInfo.clientEntity = getClientEntity(D); if (const TagDecl *TD = dyn_cast(D)) { switch (TD->getTagKind()) { diff --git a/tools/libclang/IndexingContext.h b/tools/libclang/IndexingContext.h index 8d5f56609f..b367b72b3a 100644 --- a/tools/libclang/IndexingContext.h +++ b/tools/libclang/IndexingContext.h @@ -10,7 +10,7 @@ #include "Index_Internal.h" #include "CXCursor.h" -#include "clang/AST/Decl.h" +#include "clang/AST/DeclObjC.h" #include "clang/AST/DeclGroup.h" #include "llvm/ADT/DenseMap.h" @@ -26,16 +26,20 @@ struct DeclInfo : public CXIdxDeclInfo { CXIdxEntityInfo CXEntInfo; }; -struct TagDeclInfo : public DeclInfo { - CXIdxTagDeclInfo CXTagDeclInfo; -}; - struct ObjCContainerDeclInfo : public DeclInfo { - CXIdxObjCContainerDeclInfo CXObjCContDeclInfo; + CXIdxObjCContainerDeclInfo ObjCContDeclInfo; }; struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo { - CXIdxObjCCategoryDeclInfo CXObjCCatDeclInfo; + CXIdxObjCCategoryDeclInfo ObjCCatDeclInfo; +}; + +struct ObjCInterfaceDeclInfo : public ObjCCategoryDeclInfo { + CXIdxObjCInterfaceDeclInfo ObjCInterDeclInfo; +}; + +struct ObjCProtocolDeclInfo : public ObjCCategoryDeclInfo { + CXIdxObjCProtocolDeclInfo ObjCProtoDeclInfo; }; class IndexingContext { @@ -46,12 +50,8 @@ class IndexingContext { CXTranslationUnit CXTU; typedef llvm::DenseMap FileMapTy; - typedef llvm::DenseMap EntityMapTy; - typedef llvm::DenseMap MacroMapTy; typedef llvm::DenseMap ContainerMapTy; FileMapTy FileMap; - EntityMapTy EntityMap; - MacroMapTy MacroMap; ContainerMapTy ContainerMap; SmallVector TUDeclsInObjCContainer; @@ -87,6 +87,19 @@ class IndexingContext { SmallVectorImpl &getBuffer() { return Scratch; } }; + struct ObjCProtocolListInfo { + SmallVector ProtInfos; + SmallVector ProtEntities; + SmallVector Prots; + + CXIdxObjCProtocolRefInfo **getProtocolRefs() { return Prots.data(); } + unsigned getNumProtocols() { return (unsigned)Prots.size(); } + + ObjCProtocolListInfo(const ObjCProtocolList &ProtList, + IndexingContext &IdxCtx, + IndexingContext::StrAdapter &SA); + }; + public: IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks, unsigned indexOptions, CXTranslationUnit cxTU) @@ -103,19 +116,7 @@ public: StringRef filename, const FileEntry *File, bool isImport, bool isAngled); - void ppMacroDefined(SourceLocation Loc, StringRef Name, - SourceLocation DefBegin, unsigned Length, - const void *OpaqueMacro); - - void ppMacroUndefined(SourceLocation Loc, StringRef Name, - const void *OpaqueMacro); - - void ppMacroExpanded(SourceLocation Loc, StringRef Name, - const void *OpaqueMacro); - - void invokeStartedTranslationUnit(); - - void invokeFinishedTranslationUnit(); + void startedTranslationUnit(); void indexDecl(const Decl *D); @@ -148,8 +149,6 @@ public: void handleObjCClass(const ObjCClassDecl *D); void handleObjCInterface(const ObjCInterfaceDecl *D); void handleObjCImplementation(const ObjCImplementationDecl *D); - - void defineObjCInterface(const ObjCInterfaceDecl *D); void handleObjCForwardProtocol(const ObjCProtocolDecl *D, SourceLocation Loc, @@ -169,11 +168,6 @@ public: const DeclContext *DC, const Expr *E = 0, CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct); - - void startContainer(const NamedDecl *D, bool isStmtBody = false, - const DeclContext *DC = 0); - - void endContainer(const DeclContext *DC); bool isNotFromSourceFile(SourceLocation Loc) const; @@ -190,7 +184,7 @@ public: private: void handleDecl(const NamedDecl *D, SourceLocation Loc, CXCursor Cursor, - bool isRedeclaration, bool isDefinition, + bool isRedeclaration, bool isDefinition, bool isContainer, DeclInfo &DInfo); void handleObjCContainer(const ObjCContainerDecl *D, @@ -200,12 +194,8 @@ private: bool isImplementation, ObjCContainerDeclInfo &ContDInfo); - void addEntityInMap(const NamedDecl *D, CXIdxClientEntity entity); - void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container); - CXIdxClientEntity getClientEntity(const NamedDecl *D); - const NamedDecl *getEntityDecl(const NamedDecl *D) const; CXIdxClientContainer getIndexContainer(const NamedDecl *D) const { diff --git a/tools/libclang/libclang.exports b/tools/libclang/libclang.exports index b644baa4d9..4596336465 100644 --- a/tools/libclang/libclang.exports +++ b/tools/libclang/libclang.exports @@ -137,10 +137,9 @@ clang_getTypeKindSpelling clang_hashCursor clang_index_getObjCCategoryDeclInfo clang_index_getObjCContainerDeclInfo -clang_index_getTagDeclInfo -clang_index_isEntityObjCCategoryKind +clang_index_getObjCInterfaceDeclInfo +clang_index_getObjCProtocolDeclInfo clang_index_isEntityObjCContainerKind -clang_index_isEntityTagKind clang_indexLoc_getCXSourceLocation clang_indexLoc_getFileLocation clang_indexTranslationUnit