* reported.
*/
CXCursor_UnexposedStmt = 200,
- CXCursor_LastStmt = 200
+ CXCursor_LastStmt = 200,
+
+ /**
+ * \brief Cursor that represents the translation unit itself.
+ *
+ * The translation unit cursor exists primarily to act as the root
+ * cursor for traversing the contents of a translation unit.
+ */
+ CXCursor_TranslationUnit = 300
};
/**
CINDEX_LINKAGE void clang_loadDeclaration(CXDecl, CXDeclIterator, CXClientData);
+/**
+ * \brief Retrieve the cursor that represents the given translation unit.
+ *
+ * The translation unit cursor can be used to start traversing the
+ * various declarations within the given translation unit.
+ */
+CINDEX_LINKAGE CXCursor clang_getTranslationUnitCursor(CXTranslationUnit);
+
/*
* CXFile Operations.
*/
CINDEX_LINKAGE unsigned clang_isExpression(enum CXCursorKind);
CINDEX_LINKAGE unsigned clang_isStatement(enum CXCursorKind);
CINDEX_LINKAGE unsigned clang_isInvalid(enum CXCursorKind);
-
+CINDEX_LINKAGE unsigned clang_isTranslationUnit(enum CXCursorKind);
CINDEX_LINKAGE unsigned clang_equalCursors(CXCursor, CXCursor);
CINDEX_LINKAGE CXString clang_getCursorSpelling(CXCursor);
true);
}
+CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
+ CXCursor Result = { CXCursor_TranslationUnit, { TU, 0, 0 } };
+ return Result;
+}
+
void clang_loadTranslationUnit(CXTranslationUnit CTUnit,
CXTranslationUnitIterator callback,
CXClientData CData) {
extern "C" {
CXString clang_getCursorSpelling(CXCursor C) {
assert(getCursorDecl(C) && "CXCursor has null decl");
+ if (clang_isTranslationUnit(C.kind))
+ return clang_getTranslationUnitSpelling(C.data[0]);
+
if (clang_isReference(C.kind)) {
switch (C.kind) {
case CXCursor_ObjCSuperClassRef: {
case CXCursor_InvalidFile: return "InvalidFile";
case CXCursor_NoDeclFound: return "NoDeclFound";
case CXCursor_NotImplemented: return "NotImplemented";
+ case CXCursor_TranslationUnit: return "TranslationUnit";
}
llvm_unreachable("Unhandled CXCursorKind");
return K >= CXCursor_FirstStmt && K <= CXCursor_LastStmt;
}
+unsigned clang_isTranslationUnit(enum CXCursorKind K) {
+ return K == CXCursor_TranslationUnit;
+}
+
CXCursorKind clang_getCursorKind(CXCursor C) {
return C.kind;
}
_clang_getNumCompletionChunks
_clang_getRangeEnd
_clang_getRangeStart
+_clang_getTranslationUnitCursor
_clang_getTranslationUnitSpelling
_clang_isCursorDefinition
_clang_isDeclaration
_clang_isInvalid
_clang_isReference
_clang_isStatement
+_clang_isTranslationUnit
_clang_loadDeclaration
_clang_loadTranslationUnit
_clang_setUseExternalASTGeneration
//===----------------------------------------------------------------------===//
#include "CXCursor.h"
+#include "clang/Frontend/ASTUnit.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
#include "clang/AST/Expr.h"
case CXCursor_UnexposedStmt:
return static_cast<Decl *>(Cursor.data[0])->getASTContext();
+ case CXCursor_TranslationUnit: {
+ ASTUnit *CXXUnit = static_cast<ASTUnit *>(Cursor.data[0]);
+ return CXXUnit->getASTContext();
+ }
}
llvm_unreachable("No context available");