Stash a CXXUnit pointer into each cursor. This allows us to simplify
the interface to clang_visitChildren() by eliminating the
CXTranslationUnit pointer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@94051 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/CIndex/CXCursor.cpp b/tools/CIndex/CXCursor.cpp
index 7c8b33d..29bd4e2 100644
--- a/tools/CIndex/CXCursor.cpp
+++ b/tools/CIndex/CXCursor.cpp
@@ -71,12 +71,12 @@
return CXCursor_NotImplemented;
}
-CXCursor cxcursor::MakeCXCursor(Decl *D) {
- CXCursor C = { GetCursorKind(D), { D, 0, 0 } };
+CXCursor cxcursor::MakeCXCursor(Decl *D, ASTUnit *TU) {
+ CXCursor C = { GetCursorKind(D), { D, 0, TU } };
return C;
}
-CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent) {
+CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, ASTUnit *TU) {
CXCursorKind K = CXCursor_NotImplemented;
switch (S->getStmtClass()) {
@@ -207,14 +207,15 @@
break;
}
- CXCursor C = { K, { Parent, S, 0 } };
+ CXCursor C = { K, { Parent, S, TU } };
return C;
}
CXCursor cxcursor::MakeCursorObjCSuperClassRef(ObjCInterfaceDecl *Super,
- SourceLocation Loc) {
+ SourceLocation Loc,
+ ASTUnit *TU) {
void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
- CXCursor C = { CXCursor_ObjCSuperClassRef, { Super, RawLoc, 0 } };
+ CXCursor C = { CXCursor_ObjCSuperClassRef, { Super, RawLoc, TU } };
return C;
}
@@ -227,9 +228,10 @@
}
CXCursor cxcursor::MakeCursorObjCProtocolRef(ObjCProtocolDecl *Super,
- SourceLocation Loc) {
+ SourceLocation Loc,
+ ASTUnit *TU) {
void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
- CXCursor C = { CXCursor_ObjCProtocolRef, { Super, RawLoc, 0 } };
+ CXCursor C = { CXCursor_ObjCProtocolRef, { Super, RawLoc, TU } };
return C;
}
@@ -242,9 +244,10 @@
}
CXCursor cxcursor::MakeCursorObjCClassRef(ObjCInterfaceDecl *Class,
- SourceLocation Loc) {
+ SourceLocation Loc,
+ ASTUnit *TU) {
void *RawLoc = reinterpret_cast<void *>(Loc.getRawEncoding());
- CXCursor C = { CXCursor_ObjCClassRef, { Class, RawLoc, 0 } };
+ CXCursor C = { CXCursor_ObjCClassRef, { Class, RawLoc, TU } };
return C;
}
@@ -274,55 +277,11 @@
}
ASTContext &cxcursor::getCursorContext(CXCursor Cursor) {
- switch (Cursor.kind) {
- case CXCursor_TypedefDecl:
- case CXCursor_StructDecl:
- case CXCursor_UnionDecl:
- case CXCursor_ClassDecl:
- case CXCursor_EnumDecl:
- case CXCursor_FieldDecl:
- case CXCursor_EnumConstantDecl:
- case CXCursor_FunctionDecl:
- case CXCursor_VarDecl:
- case CXCursor_ParmDecl:
- case CXCursor_ObjCInterfaceDecl:
- case CXCursor_ObjCCategoryDecl:
- case CXCursor_ObjCProtocolDecl:
- case CXCursor_ObjCPropertyDecl:
- case CXCursor_ObjCIvarDecl:
- case CXCursor_ObjCInstanceMethodDecl:
- case CXCursor_ObjCClassMethodDecl:
- case CXCursor_ObjCImplementationDecl:
- case CXCursor_ObjCCategoryImplDecl:
- case CXCursor_UnexposedDecl:
- return static_cast<Decl *>(Cursor.data[0])->getASTContext();
+ return getCursorASTUnit(Cursor)->getASTContext();
+}
- case CXCursor_ObjCSuperClassRef:
- case CXCursor_ObjCProtocolRef:
- case CXCursor_ObjCClassRef:
- return static_cast<Decl *>(Cursor.data[0])->getASTContext();
-
- case CXCursor_InvalidFile:
- case CXCursor_NoDeclFound:
- case CXCursor_NotImplemented:
- llvm_unreachable("No context in an invalid cursor");
- break;
-
- case CXCursor_UnexposedExpr:
- case CXCursor_DeclRefExpr:
- case CXCursor_MemberRefExpr:
- case CXCursor_CallExpr:
- case CXCursor_ObjCMessageExpr:
- 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");
+ASTUnit *cxcursor::getCursorASTUnit(CXCursor Cursor) {
+ return static_cast<ASTUnit *>(Cursor.data[2]);
}
bool cxcursor::operator==(CXCursor X, CXCursor Y) {