diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-11 00:23:36 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-11 00:23:36 +0000 |
commit | dd93c596cd95e1b96031ff47efe0a5095ff3d7f1 (patch) | |
tree | 423f7b1be7f9d00e680f5bf2eb6cc2e9bea4cc49 | |
parent | ba49103550281ff9c92c850487e83c7a6eb43825 (diff) |
[libclang] Simplify the indexing API.
Cut down the number of callbacks to more generic ones. Clients can check
an enum to find out what kind of declaration it is and they can call functions
to get more specific information than the generic provided info.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144343 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 395 | ||||
-rw-r--r-- | tools/c-index-test/c-index-test.c | 383 | ||||
-rw-r--r-- | tools/libclang/IndexDecl.cpp | 67 | ||||
-rw-r--r-- | tools/libclang/IndexTypeSourceInfo.cpp | 4 | ||||
-rw-r--r-- | tools/libclang/Indexing.cpp | 54 | ||||
-rw-r--r-- | tools/libclang/IndexingContext.cpp | 581 | ||||
-rw-r--r-- | tools/libclang/IndexingContext.h | 102 | ||||
-rw-r--r-- | tools/libclang/libclang.exports | 6 |
8 files changed, 629 insertions, 963 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 941381d79e..7a44c2d4a9 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -3938,7 +3938,7 @@ void clang_findReferencesInFileWithBlock(CXCursor, CXFile, /** * \brief The client's data object that is associated with a CXFile. */ -typedef void *CXIdxFile; +typedef void *CXIdxClientFile; /** * \brief The client's data object that is associated with a unique entity in @@ -3952,7 +3952,7 @@ typedef void *CXIdxFile; * * In the example above there is only one entity introduced, the class 'Foo'. */ -typedef void *CXIdxEntity; +typedef void *CXIdxClientEntity; /** * \brief The client's data object that is associated with a semantic container @@ -3983,23 +3983,22 @@ typedef void *CXIdxEntity; * 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 *CXIdxContainer; +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 *CXIdxMacro; +typedef void *CXIdxClientMacro; /** * \brief The client's data object that is associated with an AST file (PCH * or module). */ -typedef void *CXIdxASTFile; +typedef void *CXIdxClientASTFile; /** - * \brief The client's data object that is associated with an AST file (PCH - * or module). + * \brief Source location passed to index callbacks. */ typedef struct { void *ptr_data[2]; @@ -4021,7 +4020,7 @@ typedef struct { /** * \brief The actual file that the #include/#import directive resolved to. */ - CXIdxFile file; + CXFile file; int isImport; int isAngled; } CXIdxIncludedFileInfo; @@ -4068,7 +4067,7 @@ typedef struct { typedef struct { CXIdxLoc loc; const char *name; - CXIdxMacro macro; + CXIdxClientMacro macro; } CXIdxMacroUndefinedInfo; /** @@ -4077,198 +4076,99 @@ typedef struct { typedef struct { CXIdxLoc loc; const char *name; - CXIdxMacro macro; + CXIdxClientMacro macro; } CXIdxMacroExpandedInfo; -typedef struct { - const char *name; - const char *USR; -} CXIdxEntityInfo; - -typedef struct { - CXCursor cursor; - CXIdxLoc loc; - CXIdxContainer container; -} CXIdxIndexedDeclInfo; - -/** - * \brief Data for \see importedEntity callback. - */ -typedef struct { - CXIdxEntityInfo *entityInfo; - CXCursor cursor; - CXIdxLoc loc; - CXIdxASTFile ASTFile; -} CXIdxImportedEntityInfo; - /** * \brief Data for \see importedMacro callback. */ typedef struct { CXIdxMacroInfo *macroInfo; - CXIdxASTFile ASTFile; + CXIdxClientASTFile ASTFile; } CXIdxImportedMacroInfo; -typedef struct { - CXIdxEntityInfo *entityInfo; - CXIdxIndexedDeclInfo *declInfo; -} CXIdxIndexedEntityInfo; - -typedef struct { - CXIdxIndexedDeclInfo *declInfo; - CXIdxEntity entity; -} CXIdxIndexedRedeclInfo; - -typedef struct { - CXCursor cursor; - CXIdxLoc loc; - CXIdxEntity entity; -} CXIdxContainerInfo; - -/** - * \brief Data for \see indexTypedef callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; -} CXIdxTypedefInfo; - -/** - * \brief Data for \see indexFunction callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - int isDefinition; -} CXIdxFunctionInfo; - -/** - * \brief Data for \see indexFunctionRedeclaration callback. - */ -typedef struct { - CXIdxIndexedRedeclInfo *indexedRedeclInfo; - int isDefinition; -} CXIdxFunctionRedeclInfo; - -/** - * \brief Data for \see indexVariable callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - int isDefinition; -} CXIdxVariableInfo; +typedef enum { + CXIdxEntity_Unexposed = 0, + CXIdxEntity_Typedef = 1, + CXIdxEntity_Function = 2, + CXIdxEntity_Variable = 3, + CXIdxEntity_Field = 4, + CXIdxEntity_EnumConstant = 5, -/** - * \brief Data for \see indexVariableRedeclaration callback. - */ -typedef struct { - CXIdxIndexedRedeclInfo *indexedRedeclInfo; - int isDefinition; -} CXIdxVariableRedeclInfo; + CXIdxEntity_ObjCClass = 6, + CXIdxEntity_ObjCProtocol = 7, + CXIdxEntity_ObjCCategory = 8, -/** - * \brief Data for \see indexTagType callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - int isDefinition; - int isAnonymous; -} CXIdxTagTypeInfo; + CXIdxEntity_ObjCMethod = 9, + CXIdxEntity_ObjCProperty = 10, + CXIdxEntity_ObjCIvar = 11, -/** - * \brief Data for \see indexTagTypeRedeclaration callback. - */ -typedef struct { - CXIdxIndexedRedeclInfo *indexedRedeclInfo; - int isDefinition; -} CXIdxTagTypeRedeclInfo; - -/** - * \brief Data for \see startedTagTypeDefinition callback. - */ -typedef struct { - CXIdxContainerInfo *containerInfo; -} CXIdxTagTypeDefinitionInfo; + CXIdxEntity_Enum = 12, + CXIdxEntity_Struct = 13, + CXIdxEntity_Union = 14, + CXIdxEntity_CXXClass = 15 -/** - * \brief Data for \see indexField callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; -} CXIdxFieldInfo; - -/** - * \brief Data for \see indexEnumerator callback. - */ -typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; -} CXIdxEnumeratorInfo; +} CXIdxEntityKind; -/** - * \brief Data for \see indexObjCClass callback. - */ typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - int isForwardRef; -} CXIdxObjCClassInfo; + CXIdxEntityKind kind; + const char *name; + const char *USR; + CXIdxClientEntity clientEntity; +} CXIdxEntityInfo; /** - * \brief Data for \see indexObjCProtocol callback. + * \brief Data for \see importedEntity callback. */ typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - int isForwardRef; -} CXIdxObjCProtocolInfo; + CXIdxEntityInfo *entityInfo; + CXCursor cursor; + CXIdxLoc loc; + CXIdxClientASTFile ASTFile; +} CXIdxImportedEntityInfo; -/** - * \brief Data for \see indexObjCCategory callback. - */ typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; - CXIdxEntity objcClass; -} CXIdxObjCCategoryInfo; + CXIdxEntityInfo *entity; + CXCursor cursor; + CXIdxLoc loc; + int isObjCImpl; +} CXIdxContainerInfo; -/** - * \brief Data for \see indexObjCMethod callback. - */ typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; + CXIdxEntityInfo *entityInfo; + CXCursor cursor; + CXIdxLoc loc; + CXIdxClientContainer container; + int isRedeclaration; int isDefinition; -} CXIdxObjCMethodInfo; +} CXIdxDeclInfo; -/** - * \brief Data for \see indexObjCProperty callback. - */ typedef struct { - CXIdxIndexedEntityInfo *indexedEntityInfo; -} CXIdxObjCPropertyInfo; + CXIdxDeclInfo *declInfo; + int isAnonymous; +} CXIdxTagDeclInfo; -/** - * \brief Data for \see indexObjCMethodRedeclaration callback. - */ -typedef struct { - CXIdxIndexedRedeclInfo *indexedRedeclInfo; - int isDefinition; -} CXIdxObjCMethodRedeclInfo; +typedef enum { + CXIdxObjCContainer_ForwardRef = 0, + CXIdxObjCContainer_Interface = 1, + CXIdxObjCContainer_Implementation = 2 +} CXIdxObjCContainerKind; -/** - * \brief Data for \see startedStatementBody callback. - */ typedef struct { - CXIdxContainerInfo *containerInfo; - CXIdxLoc bodyBegin; -} CXIdxStmtBodyInfo; + CXIdxDeclInfo *declInfo; + CXIdxObjCContainerKind kind; +} CXIdxObjCContainerDeclInfo; -/** - * \brief Data for \see startedObjCContainer callback. - */ typedef struct { - CXIdxContainerInfo *containerInfo; -} CXIdxObjCContainerInfo; + CXIdxObjCContainerDeclInfo *containerInfo; + CXIdxEntityInfo *objcClass; +} CXIdxObjCCategoryDeclInfo; /** * \brief Data for \see defineObjCClass callback. */ typedef struct { - CXIdxEntity objcClass; + CXIdxEntityInfo *objcClass; CXIdxLoc loc; } CXIdxObjCBaseClassInfo; @@ -4276,7 +4176,7 @@ typedef struct { * \brief Data for \see defineObjCClass callback. */ typedef struct { - CXIdxEntity protocol; + CXIdxEntityInfo *protocol; CXIdxLoc loc; } CXIdxObjCProtocolRefInfo; @@ -4285,8 +4185,8 @@ typedef struct { */ typedef struct { CXCursor cursor; - CXIdxEntity objcClass; - CXIdxContainer container; + CXIdxEntityInfo *objcClass; + CXIdxClientContainer container; CXIdxObjCBaseClassInfo *baseInfo; CXIdxObjCProtocolRefInfo **protocols; unsigned numProtocols; @@ -4296,7 +4196,7 @@ typedef struct { * \brief Data for \see endedContainer callback. */ typedef struct { - CXIdxContainer container; + CXIdxClientContainer container; CXIdxLoc endLoc; } CXIdxEndContainerInfo; @@ -4326,7 +4226,7 @@ typedef struct { /** * \brief The entity that gets referenced. */ - CXIdxEntity referencedEntity; + CXIdxEntityInfo *referencedEntity; /** * \brief Immediate "parent" of the reference. For example: * @@ -4337,11 +4237,11 @@ typedef struct { * The parent of reference of type 'Foo' is the variable 'var'. * parentEntity will be null for references inside statement bodies. */ - CXIdxEntity parentEntity; + CXIdxEntityInfo *parentEntity; /** * \brief Container context of the reference. */ - CXIdxContainer container; + CXIdxClientContainer container; CXIdxEntityRefKind kind; } CXIdxEntityRefInfo; @@ -4352,23 +4252,19 @@ typedef struct { void (*diagnostic)(CXClientData client_data, CXDiagnostic, void *reserved); - /** - * \brief Called for the purpose of associating a client's CXIdxFile with - * a CXFile. - */ - CXIdxFile (*recordFile)(CXClientData client_data, - CXFile file, void *reserved); - + CXIdxClientFile (*enteredMainFile)(CXClientData client_data, + CXFile mainFile, void *reserved); + /** * \brief Called when a file gets #included/#imported. */ - void (*ppIncludedFile)(CXClientData client_data, - CXIdxIncludedFileInfo *); + CXIdxClientFile (*ppIncludedFile)(CXClientData client_data, + CXIdxIncludedFileInfo *); /** * \brief Called when a macro gets #defined. */ - CXIdxMacro (*ppMacroDefined)(CXClientData client_data, + CXIdxClientMacro (*ppMacroDefined)(CXClientData client_data, CXIdxMacroDefinedInfo *); /** @@ -4393,138 +4289,37 @@ typedef struct { * the AST file can be later associated with CXIdxEntities returned by * \see importedEntity callbacks. */ - CXIdxASTFile (*importedASTFile)(CXClientData client_data, + 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. */ - CXIdxEntity (*importedEntity)(CXClientData client_data, - CXIdxImportedEntityInfo *); + 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. */ - CXIdxEntity (*importedMacro)(CXClientData client_data, - CXIdxImportedMacroInfo *); + CXIdxClientMacro (*importedMacro)(CXClientData client_data, + CXIdxImportedMacroInfo *); /** * \brief Called at the beginning of indexing a translation unit. */ - CXIdxContainer (*startedTranslationUnit)(CXClientData client_data, + CXIdxClientContainer (*startedTranslationUnit)(CXClientData client_data, void *reserved); - /** - * \brief Called to index a typedef entity. - */ - CXIdxEntity (*indexTypedef)(CXClientData client_data, - CXIdxTypedefInfo *); - - /** - * \brief Called to index a function entity. - */ - CXIdxEntity (*indexFunction)(CXClientData client_data, - CXIdxFunctionInfo *); - - /** - * \brief Called to index a function redeclaration. - */ - void (*indexFunctionRedeclaration)(CXClientData client_data, - CXIdxFunctionRedeclInfo *); + CXIdxClientEntity (*indexDeclaration)(CXClientData client_data, + CXIdxDeclInfo *); /** - * \brief Called to index a file-scope variable (not field or ivar). + * \brief Called to initiate a container context. */ - CXIdxEntity (*indexVariable)(CXClientData client_data, - CXIdxVariableInfo *); - - /** - * \brief Called to index a variable redeclaration. - */ - void (*indexVariableRedeclaration)(CXClientData client_data, - CXIdxVariableRedeclInfo *); - - /** - * \brief Called to index a tag entity (struct/union/enum/class). - */ - CXIdxEntity (*indexTagType)(CXClientData client_data, - CXIdxTagTypeInfo *); - - /** - * \brief Called to index a tag redeclaration. - */ - void (*indexTagTypeRedeclaration)(CXClientData client_data, - CXIdxTagTypeRedeclInfo *); - - /** - * \brief Called to index a tag type's field entity. - */ - CXIdxEntity (*indexField)(CXClientData client_data, - CXIdxFieldInfo *); - - /** - * \brief Called to index an enumerator entity. - */ - CXIdxEntity (*indexEnumerator)(CXClientData client_data, - CXIdxEnumeratorInfo *); - - /** - * \brief Called to initiate a tag type's container context. - */ - CXIdxContainer (*startedTagTypeDefinition)(CXClientData client_data, - CXIdxTagTypeDefinitionInfo *); - - /** - * \brief Called to index an ObjC class entity. - */ - CXIdxEntity (*indexObjCClass)(CXClientData client_data, - CXIdxObjCClassInfo *); - - /** - * \brief Called to index an ObjC protocol entity. - */ - CXIdxEntity (*indexObjCProtocol)(CXClientData client_data, - CXIdxObjCProtocolInfo *); - - /** - * \brief Called to index an ObjC category entity. - */ - CXIdxEntity (*indexObjCCategory)(CXClientData client_data, - CXIdxObjCCategoryInfo *); - - /** - * \brief Called to index an ObjC method entity. - */ - CXIdxEntity (*indexObjCMethod)(CXClientData client_data, - CXIdxObjCMethodInfo *); - - /** - * \brief Called to index an ObjC property entity. - */ - CXIdxEntity (*indexObjCProperty)(CXClientData client_data, - CXIdxObjCPropertyInfo *); - - /** - * \brief Called to index an ObjC method redeclaration. - */ - void (*indexObjCMethodRedeclaration)(CXClientData client_data, - CXIdxObjCMethodRedeclInfo *); - - /** - * \brief Called to initiate a statement body container context for a - * function/ObjC method/C++ member function/block. - */ - CXIdxContainer (*startedStatementBody)(CXClientData client_data, - CXIdxStmtBodyInfo *); - - /** - * \brief Called to initiate an ObjC container context for - * @interface/@implementation/@protocol. - */ - CXIdxContainer (*startedObjCContainer)(CXClientData client_data, - CXIdxObjCContainerInfo *); + CXIdxClientContainer (*startedContainer)(CXClientData client_data, + CXIdxContainerInfo *); /** * \brief Called to define an ObjC class via its @interface. @@ -4546,6 +4341,16 @@ typedef struct { } IndexerCallbacks; +int clang_index_isEntityTagKind(CXIdxEntityKind); +CXIdxTagDeclInfo *clang_index_getTagDeclInfo(CXIdxDeclInfo *); + +int clang_index_isEntityObjCContainerKind(CXIdxEntityKind); +CXIdxObjCContainerDeclInfo * +clang_index_getObjCContainerDeclInfo(CXIdxDeclInfo *); + +int clang_index_isEntityObjCCategoryKind(CXIdxEntityKind); +CXIdxObjCCategoryDeclInfo *clang_index_getObjCCategoryDeclInfo(CXIdxDeclInfo *); + /** * \brief Index the given source file and the translation unit corresponding * to that file via callbacks implemented through \see IndexerCallbacks. @@ -4591,7 +4396,7 @@ CINDEX_LINKAGE int clang_indexTranslationUnit(CXIndex CIdx, * retrieves the location of the argument. */ CINDEX_LINKAGE void clang_indexLoc_getFileLocation(CXIdxLoc loc, - CXIdxFile *indexFile, + CXIdxClientFile *indexFile, CXFile *file, unsigned *line, unsigned *column, diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c index 44b90b13e1..eb992395f2 100644 --- a/tools/c-index-test/c-index-test.c +++ b/tools/c-index-test/c-index-test.c @@ -1547,7 +1547,7 @@ static void printCheck(IndexData *data) { } } -static void printCXIndexFile(CXIdxFile file) { +static void printCXIndexFile(CXIdxClientFile file) { CXString filename = clang_getFileName((CXFile)file); printf("%s", clang_getCString(filename)); clang_disposeString(filename); @@ -1556,7 +1556,7 @@ static void printCXIndexFile(CXIdxFile file) { static void printCXIndexLoc(CXIdxLoc loc) { CXString filename; const char *cname, *end; - CXIdxFile file; + CXIdxClientFile file; unsigned line, column; int isHeader; @@ -1577,88 +1577,63 @@ static void printCXIndexLoc(CXIdxLoc loc) { printf("%d:%d", line, column); } -static CXIdxEntity makeCXIndexEntity(CXIdxIndexedEntityInfo *info) { +static CXIdxClientEntity makeClientEntity(CXIdxEntityInfo *info, CXIdxLoc loc) { const char *name; - CXIdxLoc loc; char *newStr; - CXIdxFile file; + CXIdxClientFile file; unsigned line, column; - name = info->entityInfo->name; + name = info->name; if (!name) name = "<anon-tag>"; - loc = info->declInfo->loc; clang_indexLoc_getFileLocation(loc, &file, 0, &line, &column, 0); /* FIXME: free these.*/ newStr = (char *)malloc(strlen(name) + 10); sprintf(newStr, "%s:%d:%d", name, line, column); - return (CXIdxEntity)newStr; + return (CXIdxClientEntity)newStr; } -static CXIdxContainer makeCXIndexContainer(CXIdxEntity entity) { - return (CXIdxContainer)entity; -} - -static void printCXIndexEntity(CXIdxEntity entity) { - printf("{%s}", (const char *)entity); -} - -static void printCXIndexContainer(CXIdxContainer container) { +static void printCXIndexContainer(CXIdxClientContainer container) { printf("[%s]", (const char *)container); } -static void printIndexedDeclInfo(CXIdxIndexedDeclInfo *info) { - printf(" | cursor: "); - PrintCursor(info->cursor); - printf(" | loc: "); - printCXIndexLoc(info->loc); - printf(" | container: "); - printCXIndexContainer(info->container); -} - -static void printIndexedEntityInfo(const char *cb, - CXClientData client_data, - CXIdxIndexedEntityInfo *info) { +static const char *getEntityKindString(CXIdxEntityKind kind) { + switch (kind) { + case CXIdxEntity_Unexposed: return "<<UNEXPOSED>>"; + case CXIdxEntity_Typedef: return "typedef"; + case CXIdxEntity_Function: return "function"; + case CXIdxEntity_Variable: return "variable"; + case CXIdxEntity_Field: return "field"; + case CXIdxEntity_EnumConstant: return "enumerator"; + case CXIdxEntity_ObjCClass: return "objc-class"; + case CXIdxEntity_ObjCProtocol: return "objc-protocol"; + case CXIdxEntity_ObjCCategory: return "objc-category"; + case CXIdxEntity_ObjCMethod: return "objc-method"; + case CXIdxEntity_ObjCProperty: return "objc-property"; + case CXIdxEntity_ObjCIvar: return "objc-ivar"; + case CXIdxEntity_Enum: return "enum"; + case CXIdxEntity_Struct: return "struct"; + case CXIdxEntity_Union: return "union"; + case CXIdxEntity_CXXClass: return "c++-class"; + } +} + +static void printEntityInfo(const char *cb, + CXClientData client_data, + CXIdxEntityInfo *info) { const char *name; IndexData *index_data; index_data = (IndexData *)client_data; printCheck(index_data); - name = info->entityInfo->name; + name = info->name; if (!name) name = "<anon-tag>"; - printf("%s: %s", cb, info->entityInfo->name); - printIndexedDeclInfo(info->declInfo); - printf(" | USR: %s", info->entityInfo->USR); -} - -static void printIndexedRedeclInfo(const char *cb, - CXClientData client_data, - CXIdxIndexedRedeclInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printf("%s redeclaration: ", cb); - printCXIndexEntity(info->entity); - printIndexedDeclInfo(info->declInfo); -} - -static void printStartedContainerInfo(const char *cb, - CXClientData client_data, - CXIdxContainerInfo *info) { - IndexData *index_data; - index_data = (IndexData *)client_data; - printCheck(index_data); - - printf("%s: ", cb); - printCXIndexEntity(info->entity); - printf(" | cursor: "); - PrintCursor(info->cursor); - printf(" | loc: "); - printCXIndexLoc(info->loc); + printf("%s: kind: %s", cb, getEntityKindString(info->kind)); + printf(" | name: %s", name); + printf(" | USR: %s", info->USR); } static void index_diagnostic(CXClientData client_data, @@ -1680,26 +1655,36 @@ static void index_diagnostic(CXClientData client_data, } } -static CXIdxFile index_recordFile(CXClientData client_data, - CXFile file, void *reserved) { - return (CXIdxFile)file; +static CXIdxClientFile index_enteredMainFile(CXClientData client_data, + CXFile file, void *reserved) { + IndexData *index_data; + index_data = (IndexData *)client_data; + printCheck(index_data); + + printf("[enteredMainFile]: "); + printCXIndexFile((CXIdxClientFile)file); + printf("\n"); + + return (CXIdxClientFile)file; } -static void index_ppIncludedFile(CXClientData client_data, - CXIdxIncludedFileInfo *info) { +static CXIdxClientFile index_ppIncludedFile(CXClientData client_data, + CXIdxIncludedFileInfo *info) { IndexData *index_data; index_data = (IndexData *)client_data; printCheck(index_data); printf("[ppIncludedFile]: "); - printCXIndexFile(info->file); + printCXIndexFile((CXIdxClientFile)info->file); printf(" | name: \"%s\"", info->filename); printf(" | hash loc: "); printCXIndexLoc(info->hashLoc); printf(" | isImport: %d | isAngled: %d\n", info->isImport, info->isAngled); + + return (CXIdxClientFile)info->file; } -static CXIdxMacro index_ppMacroDefined(CXClientData client_data, +static CXIdxClientMacro index_ppMacroDefined(CXClientData client_data, CXIdxMacroDefinedInfo *info) { IndexData *index_data; index_data = (IndexData *)client_data; @@ -1712,7 +1697,7 @@ static CXIdxMacro index_ppMacroDefined(CXClientData client_data, printCXIndexLoc(info->defBegin); printf(" | length: %d\n", info->defLength); - return (CXIdxMacro)info->macroInfo->name; + return (CXIdxClientMacro)info->macroInfo->name; } static void index_ppMacroUndefined(CXClientData client_data, @@ -1739,217 +1724,105 @@ static void index_ppMacroExpanded(CXClientData client_data, printf("\n"); } -static CXIdxEntity index_importedEntity(CXClientData client_data, +static CXIdxClientEntity index_importedEntity(CXClientData client_data, CXIdxImportedEntityInfo *info) { IndexData *index_data; - CXIdxIndexedDeclInfo DeclInfo; - CXIdxIndexedEntityInfo EntityInfo; - const char *name; - DeclInfo.cursor = info->cursor; - DeclInfo.loc = info->loc; - DeclInfo.container = 0; - EntityInfo.entityInfo = info->entityInfo; - EntityInfo.declInfo = &DeclInfo; index_data = (IndexData *)client_data; printCheck(index_data); - name = info->entityInfo->name; - if (!name) - name = "<anon-tag>"; - - printf("[importedEntity]: %s", name); + printEntityInfo("[importedEntity]", client_data, info->entityInfo); printf(" | cursor: "); PrintCursor(info->cursor); printf(" | loc: "); printCXIndexLoc(info->loc); printf("\n"); - return makeCXIndexEntity(&EntityInfo); + return makeClientEntity(info->entityInfo, info->loc); } -static CXIdxContainer index_startedTranslationUnit(CXClientData client_data, +static CXIdxClientContainer index_startedTranslationUnit(CXClientData client_data, void *reserved) { IndexData *index_data; index_data = (IndexData *)client_data; printCheck(index_data); printf("[startedTranslationUnit]\n"); - return (CXIdxContainer)"TU"; -} - -static CXIdxEntity index_indexTypedef(CXClientData client_data, - CXIdxTypedefInfo *info) { - printIndexedEntityInfo("[indexTypedef]", client_data, info->indexedEntityInfo); - printf("\n"); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static CXIdxEntity index_indexFunction(CXClientData client_data, - CXIdxFunctionInfo *info) { - printIndexedEntityInfo("[indexFunction]", client_data, info->indexedEntityInfo); - printf(" | isDefinition: %d\n", info->isDefinition); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static void index_indexFunctionRedeclaration(CXClientData client_data, - CXIdxFunctionRedeclInfo *info) { - printIndexedRedeclInfo("[indexFunctionRedeclaration]", client_data, - info->indexedRedeclInfo); - printf(" | isDefinition: %d\n", info->isDefinition); -} - -static CXIdxEntity index_indexVariable(CXClientData client_data, - CXIdxVariableInfo *info) { - printIndexedEntityInfo("[indexVariable]", client_data, info->indexedEntityInfo); - printf(" | isDefinition: %d\n", info->isDefinition); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static void index_indexVariableRedeclaration(CXClientData client_data, - CXIdxVariableRedeclInfo *info) { - printIndexedRedeclInfo("[indexVariableRedeclaration]", client_data, - info->indexedRedeclInfo); - printf(" | isDefinition: %d\n", info->isDefinition); -} - -static CXIdxEntity index_indexTagType(CXClientData client_data, - CXIdxTagTypeInfo *info) { - printIndexedEntityInfo("[indexTagType]", client_data, info->indexedEntityInfo); - printf(" | isDefinition: %d | anon: %d\n", - info->isDefinition, info->isAnonymous); - - return makeCXIndexEntity(info->indexedEntityInfo); + return (CXIdxClientContainer)"TU"; } -static void index_indexTagTypeRedeclaration(CXClientData client_data, - CXIdxTagTypeRedeclInfo *info) { - printIndexedRedeclInfo("[indexTagTypeRedeclaration]", client_data, - info->indexedRedeclInfo); - printf(" | isDefinition: %d\n", info->isDefinition); -} - -static CXIdxEntity index_indexField(CXClientData client_data, - CXIdxFieldInfo *info) { - printIndexedEntityInfo("[indexField]", client_data, info->indexedEntityInfo); - printf("\n"); - - return makeCXIndexEntity(info->indexedEntityInfo); -} +static CXIdxClientEntity index_indexDeclaration(CXClientData client_data, + CXIdxDeclInfo *info) { + IndexData *index_data; + index_data = (IndexData *)client_data; -static CXIdxEntity index_indexEnumerator(CXClientData client_data, - CXIdxEnumeratorInfo *info) { - printIndexedEntityInfo("[indexEnumerator]", client_data, - info->indexedEntityInfo); - printf("\n"); - - return makeCXIndexEntity(info->indexedEntityInfo); -} + printEntityInfo("[indexDeclaration]", client_data, info->entityInfo); + printf(" | cursor: "); + PrintCursor(info->cursor); + printf(" | loc: "); + printCXIndexLoc(info->loc); + printf(" | container: "); + printCXIndexContainer(info->container); + printf(" | isRedecl: %d", info->isRedeclaration); + printf(" | isDef: %d\n", info->isDefinition); -static CXIdxContainer -index_startedTagTypeDefinition(CXClientData client_data, - CXIdxTagTypeDefinitionInfo *info) { - printStartedContainerInfo("[startedTagTypeDefinition]", client_data, - info->containerInfo); - printf("\n"); - return makeCXIndexContainer(info->containerInfo->entity); -} - -static CXIdxEntity index_indexObjCClass(CXClientData client_data, - CXIdxObjCClassInfo *info) { - printIndexedEntityInfo("[indexObjCClass]", client_data, - info->indexedEntityInfo); - printf(" | forward ref: %d\n", info->isForwardRef); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static CXIdxEntity index_indexObjCProtocol(CXClientData client_data, - CXIdxObjCProtocolInfo *info) { - printIndexedEntityInfo("[indexObjCProtocol]", client_data, - info->indexedEntityInfo); - printf(" | forward ref: %d\n", info->isForwardRef); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static CXIdxEntity index_indexObjCCategory(CXClientData client_data, - CXIdxObjCCategoryInfo *info) { - printIndexedEntityInfo("[indexObjCCategory]", client_data, - info->indexedEntityInfo); - printf(" | class: "); - printCXIndexEntity(info->objcClass); - printf("\n"); - - return makeCXIndexEntity(info->indexedEntityInfo); -} - -static CXIdxEntity index_indexObjCMethod(CXClientData client_data, - CXIdxObjCMethodInfo *info) { - printIndexedEntityInfo("[indexObjCMethod]", client_data, - info->indexedEntityInfo); - printf(" | isDefinition: %d\n", info->isDefinition); - - return makeCXIndexEntity(info->indexedEntityInfo); -} + if (clang_index_isEntityTagKind(info->entityInfo->kind)) { + printCheck(index_data); + printf(" <TagInfo>: 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; + switch (K) { + case CXIdxObjCContainer_ForwardRef: + kindName = "forward-ref"; break; + case CXIdxObjCContainer_Interface: + kindName = "interface"; break; + case CXIdxObjCContainer_Implementation: + kindName = "implementation"; break; + } + printCheck(index_data); + printf(" <ObjCContainerInfo>: kind: %s\n", kindName); + } -static CXIdxEntity index_indexObjCProperty(CXClientData client_data, - CXIdxObjCPropertyInfo *info) { - printIndexedEntityInfo("[indexObjCProperty]", client_data, - info->indexedEntityInfo); - printf("\n"); + if (clang_index_isEntityObjCCategoryKind(info->entityInfo->kind)) { + CXIdxObjCCategoryDeclInfo * + CatInfo = clang_index_getObjCCategoryDeclInfo(info); + printEntityInfo(" <ObjCCategoryInfo>: class", client_data, + CatInfo->objcClass); + printf("\n"); + } - return makeCXIndexEntity(info->indexedEntityInfo); -} + if (!info->isRedeclaration) + return makeClientEntity(info->entityInfo, info->loc); -static void index_indexObjCMethodRedeclaration(CXClientData client_data, - CXIdxObjCMethodRedeclInfo *info) { - printIndexedRedeclInfo("[indexObjCMethodRedeclaration]", client_data, - info->indexedRedeclInfo); - printf(" | isDefinition: %d\n", info->isDefinition); + return 0; } -static CXIdxContainer -index_startedStatementBody(CXClientData client_data, - CXIdxStmtBodyInfo *info) { - printStartedContainerInfo("[startedStatementBody]", client_data, - info->containerInfo); - printf(" | body: "); - printCXIndexLoc(info->bodyBegin); - printf("\n"); - |