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/CIndex.cpp b/tools/CIndex/CIndex.cpp
index 267fcf7..a1c1230 100644
--- a/tools/CIndex/CIndex.cpp
+++ b/tools/CIndex/CIndex.cpp
@@ -141,6 +141,7 @@
// Cursor visitor.
class CursorVisitor : public DeclVisitor<CursorVisitor, bool> {
+ ASTUnit *TU;
CXCursor Parent;
CXCursorVisitor Visitor;
CXClientData ClientData;
@@ -153,9 +154,9 @@
using DeclVisitor<CursorVisitor, bool>::Visit;
public:
- CursorVisitor(CXCursorVisitor Visitor, CXClientData ClientData,
+ CursorVisitor(ASTUnit *TU, CXCursorVisitor Visitor, CXClientData ClientData,
unsigned MaxPCHLevel)
- : Visitor(Visitor), ClientData(ClientData), MaxPCHLevel(MaxPCHLevel)
+ : TU(TU), Visitor(Visitor), ClientData(ClientData), MaxPCHLevel(MaxPCHLevel)
{
Parent.kind = CXCursor_NoDeclFound;
Parent.data[0] = 0;
@@ -242,12 +243,12 @@
}
if (clang_isTranslationUnit(Cursor.kind)) {
- ASTUnit *CXXUnit = static_cast<ASTUnit *>(Cursor.data[0]);
+ ASTUnit *CXXUnit = getCursorASTUnit(Cursor);
if (!CXXUnit->isMainFileAST() && CXXUnit->getOnlyLocalDecls()) {
const std::vector<Decl*> &TLDs = CXXUnit->getTopLevelDecls();
for (std::vector<Decl*>::const_iterator it = TLDs.begin(),
ie = TLDs.end(); it != ie; ++it) {
- if (Visit(MakeCXCursor(*it)))
+ if (Visit(MakeCXCursor(*it, CXXUnit)))
return true;
}
} else {
@@ -271,7 +272,7 @@
bool CursorVisitor::VisitDeclContext(DeclContext *DC) {
for (DeclContext::decl_iterator
I = DC->decls_begin(), E = DC->decls_end(); I != E; ++I) {
- if (Visit(MakeCXCursor(*I)))
+ if (Visit(MakeCXCursor(*I, TU)))
return true;
}
@@ -296,13 +297,14 @@
}
bool CursorVisitor::VisitObjCCategoryDecl(ObjCCategoryDecl *ND) {
- if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation())))
+ if (Visit(MakeCursorObjCClassRef(ND->getClassInterface(), ND->getLocation(),
+ TU)))
return true;
ObjCCategoryDecl::protocol_loc_iterator PL = ND->protocol_loc_begin();
for (ObjCCategoryDecl::protocol_iterator I = ND->protocol_begin(),
E = ND->protocol_end(); I != E; ++I, ++PL)
- if (Visit(MakeCursorObjCProtocolRef(*I, *PL)))
+ if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
return true;
return VisitDeclContext(ND);
@@ -312,13 +314,14 @@
// Issue callbacks for super class.
if (D->getSuperClass() &&
Visit(MakeCursorObjCSuperClassRef(D->getSuperClass(),
- D->getSuperClassLoc())))
+ D->getSuperClassLoc(),
+ TU)))
return true;
ObjCInterfaceDecl::protocol_loc_iterator PL = D->protocol_loc_begin();
for (ObjCInterfaceDecl::protocol_iterator I = D->protocol_begin(),
E = D->protocol_end(); I != E; ++I, ++PL)
- if (Visit(MakeCursorObjCProtocolRef(*I, *PL)))
+ if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
return true;
return VisitDeclContext(D);
@@ -336,7 +339,7 @@
ObjCProtocolDecl::protocol_loc_iterator PL = PID->protocol_loc_begin();
for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
E = PID->protocol_end(); I != E; ++I, ++PL)
- if (Visit(MakeCursorObjCProtocolRef(*I, *PL)))
+ if (Visit(MakeCursorObjCProtocolRef(*I, *PL, TU)))
return true;
return VisitDeclContext(PID);
@@ -513,7 +516,7 @@
}
CXCursor clang_getTranslationUnitCursor(CXTranslationUnit TU) {
- CXCursor Result = { CXCursor_TranslationUnit, { TU, 0, 0 } };
+ CXCursor Result = { CXCursor_TranslationUnit, { 0, 0, TU } };
return Result;
}
@@ -641,11 +644,10 @@
extern "C" {
-unsigned clang_visitChildren(CXTranslationUnit tu,
- CXCursor parent,
+unsigned clang_visitChildren(CXCursor parent,
CXCursorVisitor visitor,
CXClientData client_data) {
- ASTUnit *CXXUnit = static_cast<ASTUnit *>(tu);
+ ASTUnit *CXXUnit = getCursorASTUnit(parent);
unsigned PCHLevel = Decl::MaxPCHLevel;
@@ -658,7 +660,7 @@
++PCHLevel;
}
- CursorVisitor CursorVis(visitor, client_data, PCHLevel);
+ CursorVisitor CursorVis(CXXUnit, visitor, client_data, PCHLevel);
return CursorVis.VisitChildren(parent);
}
@@ -686,7 +688,7 @@
CXString clang_getCursorSpelling(CXCursor C) {
assert(getCursorDecl(C) && "CXCursor has null decl");
if (clang_isTranslationUnit(C.kind))
- return clang_getTranslationUnitSpelling(C.data[0]);
+ return clang_getTranslationUnitSpelling(C.data[2]);
if (clang_isReference(C.kind)) {
switch (C.kind) {
@@ -787,15 +789,15 @@
Stmt *Stm = ALoc.dyn_AsStmt();
if (Dcl) {
if (Stm)
- return MakeCXCursor(Stm, Dcl);
+ return MakeCXCursor(Stm, Dcl, CXXUnit);
if (ALoc.isNamedRef()) {
if (ObjCInterfaceDecl *Class = dyn_cast<ObjCInterfaceDecl>(Dcl))
- return MakeCursorObjCClassRef(Class, ALoc.AsNamedRef().Loc);
+ return MakeCursorObjCClassRef(Class, ALoc.AsNamedRef().Loc, CXXUnit);
if (ObjCProtocolDecl *Proto = dyn_cast<ObjCProtocolDecl>(Dcl))
- return MakeCursorObjCProtocolRef(Proto, ALoc.AsNamedRef().Loc);
+ return MakeCursorObjCProtocolRef(Proto, ALoc.AsNamedRef().Loc, CXXUnit);
}
- return MakeCXCursor(Dcl);
+ return MakeCXCursor(Dcl, CXXUnit);
}
return MakeCXCursorInvalid(CXCursor_NoDeclFound);
}
@@ -933,13 +935,17 @@
}
CXCursor clang_getCursorReferenced(CXCursor C) {
+ if (clang_isInvalid(C.kind))
+ return clang_getNullCursor();
+
+ ASTUnit *CXXUnit = getCursorASTUnit(C);
if (clang_isDeclaration(C.kind))
return C;
if (clang_isExpression(C.kind)) {
Decl *D = getDeclFromExpr(getCursorExpr(C));
if (D)
- return MakeCXCursor(D);
+ return MakeCXCursor(D, CXXUnit);
return clang_getNullCursor();
}
@@ -948,13 +954,13 @@
switch (C.kind) {
case CXCursor_ObjCSuperClassRef:
- return MakeCXCursor(getCursorObjCSuperClassRef(C).first);
+ return MakeCXCursor(getCursorObjCSuperClassRef(C).first, CXXUnit);
case CXCursor_ObjCProtocolRef: {
- return MakeCXCursor(getCursorObjCProtocolRef(C).first);
+ return MakeCXCursor(getCursorObjCProtocolRef(C).first, CXXUnit);
case CXCursor_ObjCClassRef:
- return MakeCXCursor(getCursorObjCClassRef(C).first);
+ return MakeCXCursor(getCursorObjCClassRef(C).first, CXXUnit);
default:
// We would prefer to enumerate all non-reference cursor kinds here.
@@ -967,6 +973,11 @@
}
CXCursor clang_getCursorDefinition(CXCursor C) {
+ if (clang_isInvalid(C.kind))
+ return clang_getNullCursor();
+
+ ASTUnit *CXXUnit = getCursorASTUnit(C);
+
bool WasReference = false;
if (clang_isReference(C.kind) || clang_isExpression(C.kind)) {
C = clang_getCursorReferenced(C);
@@ -1016,10 +1027,11 @@
break;
case Decl::UsingDirective:
- return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace());
+ return MakeCXCursor(cast<UsingDirectiveDecl>(D)->getNominatedNamespace(),
+ CXXUnit);
case Decl::NamespaceAlias:
- return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace());
+ return MakeCXCursor(cast<NamespaceAliasDecl>(D)->getNamespace(), CXXUnit);
case Decl::Enum:
case Decl::Record:
@@ -1027,7 +1039,7 @@
case Decl::ClassTemplateSpecialization:
case Decl::ClassTemplatePartialSpecialization:
if (TagDecl *Def = cast<TagDecl>(D)->getDefinition(D->getASTContext()))
- return MakeCXCursor(Def);
+ return MakeCXCursor(Def, CXXUnit);
return clang_getNullCursor();
case Decl::Function:
@@ -1037,7 +1049,7 @@
case Decl::CXXConversion: {
const FunctionDecl *Def = 0;
if (cast<FunctionDecl>(D)->getBody(Def))
- return MakeCXCursor(const_cast<FunctionDecl *>(Def));
+ return MakeCXCursor(const_cast<FunctionDecl *>(Def), CXXUnit);
return clang_getNullCursor();
}
@@ -1047,7 +1059,7 @@
// Variables with initializers have definitions.
const VarDecl *Def = 0;
if (Var->getDefinition(Def))
- return MakeCXCursor(const_cast<VarDecl *>(Def));
+ return MakeCXCursor(const_cast<VarDecl *>(Def), CXXUnit);
// extern and private_extern variables are not definitions.
if (Var->hasExternalStorage())
@@ -1064,7 +1076,7 @@
case Decl::FunctionTemplate: {
const FunctionDecl *Def = 0;
if (cast<FunctionTemplateDecl>(D)->getTemplatedDecl()->getBody(Def))
- return MakeCXCursor(Def->getDescribedFunctionTemplate());
+ return MakeCXCursor(Def->getDescribedFunctionTemplate(), CXXUnit);
return clang_getNullCursor();
}
@@ -1072,7 +1084,8 @@
if (RecordDecl *Def = cast<ClassTemplateDecl>(D)->getTemplatedDecl()
->getDefinition(D->getASTContext()))
return MakeCXCursor(
- cast<CXXRecordDecl>(Def)->getDescribedClassTemplate());
+ cast<CXXRecordDecl>(Def)->getDescribedClassTemplate(),
+ CXXUnit);
return clang_getNullCursor();
}
@@ -1087,7 +1100,8 @@
return clang_getNullCursor();
}
- Def = clang_getCursorDefinition(MakeCXCursor((*S)->getTargetDecl()));
+ Def = clang_getCursorDefinition(MakeCXCursor((*S)->getTargetDecl(),
+ CXXUnit));
}
return Def;
@@ -1095,7 +1109,8 @@
case Decl::UsingShadow:
return clang_getCursorDefinition(
- MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl()));
+ MakeCXCursor(cast<UsingShadowDecl>(D)->getTargetDecl(),
+ CXXUnit));
case Decl::ObjCMethod: {
ObjCMethodDecl *Method = cast<ObjCMethodDecl>(D);
@@ -1111,7 +1126,7 @@
if (ObjCMethodDecl *Def = ClassImpl->getMethod(Method->getSelector(),
Method->isInstanceMethod()))
if (Def->isThisDeclarationADefinition())
- return MakeCXCursor(Def);
+ return MakeCXCursor(Def, CXXUnit);
return clang_getNullCursor();
}
@@ -1119,7 +1134,7 @@
case Decl::ObjCCategory:
if (ObjCCategoryImplDecl *Impl
= cast<ObjCCategoryDecl>(D)->getImplementation())
- return MakeCXCursor(Impl);
+ return MakeCXCursor(Impl, CXXUnit);
return clang_getNullCursor();
case Decl::ObjCProtocol:
@@ -1138,7 +1153,7 @@
return C;
} else if (ObjCImplementationDecl *Impl
= cast<ObjCInterfaceDecl>(D)->getImplementation())
- return MakeCXCursor(Impl);
+ return MakeCXCursor(Impl, CXXUnit);
return clang_getNullCursor();
case Decl::ObjCProperty:
@@ -1150,7 +1165,7 @@
if (ObjCInterfaceDecl *Class
= cast<ObjCCompatibleAliasDecl>(D)->getClassInterface())
if (!Class->isForwardDecl())
- return MakeCXCursor(Class);
+ return MakeCXCursor(Class, CXXUnit);
return clang_getNullCursor();
@@ -1158,7 +1173,8 @@
ObjCForwardProtocolDecl *Forward = cast<ObjCForwardProtocolDecl>(D);
if (Forward->protocol_size() == 1)
return clang_getCursorDefinition(
- MakeCXCursor(*Forward->protocol_begin()));
+ MakeCXCursor(*Forward->protocol_begin(),
+ CXXUnit));
// FIXME: Cannot return multiple definitions.
return clang_getNullCursor();
@@ -1169,7 +1185,7 @@
if (Class->size() == 1) {
ObjCInterfaceDecl *IFace = Class->begin()->getInterface();
if (!IFace->isForwardDecl())
- return MakeCXCursor(IFace);
+ return MakeCXCursor(IFace, CXXUnit);
return clang_getNullCursor();
}
@@ -1179,12 +1195,12 @@
case Decl::Friend:
if (NamedDecl *Friend = cast<FriendDecl>(D)->getFriendDecl())
- return clang_getCursorDefinition(MakeCXCursor(Friend));
+ return clang_getCursorDefinition(MakeCXCursor(Friend, CXXUnit));
return clang_getNullCursor();
case Decl::FriendTemplate:
if (NamedDecl *Friend = cast<FriendTemplateDecl>(D)->getFriendDecl())
- return clang_getCursorDefinition(MakeCXCursor(Friend));
+ return clang_getCursorDefinition(MakeCXCursor(Friend, CXXUnit));
return clang_getNullCursor();
}