forked from OSchip/llvm-project
Introduce a special cursor kind for the translation unit, to serve as
the root of the conceptual cursor hierarchy (just like we do with declarations). This will be used when we get to unify clang_loadTranslationUnit() and clang_loadDeclaration() into something more generally useful. llvm-svn: 93954
This commit is contained in:
parent
91970b4ea2
commit
d2fc7277be
|
@ -168,7 +168,15 @@ enum CXCursorKind {
|
|||
* 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
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -380,6 +388,14 @@ typedef void (*CXDeclIterator)(CXDecl, CXCursor, CXClientData);
|
|||
|
||||
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.
|
||||
*/
|
||||
|
@ -492,7 +508,7 @@ CINDEX_LINKAGE unsigned clang_isReference(enum CXCursorKind);
|
|||
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);
|
||||
|
|
|
@ -565,6 +565,11 @@ CXString clang_getTranslationUnitSpelling(CXTranslationUnit CTUnit) {
|
|||
true);
|
||||
}
|
||||
|
||||
CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
|
||||
CXCursor Result = { CXCursor_TranslationUnit, { TU, 0, 0 } };
|
||||
return Result;
|
||||
}
|
||||
|
||||
void clang_loadTranslationUnit(CXTranslationUnit CTUnit,
|
||||
CXTranslationUnitIterator callback,
|
||||
CXClientData CData) {
|
||||
|
@ -803,6 +808,9 @@ static Decl *getDeclFromExpr(Stmt *E) {
|
|||
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: {
|
||||
|
@ -867,6 +875,7 @@ const char *clang_getCursorKindSpelling(enum CXCursorKind Kind) {
|
|||
case CXCursor_InvalidFile: return "InvalidFile";
|
||||
case CXCursor_NoDeclFound: return "NoDeclFound";
|
||||
case CXCursor_NotImplemented: return "NotImplemented";
|
||||
case CXCursor_TranslationUnit: return "TranslationUnit";
|
||||
}
|
||||
|
||||
llvm_unreachable("Unhandled CXCursorKind");
|
||||
|
@ -947,6 +956,10 @@ unsigned clang_isStatement(enum CXCursorKind K) {
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ _clang_getNullCursor
|
|||
_clang_getNumCompletionChunks
|
||||
_clang_getRangeEnd
|
||||
_clang_getRangeStart
|
||||
_clang_getTranslationUnitCursor
|
||||
_clang_getTranslationUnitSpelling
|
||||
_clang_isCursorDefinition
|
||||
_clang_isDeclaration
|
||||
|
@ -46,6 +47,7 @@ _clang_isExpression
|
|||
_clang_isInvalid
|
||||
_clang_isReference
|
||||
_clang_isStatement
|
||||
_clang_isTranslationUnit
|
||||
_clang_loadDeclaration
|
||||
_clang_loadTranslationUnit
|
||||
_clang_setUseExternalASTGeneration
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "CXCursor.h"
|
||||
#include "clang/Frontend/ASTUnit.h"
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/DeclObjC.h"
|
||||
#include "clang/AST/Expr.h"
|
||||
|
@ -320,6 +321,10 @@ ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
|
|||
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");
|
||||
|
|
Loading…
Reference in New Issue