summaryrefslogtreecommitdiffstats
path: root/tools/c-index-test
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-11 00:23:36 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2011-11-11 00:23:36 +0000
commitdd93c596cd95e1b96031ff47efe0a5095ff3d7f1 (patch)
tree423f7b1be7f9d00e680f5bf2eb6cc2e9bea4cc49 /tools/c-index-test
parentba49103550281ff9c92c850487e83c7a6eb43825 (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
Diffstat (limited to 'tools/c-index-test')
-rw-r--r--tools/c-index-test/c-index-test.c383
1 files changed, 117 insertions, 266 deletions
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");
-
- return makeCXIndexContainer(info->containerInfo->entity);
-}
+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);
-static CXIdxContainer
-index_startedObjCContainer(CXClientData client_data,
- CXIdxObjCContainerInfo *info) {
- printStartedContainerInfo("[startedObjCContainer]", client_data,
- info->containerInfo);
- printf("\n");
-
- return makeCXIndexContainer(info->containerInfo->entity);
+ return (CXIdxClientContainer)info->entity->clientEntity;
}
static void index_defineObjCClass(CXClientData client_data,
CXIdxObjCClassDefineInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printf("[defineObjCClass]: ");
- printCXIndexEntity(info->objcClass);
+ printEntityInfo("[defineObjCClass]", client_data, info->objcClass);
printf(" | cursor: ");
PrintCursor(info->cursor);
printf(" | container: ");
printCXIndexContainer(info->container);
if (info->baseInfo) {
- printf(" | base: ");
- printCXIndexEntity(info->baseInfo->objcClass);
+ printEntityInfo(" | <base>", client_data, info->baseInfo->objcClass);
printf(" | base loc: ");
printCXIndexLoc(info->baseInfo->loc);
}
@@ -1972,18 +1845,12 @@ static void index_endedContainer(CXClientData client_data,
static void index_indexEntityReference(CXClientData client_data,
CXIdxEntityRefInfo *info) {
- IndexData *index_data;
- index_data = (IndexData *)client_data;
- printCheck(index_data);
-
- printf("[indexEntityReference]: ");
- printCXIndexEntity(info->referencedEntity);
+ printEntityInfo("[indexEntityReference]", client_data, info->referencedEntity);
printf(" | cursor: ");
PrintCursor(info->cursor);
printf(" | loc: ");
printCXIndexLoc(info->loc);
- printf(" | parent: ");
- printCXIndexEntity(info->parentEntity);
+ printEntityInfo(" | <parent>:", client_data, info->parentEntity);
printf(" | container: ");
printCXIndexContainer(info->container);
printf(" | kind: ");
@@ -1996,7 +1863,7 @@ static void index_indexEntityReference(CXClientData client_data,
static IndexerCallbacks IndexCB = {
index_diagnostic,
- index_recordFile,
+ index_enteredMainFile,
index_ppIncludedFile,
index_ppMacroDefined,
index_ppMacroUndefined,
@@ -2005,24 +1872,8 @@ static IndexerCallbacks IndexCB = {
index_importedEntity,
0,/*index_importedMacro,*/
index_startedTranslationUnit,
- index_indexTypedef,
- index_indexFunction,
- index_indexFunctionRedeclaration,
- index_indexVariable,
- index_indexVariableRedeclaration,
- index_indexTagType,
- index_indexTagTypeRedeclaration,
- index_indexField,
- index_indexEnumerator,
- index_startedTagTypeDefinition,
- index_indexObjCClass,
- index_indexObjCProtocol,
- index_indexObjCCategory,
- index_indexObjCMethod,
- index_indexObjCProperty,
- index_indexObjCMethodRedeclaration,
- index_startedStatementBody,
- index_startedObjCContainer,
+ index_indexDeclaration,
+ index_startedContainer,
index_defineObjCClass,
index_endedContainer,
index_indexEntityReference