[cfe-commits] r118928 - /cfe/trunk/tools/libclang/CIndex.cpp
Ted Kremenek
kremenek at apple.com
Fri Nov 12 13:34:12 PST 2010
Author: kremenek
Date: Fri Nov 12 15:34:12 2010
New Revision: 118928
URL: http://llvm.org/viewvc/llvm-project?rev=118928&view=rev
Log:
CursorVisitor: migrate CompoundLiteralExpr over to data-recursion algorithm.
Modified:
cfe/trunk/tools/libclang/CIndex.cpp
Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=118928&r1=118927&r2=118928&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Fri Nov 12 15:34:12 2010
@@ -126,12 +126,15 @@
class VisitorJob {
public:
- enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind };
+ enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
+ TypeLocVisitKind };
protected:
- void *data;
+ void *dataA;
+ void *dataB;
CXCursor parent;
Kind K;
- VisitorJob(void *d, CXCursor C, Kind k) : data(d), parent(C), K(k) {}
+ VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0)
+ : dataA(d1), dataB(d2), parent(C), K(k) {}
public:
Kind getKind() const { return K; }
const CXCursor &getParent() const { return parent; }
@@ -143,9 +146,9 @@
#define DEF_JOB(NAME, DATA, KIND)\
class NAME : public VisitorJob {\
public:\
- NAME(DATA *d, CXCursor parent) : VisitorJob(d, parent, VisitorJob::KIND) {}\
+ NAME(DATA *d, CXCursor parent) : VisitorJob(parent, VisitorJob::KIND, d) {} \
static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
- DATA *get() const { return static_cast<DATA*>(data); }\
+ DATA *get() const { return static_cast<DATA*>(dataA); }\
};
DEF_JOB(DeclVisit, Decl, DeclVisitKind)
@@ -153,6 +156,22 @@
DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
#undef DEF_JOB
+class TypeLocVisit : public VisitorJob {
+public:
+ TypeLocVisit(TypeLoc tl, CXCursor parent) :
+ VisitorJob(parent, VisitorJob::TypeLocVisitKind,
+ tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
+
+ static bool classof(const VisitorJob *VJ) {
+ return VJ->getKind() == TypeLocVisitKind;
+ }
+
+ TypeLoc get() {
+ QualType T = QualType::getFromOpaquePtr(dataA);
+ return TypeLoc(T, dataB);
+ }
+};
+
static inline void WLAddStmt(VisitorWorkList &WL, CXCursor Parent, Stmt *S) {
if (S)
WL.push_back(StmtVisit(S, Parent));
@@ -161,6 +180,11 @@
if (D)
WL.push_back(DeclVisit(D, Parent));
}
+static inline void WLAddTypeLoc(VisitorWorkList &WL, CXCursor Parent,
+ TypeSourceInfo *TI) {
+ if (TI)
+ WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
+}
// Cursor visitor.
class CursorVisitor : public DeclVisitor<CursorVisitor, bool>,
@@ -334,7 +358,6 @@
// Expression visitors
bool VisitDeclRefExpr(DeclRefExpr *E);
bool VisitBlockExpr(BlockExpr *B);
- bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
bool VisitExplicitCastExpr(ExplicitCastExpr *E);
bool VisitObjCMessageExpr(ObjCMessageExpr *E);
bool VisitObjCEncodeExpr(ObjCEncodeExpr *E);
@@ -361,6 +384,7 @@
#define DATA_RECURSIVE_VISIT(NAME)\
bool Visit##NAME(NAME *S) { return VisitDataRecursive(S); }
DATA_RECURSIVE_VISIT(BinaryOperator)
+ DATA_RECURSIVE_VISIT(CompoundLiteralExpr)
DATA_RECURSIVE_VISIT(CXXMemberCallExpr)
DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
DATA_RECURSIVE_VISIT(DoStmt)
@@ -1563,14 +1587,6 @@
return VisitCastExpr(E);
}
-bool CursorVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
- if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
- if (Visit(TSInfo->getTypeLoc()))
- return true;
-
- return VisitExpr(E);
-}
-
bool CursorVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) {
return Visit(MakeCursorLabelRef(E->getLabel(), E->getLabelLoc(), TU));
}
@@ -1853,6 +1869,12 @@
default:
EnqueueChildren(WL, C, S);
break;
+ case Stmt::CompoundLiteralExprClass: {
+ CompoundLiteralExpr *CL = cast<CompoundLiteralExpr>(S);
+ EnqueueChildren(WL, C, CL);
+ WLAddTypeLoc(WL, C, CL->getTypeSourceInfo());
+ break;
+ }
case Stmt::CXXOperatorCallExprClass: {
CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S);
// Note that we enqueue things in reverse order so that
@@ -1951,6 +1973,12 @@
continue;
}
+ case VisitorJob::TypeLocVisitKind: {
+ // Perform default visitation for TypeLocs.
+ if (Visit(cast<TypeLocVisit>(LI).get()))
+ return true;
+ continue;
+ }
case VisitorJob::StmtVisitKind: {
Stmt *S = cast<StmtVisit>(LI).get();
if (!S)
@@ -1969,6 +1997,7 @@
case Stmt::BinaryOperatorClass:
case Stmt::CallExprClass:
case Stmt::CaseStmtClass:
+ case Stmt::CompoundLiteralExprClass:
case Stmt::CompoundStmtClass:
case Stmt::CXXMemberCallExprClass:
case Stmt::CXXOperatorCallExprClass:
More information about the cfe-commits
mailing list