/**
* \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
*
* 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
* 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];
/**
* \brief The actual file that the #include/#import directive resolved to.
*/
- CXIdxFile file;
+ CXFile file;
int isImport;
int isAngled;
} CXIdxIncludedFileInfo;
typedef struct {
CXIdxLoc loc;
const char *name;
- CXIdxMacro macro;
+ CXIdxClientMacro macro;
} CXIdxMacroUndefinedInfo;
/**
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;
* \brief Data for \see defineObjCClass callback.
*/
typedef struct {
- CXIdxEntity protocol;
+ CXIdxEntityInfo *protocol;
CXIdxLoc loc;
} CXIdxObjCProtocolRefInfo;
*/
typedef struct {
CXCursor cursor;
- CXIdxEntity objcClass;
- CXIdxContainer container;
+ CXIdxEntityInfo *objcClass;
+ CXIdxClientContainer container;
CXIdxObjCBaseClassInfo *baseInfo;
CXIdxObjCProtocolRefInfo **protocols;
unsigned numProtocols;
* \brief Data for \see endedContainer callback.
*/
typedef struct {
- CXIdxContainer container;
+ CXIdxClientContainer container;
CXIdxLoc endLoc;
} CXIdxEndContainerInfo;
/**
* \brief The entity that gets referenced.
*/
- CXIdxEntity referencedEntity;
+ CXIdxEntityInfo *referencedEntity;
/**
* \brief Immediate "parent" of the reference. For example:
*
* 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;
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 *);
/**
* 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.
} 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.
* retrieves the location of the argument.
*/
CINDEX_LINKAGE void clang_indexLoc_getFileLocation(CXIdxLoc loc,
- CXIdxFile *indexFile,
+ CXIdxClientFile *indexFile,
CXFile *file,
unsigned *line,
unsigned *column,
}
}
-static void printCXIndexFile(CXIdxFile file) {
+static void printCXIndexFile(CXIdxClientFile file) {
CXString filename = clang_getFileName((CXFile)file);
printf("%s", clang_getCString(filename));
clang_disposeString(filename);
static void printCXIndexLoc(CXIdxLoc loc) {
CXString filename;
const char *cname, *end;
- CXIdxFile file;
+ CXIdxClientFile file;
unsigned line, column;
int isHeader;
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,
}
}
-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;
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,
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);
}
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: ");
static IndexerCallbacks IndexCB = {
index_diagnostic,
- index_recordFile,
+ index_enteredMainFile,
index_ppIncludedFile,
index_ppMacroDefined,
index_ppMacroUndefined,
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
if (D->isThisDeclarationADefinition()) {
const Stmt *Body = D->getBody();
if (Body) {
- IndexCtx.invokeStartedStatementBody(D, D);
+ IndexCtx.startContainer(D, /*isBody=*/true);
IndexCtx.indexBody(Body, D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
}
}
return true;
}
bool VisitObjCClassDecl(ObjCClassDecl *D) {
- ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
- if (Ref->getInterface()->getLocation() == Ref->getLocation()) {
- IndexCtx.handleObjCInterface(Ref->getInterface());
- } else {
- IndexCtx.handleReference(Ref->getInterface(),
- Ref->getLocation(),
- 0,
- Ref->getInterface()->getDeclContext());
- }
+ IndexCtx.handleObjCClass(D);
return true;
}
SourceLocation Loc = *LI;
ObjCProtocolDecl *PD = *I;
- if (PD->getLocation() == Loc) {
- IndexCtx.handleObjCProtocol(PD);
- } else {
- IndexCtx.handleReference(PD, Loc, 0, PD->getDeclContext());
- }
+ bool isRedeclaration = PD->getLocation() != Loc;
+ IndexCtx.handleObjCForwardProtocol(PD, Loc, isRedeclaration);
}
return true;
}
bool VisitObjCInterfaceDecl(ObjCInterfaceDecl *D) {
- // Only definitions are handled here.
+ // Forward decls are handled at VisitObjCClassDecl.
if (D->isForwardDecl())
return true;
- if (!D->isInitiallyForwardDecl())
- IndexCtx.handleObjCInterface(D);
+ IndexCtx.handleObjCInterface(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.invokeStartedObjCContainer(D);
+ IndexCtx.startContainer(D);
IndexCtx.defineObjCInterface(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
return true;
}
bool VisitObjCProtocolDecl(ObjCProtocolDecl *D) {
- // Only definitions are handled here.
+ // Forward decls are handled at VisitObjCForwardProtocolDecl.
if (D->isForwardDecl())
return true;
- if (!D->isInitiallyForwardDecl())
- IndexCtx.handleObjCProtocol(D);
+ IndexCtx.handleObjCProtocol(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.invokeStartedObjCContainer(D);
+ IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
return true;
}
bool VisitObjCImplementationDecl(ObjCImplementationDecl *D) {
- ObjCInterfaceDecl *Class = D->getClassInterface();
- if (Class->isImplicitInterfaceDecl())
- IndexCtx.handleObjCInterface(Class);
+ IndexCtx.handleObjCImplementation(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.invokeStartedObjCContainer(D);
+ IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
return true;
}
bool VisitObjCCategoryDecl(ObjCCategoryDecl *D) {
- if (!D->IsClassExtension())
- IndexCtx.handleObjCCategory(D);
+ IndexCtx.handleObjCCategory(D);
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.invokeStartedObjCContainer(D);
+ IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
return true;
}
bool VisitObjCCategoryImplDecl(ObjCCategoryImplDecl *D) {
+ if (D->getCategoryDecl()->getLocation().isInvalid())
+ return true;
+
+ IndexCtx.handleObjCCategoryImpl(D);
+
IndexCtx.indexTUDeclsInObjCContainer();
- IndexCtx.invokeStartedObjCContainer(D);
+ IndexCtx.startContainer(D);
IndexCtx.indexDeclContext(D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
return true;
}
if (D->isThisDeclarationADefinition()) {
const Stmt *Body = D->getBody();
if (Body) {
- IndexCtx.invokeStartedStatementBody(D, D);
+ IndexCtx.startContainer(D, /*isBody=*/true);
IndexCtx.indexBody(Body, D);
- IndexCtx.invokeEndedContainer(D);
+ IndexCtx.endContainer(D);
}
}
return true;
void IndexingContext::indexTagDecl(const TagDecl *D) {
handleTagDecl(D);
if (D->isThisDeclarationADefinition()) {
- invokeStartedTagTypeDefinition(D);
+ startContainer(D);
indexDeclContext(D);
- invokeEndedContainer(D);
+ endContainer(D);
}
}
class IndexPPCallbacks : public PPCallbacks {
Preprocessor &PP;
IndexingContext &IndexCtx;
+ bool IsMainFileEntered;
public:
IndexPPCallbacks(Preprocessor &PP, IndexingContext &indexCtx)
- : PP(PP), IndexCtx(indexCtx) { }
+ : PP(PP), IndexCtx(indexCtx), IsMainFileEntered(false) { }
+
+ virtual void FileChanged(SourceLocation Loc, FileChangeReason Reason,
+ SrcMgr::CharacteristicKind FileType, FileID PrevFID) {
+ if (IsMainFileEntered)
+ return;
+
+ SourceManager &SM = PP.getSourceManager();
+ SourceLocation MainFileLoc = SM.getLocForStartOfFile(SM.getMainFileID());
+
+ if (Loc == MainFileLoc && Reason == PPCallbacks::EnterFile) {
+ IsMainFileEntered = true;
+ IndexCtx.enteredMainFile(SM.getFileEntryForID(SM.getMainFileID()));
+ }
+ }
virtual void InclusionDirective(SourceLocation HashLoc,
const Token &IncludeTok,
extern "C" {
+int clang_index_isEntityTagKind(CXIdxEntityKind K) {
+ return CXIdxEntity_Enum <= K && K <= CXIdxEntity_CXXClass;
+}
+
+CXIdxTagDeclInfo *clang_index_getTagDeclInfo(CXIdxDeclInfo *DInfo) {
+ if (clang_index_isEntityTagKind(DInfo->entityInfo->kind))
+ return &static_cast<TagDeclInfo*>(DInfo)->CXTagDeclInfo;
+
+ return 0;
+}
+
+int clang_index_isEntityObjCContainerKind(CXIdxEntityKind K) {
+ return CXIdxEntity_ObjCClass <= K && K <= CXIdxEntity_ObjCCategory;
+}
+
+CXIdxObjCContainerDeclInfo *
+clang_index_getObjCContainerDeclInfo(CXIdxDeclInfo *DInfo) {
+ if (clang_index_isEntityObjCContainerKind(DInfo->entityInfo->kind))
+ return &static_cast<ObjCContainerDeclInfo*>(DInfo)->CXObjCContDeclInfo;
+
+ return 0;
+}
+
+int clang_index_isEntityObjCCategoryKind(CXIdxEntityKind K) {
+ return K == CXIdxEntity_ObjCCategory;
+}
+
+CXIdxObjCCategoryDeclInfo *
+clang_index_getObjCCategoryDeclInfo(CXIdxDeclInfo *DInfo){
+ if (clang_index_isEntityObjCCategoryKind(DInfo->entityInfo->kind))
+ return &static_cast<ObjCCategoryDeclInfo*>(DInfo)->CXObjCCatDeclInfo;
+
+ return 0;
+}
+
int clang_indexTranslationUnit(CXIndex CIdx,
CXClientData client_data,
IndexerCallbacks *index_callbacks,
}
void clang_indexLoc_getFileLocation(CXIdxLoc location,
- CXIdxFile *indexFile,
+ CXIdxClientFile *indexFile,
CXFile *file,
unsigned *line,
unsigned *column,
static_cast<ASTUnit*>(CXTU->TUData)->setASTContext(&ctx);
}
+void IndexingContext::enteredMainFile(const FileEntry *File) {
+ if (File && CB.enteredMainFile) {
+ CXIdxClientFile idxFile = CB.enteredMainFile(ClientData, (CXFile)File, 0);
+ FileMap[File] = idxFile;
+ }
+}
+
void IndexingContext::ppIncludedFile(SourceLocation hashLoc,
StringRef filename,
const FileEntry *File,
if (!CB.ppIncludedFile)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxIncludedFileInfo Info = { getIndexLoc(hashLoc),
SA.toCStr(filename),
- getIndexFile(File),
+ (CXFile)File,
isImport, isAngled };
- CB.ppIncludedFile(ClientData, &Info);
+ CXIdxClientFile idxFile = CB.ppIncludedFile(ClientData, &Info);
+ FileMap[File] = idxFile;
}
void IndexingContext::ppMacroDefined(SourceLocation Loc, StringRef Name,
if (!CB.ppMacroDefined)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroInfo MacroInfo = { getIndexLoc(Loc), SA.toCStr(Name) };
CXIdxMacroDefinedInfo Info = { &MacroInfo,
getIndexLoc(DefBegin), Length };
- CXIdxMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
+ CXIdxClientMacro idxMacro = CB.ppMacroDefined(ClientData, &Info);
MacroMap[OpaqueMacro] = idxMacro;
}
if (!CB.ppMacroUndefined)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroUndefinedInfo Info = { getIndexLoc(Loc),
SA.toCStr(Name), 0 };
CB.ppMacroUndefined(ClientData, &Info);
if (!CB.ppMacroExpanded)
return;
- StrAdapter SA(this);
+ StrAdapter SA(*this);
CXIdxMacroExpandedInfo Info = { getIndexLoc(Loc),
SA.toCStr(Name), 0 };
CB.ppMacroExpanded(ClientData, &Info);
}
void IndexingContext::invokeStartedTranslationUnit() {
- CXIdxContainer idxCont = 0;
+ CXIdxClientContainer idxCont = 0;
if (CB.startedTranslationUnit)
idxCont = CB.startedTranslationUnit(ClientData, 0);
addContainerInMap(Ctx->getTranslationUnitDecl(), idxCont);
}
void IndexingContext::invokeFinishedTranslationUnit() {
- invokeEndedContainer(Ctx->getTranslationUnitDecl());
+ endContainer(Ctx->getTranslationUnitDecl());
}
void IndexingContext::handleDiagnostic(const StoredDiagnostic &StoredDiag) {
CB.diagnostic(ClientData, &CXDiag, 0);
}
-void IndexingContext::handleFunction(const FunctionDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexFunction) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxFunctionInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexFunction(ClientData, &Info);
- }
+void IndexingContext::handleDecl(const NamedDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isRedeclaration, bool isDefinition,
+ DeclInfo &DInfo) {
+ if (!CB.indexDeclaration)
+ return;
- addEntityInMap(D, idxEntity);
+ StrAdapter SA(*this);
+ getEntityInfo(D, DInfo.CXEntInfo, SA);
+ DInfo.entityInfo = &DInfo.CXEntInfo;
+ DInfo.cursor = Cursor;
+ DInfo.loc = getIndexLoc(Loc);
+ DInfo.container = getIndexContainer(D);
+ DInfo.isRedeclaration = isRedeclaration;
+ DInfo.isDefinition = isDefinition;
+
+ CXIdxClientEntity
+ clientEnt = CB.indexDeclaration(ClientData, &DInfo);
+
+ if (!isRedeclaration)
+ addEntityInMap(D, clientEnt);
+}
+
+void IndexingContext::handleObjCContainer(const ObjCContainerDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isForwardRef,
+ bool isRedeclaration,
+ bool isImplementation,
+ ObjCContainerDeclInfo &ContDInfo) {
+ ContDInfo.CXObjCContDeclInfo.declInfo = &ContDInfo;
+ if (isForwardRef)
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_ForwardRef;
+ else if (isImplementation)
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Implementation;
+ else
+ ContDInfo.CXObjCContDeclInfo.kind = CXIdxObjCContainer_Interface;
- } else {
- if (CB.indexFunctionRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxFunctionRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexFunctionRedeclaration(ClientData, &Info);
- }
- }
+ handleDecl(D, Loc, Cursor,
+ isRedeclaration, /*isDefinition=*/!isForwardRef, ContDInfo);
}
-void IndexingContext::handleVar(const VarDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexVariable) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxVariableInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexVariable(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+void IndexingContext::handleFunction(const FunctionDecl *D) {
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ DInfo);
+}
- } else {
- if (CB.indexVariableRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxVariableRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexVariableRedeclaration(ClientData, &Info);
- }
- }
+void IndexingContext::handleVar(const VarDecl *D) {
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ DInfo);
}
void IndexingContext::handleField(const FieldDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxFieldInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexField(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/false, DInfo);
}
void IndexingContext::handleEnumerator(const EnumConstantDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxEnumeratorInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexEnumerator(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/true, DInfo);
}
void IndexingContext::handleTagDecl(const TagDecl *D) {
- StrAdapter SA(this);
-
- if (D->isFirstDeclaration()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexTagType) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxTagTypeInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition(),
- D->getIdentifier() == 0};
-
- idxEntity = CB.indexTagType(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-
- } else {
- if (CB.indexTagTypeRedeclaration) {
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedRedeclInfo RedeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxTagTypeRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexTagTypeRedeclaration(ClientData, &Info);
- }
- }
+ TagDeclInfo TagDInfo;
+ TagDInfo.CXTagDeclInfo.declInfo = &TagDInfo;
+ TagDInfo.CXTagDeclInfo.isAnonymous = D->getIdentifier() == 0;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), D->isThisDeclarationADefinition(),
+ TagDInfo);
}
void IndexingContext::handleTypedef(const TypedefDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexTypedef) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxTypedefInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexTypedef(ClientData, &Info);
- }
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isFirstDeclaration(), /*isDefinition=*/true, DInfo);
+}
- addEntityInMap(D, idxEntity);
+void IndexingContext::handleObjCClass(const ObjCClassDecl *D) {
+ ObjCContainerDeclInfo ContDInfo;
+ const ObjCClassDecl::ObjCClassRef *Ref = D->getForwardDecl();
+ ObjCInterfaceDecl *IFaceD = Ref->getInterface();
+ SourceLocation Loc = Ref->getLocation();
+ bool isRedeclaration = IFaceD->getLocation() != Loc;
+ handleObjCContainer(IFaceD, Loc, MakeCursorObjCClassRef(IFaceD, Loc, CXTU),
+ /*isForwardRef=*/true, isRedeclaration,
+ /*isImplementation=*/false, ContDInfo);
}
void IndexingContext::handleObjCInterface(const ObjCInterfaceDecl *D) {
- StrAdapter SA(this);
+ ObjCContainerDeclInfo ContDInfo;
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/D->isInitiallyForwardDecl(),
+ /*isImplementation=*/false, ContDInfo);
+}
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCClass) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCClassInfo Info = { &IdxEntityInfo,
- D->isForwardDecl() };
+void IndexingContext::handleObjCImplementation(
+ const ObjCImplementationDecl *D) {
+ ObjCContainerDeclInfo ContDInfo;
+ const ObjCInterfaceDecl *Class = D->getClassInterface();
+ handleObjCContainer(Class, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/!Class->isImplicitInterfaceDecl(),
+ /*isImplementation=*/true, ContDInfo);
+}
- idxEntity = CB.indexObjCClass(ClientData, &Info);
- }
+void IndexingContext::handleObjCForwardProtocol(const ObjCProtocolDecl *D,
+ SourceLocation Loc,
+ bool isRedeclaration) {
+ ObjCContainerDeclInfo ContDInfo;
+ handleObjCContainer(D, Loc, MakeCursorObjCProtocolRef(D, Loc, CXTU),
+ /*isForwardRef=*/true,
+ isRedeclaration,
+ /*isImplementation=*/false, ContDInfo);
+}
- addEntityInMap(D, idxEntity);
+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;
- CXIdxObjCBaseClassInfo BaseClass = { getIndexEntity(D->getSuperClass()),
- getIndexLoc(D->getSuperClassLoc()) };
+ StrAdapter SA(*this);
+ CXIdxObjCBaseClassInfo BaseClass;
+ CXIdxEntityInfo BaseEntity;
if (D->getSuperClass()) {
- BaseClass.objcClass = getIndexEntity(D->getSuperClass());
+ getEntityInfo(D->getSuperClass(), BaseEntity, SA);
+ BaseClass.objcClass = &BaseEntity;
BaseClass.loc = getIndexLoc(D->getSuperClassLoc());
}
-
+
SmallVector<CXIdxObjCProtocolRefInfo, 4> ProtInfos;
+ SmallVector<CXIdxEntityInfo, 4> 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;
- CXIdxObjCProtocolRefInfo ProtInfo = { getIndexEntity(PD),
- getIndexLoc(Loc) };
+ ProtEntities.push_back(CXIdxEntityInfo());
+ getEntityInfo(PD, ProtEntities.back(), SA);
+ CXIdxObjCProtocolRefInfo ProtInfo = { 0, getIndexLoc(Loc) };
ProtInfos.push_back(ProtInfo);
}
+
+ for (unsigned i = 0, e = ProtInfos.size(); i != e; ++i)
+ ProtInfos[i].protocol = &ProtEntities[i];
SmallVector<CXIdxObjCProtocolRefInfo *, 4> 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),
- getIndexEntity(D),
+ &ClassEntity,
getIndexContainerForDC(D),
D->getSuperClass() ? &BaseClass : 0,
Prots.data(),
CB.defineObjCClass(ClientData, &Info);
}
-void IndexingContext::handleObjCProtocol(const ObjCProtocolDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCProtocol) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCProtocolInfo Info = { &IdxEntityInfo,
- D->isForwardDecl() };
-
- idxEntity = CB.indexObjCProtocol(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-}
-
void IndexingContext::handleObjCCategory(const ObjCCategoryDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCCategory) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCCategoryInfo Info = { &IdxEntityInfo,
- getIndexEntity(D->getClassInterface()) };
-
- idxEntity = CB.indexObjCCategory(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ ObjCCategoryDeclInfo CatDInfo;
+ CXIdxEntityInfo ClassEntity;
+ StrAdapter SA(*this);
+ getEntityInfo(D->getClassInterface(), ClassEntity, SA);
+
+ CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
+ CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
+ handleObjCContainer(D, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/false,
+ /*isImplementation=*/false, CatDInfo);
+}
+
+void IndexingContext::handleObjCCategoryImpl(const ObjCCategoryImplDecl *D) {
+ const ObjCCategoryDecl *CatD = D->getCategoryDecl();
+ ObjCCategoryDeclInfo CatDInfo;
+ CXIdxEntityInfo ClassEntity;
+ StrAdapter SA(*this);
+ getEntityInfo(CatD->getClassInterface(), ClassEntity, SA);
+
+ CatDInfo.CXObjCCatDeclInfo.containerInfo = &CatDInfo.CXObjCContDeclInfo;
+ CatDInfo.CXObjCCatDeclInfo.objcClass = &ClassEntity;
+ handleObjCContainer(CatD, D->getLocation(), getCursor(D),
+ /*isForwardRef=*/false,
+ /*isRedeclaration=*/true,
+ /*isImplementation=*/true, CatDInfo);
}
void IndexingContext::handleObjCMethod(const ObjCMethodDecl *D) {
- StrAdapter SA(this);
-
- if (D->isCanonicalDecl()) {
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCMethod) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCMethodInfo Info = { &IdxEntityInfo,
- D->isThisDeclarationADefinition() };
-
- idxEntity = CB.indexObjCMethod(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
-
- } else {
- if (CB.indexObjCMethodRedeclaration) {
- CXIdxIndexedRedeclInfo RedeclInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- getIndexedRedeclInfo(D, RedeclInfo, DeclInfo);
- CXIdxObjCMethodRedeclInfo Info = { &RedeclInfo,
- D->isThisDeclarationADefinition() };
-
- CB.indexObjCMethodRedeclaration(ClientData, &Info);
- }
- }
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ !D->isCanonicalDecl(), D->isThisDeclarationADefinition(),
+ DInfo);
}
void IndexingContext::handleObjCProperty(const ObjCPropertyDecl *D) {
- StrAdapter SA(this);
-
- CXIdxEntity idxEntity = 0;
- if (CB.indexObjCProperty) {
- CXIdxEntityInfo EntityInfo;
- CXIdxIndexedDeclInfo DeclInfo;
- CXIdxIndexedEntityInfo IdxEntityInfo;
- getIndexedEntityInfo(D, IdxEntityInfo, EntityInfo, DeclInfo, SA);
- CXIdxObjCPropertyInfo Info = { &IdxEntityInfo };
-
- idxEntity = CB.indexObjCProperty(ClientData, &Info);
- }
-
- addEntityInMap(D, idxEntity);
+ DeclInfo DInfo;
+ handleDecl(D, D->getLocation(), getCursor(D),
+ /*isRedeclaration=*/false, /*isDefinition=*/false,
+ DInfo);
}
void IndexingContext::handleReference(const NamedDecl *D, SourceLocation Loc,
if (isNotFromSourceFile(D->getLocation()))
return;
+ StrAdapter SA(*this);
CXCursor Cursor = E ? MakeCXCursor(const_cast<Expr*>(E),
const_cast<Decl*>(cast<Decl>(DC)), CXTU)
: getRefCursor(D, Loc);
+ CXIdxEntityInfo RefEntity, ParentEntity;
+ getEntityInfo(D, RefEntity, SA);
+ getEntityInfo(Parent, ParentEntity, SA);
CXIdxEntityRefInfo Info = { Cursor,
getIndexLoc(Loc),
- getIndexEntity(D),
- getIndexEntity(Parent),
+ &RefEntity,
+ &ParentEntity,
getIndexContainerForDC(DC),
Kind };
CB.indexEntityReference(ClientData, &Info);
}
-void IndexingContext::invokeStartedStatementBody(const NamedDecl *D,
- const DeclContext *DC) {
- const Stmt *Body = cast<Decl>(DC)->getBody();
- assert(Body);
-
- CXIdxContainer idxCont = 0;
- if (CB.startedStatementBody) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxStmtBodyInfo Info = { &ContainerInfo,
- getIndexLoc(Body->getLocStart()) };
-
- idxCont = CB.startedStatementBody(ClientData, &Info);
- }
- addContainerInMap(DC, idxCont);
-}
-
-void IndexingContext::invokeStartedTagTypeDefinition(const TagDecl *D) {
- CXIdxContainer idxCont = 0;
- if (CB.startedTagTypeDefinition) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxTagTypeDefinitionInfo Info = { &ContainerInfo };
-
- idxCont = CB.startedTagTypeDefinition(ClientData, &Info);
- }
- addContainerInMap(D, idxCont);
-}
+void IndexingContext::startContainer(const NamedDecl *D, bool isStmtBody,
+ const DeclContext *DC) {
+ if (!CB.startedContainer)
+ return;
-void IndexingContext::invokeStartedObjCContainer(const ObjCContainerDecl *D) {
- CXIdxContainer idxCont = 0;
- if (CB.startedObjCContainer) {
- CXIdxContainerInfo ContainerInfo;
- getContainerInfo(D, ContainerInfo);
- CXIdxObjCContainerInfo Info = { &ContainerInfo };
+ if (!DC)
+ DC = cast<DeclContext>(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<ObjCImplDecl>(D);
- idxCont = CB.startedObjCContainer(ClientData, &Info);
- }
- addContainerInMap(D, idxCont);
+ CXIdxClientContainer clientCont = CB.startedContainer(ClientData, &Info);
+ addContainerInMap(DC, clientCont);
}
-void IndexingContext::invokeEndedContainer(const DeclContext *DC) {
+void IndexingContext::endContainer(const DeclContext *DC) {
if (CB.endedContainer) {
CXIdxEndContainerInfo Info = { getIndexContainerForDC(DC),
getIndexLoc(cast<Decl>(DC)->getLocEnd()) };
}
void IndexingContext::addContainerInMap(const DeclContext *DC,
- CXIdxContainer container) {
+ CXIdxClientContainer container) {
assert(getScopedContext(DC) == DC);
ContainerMapTy::iterator I = ContainerMap.find(DC);
if (I == ContainerMap.end()) {
ContainerMap.erase(I);
}
-void IndexingContext::addEntityInMap(const NamedDecl *D, CXIdxEntity entity) {
+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());
EntityMap[D] = entity;
}
-CXIdxEntity IndexingContext::getIndexEntity(const NamedDecl *D) {
+CXIdxClientEntity IndexingContext::getClientEntity(const NamedDecl *D) {
if (!D)
return 0;
D = getEntityDecl(D);
return 0;
}
- StrAdapter SA(this);
+ StrAdapter SA(*this);
- CXIdxEntity idxEntity = 0;
+ CXIdxClientEntity idxEntity = 0;
if (CB.importedEntity) {
CXIdxEntityInfo EntityInfo;
getEntityInfo(D, EntityInfo, SA);
return DC->getRedeclContext();
}
-CXIdxContainer
+CXIdxClientContainer
IndexingContext::getIndexContainerForDC(const DeclContext *DC) const {
DC = getScopedContext(DC);
ContainerMapTy::const_iterator I = ContainerMap.find(DC);
return I->second;
}
-CXIdxFile IndexingContext::getIndexFile(const FileEntry *File) {
+CXIdxClientFile IndexingContext::getIndexFile(const FileEntry *File) {
if (!File)
return 0;
- if (!CB.recordFile)
- return 0;
FileMapTy::iterator FI = FileMap.find(File);
if (FI != FileMap.end())
return FI->second;
- CXIdxFile idxFile = CB.recordFile(ClientData, (CXFile)File, 0);
- FileMap[File] = idxFile;
- return idxFile;
+ return 0;
}
CXIdxLoc IndexingContext::getIndexLoc(SourceLocation Loc) const {
}
void IndexingContext::translateLoc(SourceLocation Loc,
- CXIdxFile *indexFile, CXFile *file,
+ CXIdxClientFile *indexFile, CXFile *file,
unsigned *line, unsigned *column,
unsigned *offset) {
if (Loc.isInvalid())
*offset = FileOffset;
}
-void IndexingContext::getIndexedEntityInfo(const NamedDecl *D,
- CXIdxIndexedEntityInfo &IdxEntityInfo,
- CXIdxEntityInfo &EntityInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo,
- StrAdapter &SA) {
- getEntityInfo(D, EntityInfo, SA);
- getIndexedDeclInfo(D, IdxDeclInfo);
- IdxEntityInfo.entityInfo = &EntityInfo;
- IdxEntityInfo.declInfo = &IdxDeclInfo;
-}
-
-void IndexingContext::getIndexedDeclInfo(const NamedDecl *D,
- CXIdxIndexedDeclInfo &IdxDeclInfo) {
- IdxDeclInfo.cursor = getCursor(D);
- IdxDeclInfo.loc = getIndexLoc(D->getLocation());
- IdxDeclInfo.container = getIndexContainer(D);
-}
-
-void IndexingContext::getIndexedRedeclInfo(const NamedDecl *D,
- CXIdxIndexedRedeclInfo &RedeclInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo) {
- getIndexedDeclInfo(D, IdxDeclInfo);
- RedeclInfo.declInfo = &IdxDeclInfo;
- RedeclInfo.entity = getIndexEntity(D);
-}
+void IndexingContext::getEntityInfo(const NamedDecl *D,
+ CXIdxEntityInfo &EntityInfo,
+ StrAdapter &SA) {
+ D = getEntityDecl(D);
+ EntityInfo.kind = CXIdxEntity_Unexposed;
+ EntityInfo.clientEntity = getClientEntity(D);
+
+ if (const TagDecl *TD = dyn_cast<TagDecl>(D)) {
+ switch (TD->getTagKind()) {
+ case TTK_Struct:
+ EntityInfo.kind = CXIdxEntity_Struct; break;
+ case TTK_Union:
+ EntityInfo.kind = CXIdxEntity_Union; break;
+ case TTK_Class:
+ EntityInfo.kind = CXIdxEntity_CXXClass; break;
+ case TTK_Enum:
+ EntityInfo.kind = CXIdxEntity_Enum; break;
+ }
-void IndexingContext::getContainerInfo(const NamedDecl *D,
- CXIdxContainerInfo &ContainerInfo) {
- ContainerInfo.cursor = getCursor(D);
- ContainerInfo.loc = getIndexLoc(D->getLocation());
- ContainerInfo.entity = getIndexEntity(D);
-}
+ } else {
+ switch (D->getKind()) {
+ case Decl::Typedef:
+ EntityInfo.kind = CXIdxEntity_Typedef; break;
+ case Decl::Function:
+ EntityInfo.kind = CXIdxEntity_Function; break;
+ case Decl::Var:
+ EntityInfo.kind = CXIdxEntity_Variable; break;
+ case Decl::Field:
+ EntityInfo.kind = CXIdxEntity_Field; break;
+ case Decl::EnumConstant:
+ EntityInfo.kind = CXIdxEntity_EnumConstant; break;
+ case Decl::ObjCInterface:
+ EntityInfo.kind = CXIdxEntity_ObjCClass; break;
+ case Decl::ObjCProtocol:
+ EntityInfo.kind = CXIdxEntity_ObjCProtocol; break;
+ case Decl::ObjCCategory:
+ EntityInfo.kind = CXIdxEntity_ObjCCategory; break;
+ case Decl::ObjCMethod:
+ EntityInfo.kind = CXIdxEntity_ObjCMethod; break;
+ case Decl::ObjCProperty:
+ EntityInfo.kind = CXIdxEntity_ObjCProperty; break;
+ case Decl::ObjCIvar:
+ EntityInfo.kind = CXIdxEntity_ObjCIvar; break;
+ default:
+ break;
+ }
+ }
-void IndexingContext::getEntityInfo(const NamedDecl *D,
- CXIdxEntityInfo &EntityInfo,
- StrAdapter &SA) {
if (IdentifierInfo *II = D->getIdentifier()) {
EntityInfo.name = SA.toCStr(II->getName());
} else if (isa<RecordDecl>(D) || isa<NamespaceDecl>(D)) {
- EntityInfo.name = 0;
+ EntityInfo.name = 0; // anonymous record/namespace.
} else {
unsigned Begin = SA.getCurSize();
EntityInfo.name = SA.getCStr(Begin);
}
- unsigned Begin = SA.getCurSize();
- bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
- if (Ignore) {
- EntityInfo.USR = "";
- } else {
- EntityInfo.USR = SA.getCStr(Begin);
+ {
+ unsigned Begin = SA.getCurSize();
+ bool Ignore = getDeclCursorUSR(D, SA.getBuffer());
+ if (Ignore) {
+ EntityInfo.USR = "";
+ } else {
+ EntityInfo.USR = SA.getCStr(Begin);
+ }
}
}
namespace clang {
class FileEntry;
class ObjCPropertyDecl;
+ class ObjCClassDecl;
namespace cxindex {
class IndexingContext;
+struct DeclInfo : public CXIdxDeclInfo {
+ CXIdxEntityInfo CXEntInfo;
+};
+
+struct TagDeclInfo : public DeclInfo {
+ CXIdxTagDeclInfo CXTagDeclInfo;
+};
+
+struct ObjCContainerDeclInfo : public DeclInfo {
+ CXIdxObjCContainerDeclInfo CXObjCContDeclInfo;
+};
+
+struct ObjCCategoryDeclInfo : public ObjCContainerDeclInfo {
+ CXIdxObjCCategoryDeclInfo CXObjCCatDeclInfo;
+};
+
class IndexingContext {
ASTContext *Ctx;
CXClientData ClientData;
unsigned IndexOptions;
CXTranslationUnit CXTU;
- typedef llvm::DenseMap<const FileEntry *, CXIdxFile> FileMapTy;
- typedef llvm::DenseMap<const NamedDecl *, CXIdxEntity> EntityMapTy;
- typedef llvm::DenseMap<const void *, CXIdxMacro> MacroMapTy;
- typedef llvm::DenseMap<const DeclContext *, CXIdxContainer> ContainerMapTy;
+ typedef llvm::DenseMap<const FileEntry *, CXIdxClientFile> FileMapTy;
+ typedef llvm::DenseMap<const NamedDecl *, CXIdxClientEntity> EntityMapTy;
+ typedef llvm::DenseMap<const void *, CXIdxClientMacro> MacroMapTy;
+ typedef llvm::DenseMap<const DeclContext *, CXIdxClientContainer> ContainerMapTy;
FileMapTy FileMap;
EntityMapTy EntityMap;
MacroMapTy MacroMap;
SmallVector<DeclGroupRef, 8> TUDeclsInObjCContainer;
llvm::SmallString<256> StrScratch;
+ unsigned StrAdapterCount;
class StrAdapter {
llvm::SmallString<256> &Scratch;
+ IndexingContext &IdxCtx;
public:
- StrAdapter(IndexingContext *indexCtx)
- : Scratch(indexCtx->StrScratch) {}
- ~StrAdapter() { Scratch.clear(); }
+ StrAdapter(IndexingContext &indexCtx)
+ : Scratch(indexCtx.StrScratch), IdxCtx(indexCtx) {
+ ++IdxCtx.StrAdapterCount;
+ }
+
+ ~StrAdapter() {
+ --IdxCtx.StrAdapterCount;
+ if (IdxCtx.StrAdapterCount == 0)
+ Scratch.clear();
+ }
const char *toCStr(StringRef Str);
IndexingContext(CXClientData clientData, IndexerCallbacks &indexCallbacks,
unsigned indexOptions, CXTranslationUnit cxTU)
: Ctx(0), ClientData(clientData), CB(indexCallbacks),
- IndexOptions(indexOptions), CXTU(cxTU) { }
+ IndexOptions(indexOptions), CXTU(cxTU), StrAdapterCount(0) { }
ASTContext &getASTContext() const { return *Ctx; }
void setASTContext(ASTContext &ctx);
+ void enteredMainFile(const FileEntry *File);
+
void ppIncludedFile(SourceLocation hashLoc,
StringRef filename, const FileEntry *File,
bool isImport, bool isAngled);
void handleTypedef(const TypedefDecl *D);
+ 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,
+ bool isRedeclaration);
+
void handleObjCProtocol(const ObjCProtocolDecl *D);
void handleObjCCategory(const ObjCCategoryDecl *D);
+ void handleObjCCategoryImpl(const ObjCCategoryImplDecl *D);
void handleObjCMethod(const ObjCMethodDecl *D);
const Expr *E = 0,
CXIdxEntityRefKind Kind = CXIdxEntityRef_Direct);
- void invokeStartedTagTypeDefinition(const TagDecl *D);
-
- void invokeStartedStatementBody(const NamedDecl *D, const DeclContext *DC);
+ void startContainer(const NamedDecl *D, bool isStmtBody = false,
+ const DeclContext *DC = 0);
- void invokeStartedObjCContainer(const ObjCContainerDecl *D);
-
- void invokeEndedContainer(const DeclContext *DC);
+ void endContainer(const DeclContext *DC);
bool isNotFromSourceFile(SourceLocation Loc) const;
TUDeclsInObjCContainer.push_back(DG);
}
- void translateLoc(SourceLocation Loc, CXIdxFile *indexFile, CXFile *file,
+ void translateLoc(SourceLocation Loc, CXIdxClientFile *indexFile, CXFile *file,
unsigned *line, unsigned *column, unsigned *offset);
private:
- void addEntityInMap(const NamedDecl *D, CXIdxEntity entity);
+ void handleDecl(const NamedDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isRedeclaration, bool isDefinition,
+ DeclInfo &DInfo);
+
+ void handleObjCContainer(const ObjCContainerDecl *D,
+ SourceLocation Loc, CXCursor Cursor,
+ bool isForwardRef,
+ bool isRedeclaration,
+ bool isImplementation,
+ ObjCContainerDeclInfo &ContDInfo);
- void addContainerInMap(const DeclContext *DC, CXIdxContainer container);
+ void addEntityInMap(const NamedDecl *D, CXIdxClientEntity entity);
- CXIdxEntity getIndexEntity(const NamedDecl *D);
+ void addContainerInMap(const DeclContext *DC, CXIdxClientContainer container);
+
+ CXIdxClientEntity getClientEntity(const NamedDecl *D);
const NamedDecl *getEntityDecl(const NamedDecl *D) const;
- CXIdxContainer getIndexContainer(const NamedDecl *D) const {
+ CXIdxClientContainer getIndexContainer(const NamedDecl *D) const {
return getIndexContainerForDC(D->getDeclContext());
}
const DeclContext *getScopedContext(const DeclContext *DC) const;
- CXIdxContainer getIndexContainerForDC(const DeclContext *DC) const;
+ CXIdxClientContainer getIndexContainerForDC(const DeclContext *DC) const;
- CXIdxFile getIndexFile(const FileEntry *File);
+ CXIdxClientFile getIndexFile(const FileEntry *File);
CXIdxLoc getIndexLoc(SourceLocation Loc) const;
- void getIndexedEntityInfo(const NamedDecl *D,
- CXIdxIndexedEntityInfo &IdxEntityInfo,
- CXIdxEntityInfo &EntityInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo,
- StrAdapter &SA);
-
- void getIndexedDeclInfo(const NamedDecl *D,
- CXIdxIndexedDeclInfo &IdxDeclInfo);
-
- void getIndexedRedeclInfo(const NamedDecl *D,
- CXIdxIndexedRedeclInfo &RedeclInfo,
- CXIdxIndexedDeclInfo &IdxDeclInfo);
-
- void getContainerInfo(const NamedDecl *D,
- CXIdxContainerInfo &ContainerInfo);
-
void getEntityInfo(const NamedDecl *D,
CXIdxEntityInfo &EntityInfo,
StrAdapter &SA);
clang_getTypeDeclaration
clang_getTypeKindSpelling
clang_hashCursor
+clang_index_getObjCCategoryDeclInfo
+clang_index_getObjCContainerDeclInfo
+clang_index_getTagDeclInfo
+clang_index_isEntityObjCCategoryKind
+clang_index_isEntityObjCContainerKind
+clang_index_isEntityTagKind
clang_indexLoc_getCXSourceLocation
clang_indexLoc_getFileLocation
clang_indexTranslationUnit