From: Ted Kremenek Date: Fri, 12 Nov 2010 21:34:12 +0000 (+0000) Subject: CursorVisitor: migrate CompoundLiteralExpr over to data-recursion algorithm. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cdb4caf6bd8beb562e169b4d3f6c604c4e4528f8;p=clang CursorVisitor: migrate CompoundLiteralExpr over to data-recursion algorithm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118928 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index bbceea945f..3c585ed2b0 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -126,12 +126,15 @@ namespace { 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 @@ typedef llvm::SmallVector VisitorWorkList; #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 *get() const { return static_cast(dataA); }\ }; DEF_JOB(DeclVisit, Decl, DeclVisitKind) @@ -153,6 +156,22 @@ DEF_JOB(StmtVisit, Stmt, StmtVisitKind) 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 @@ static inline void WLAddDecl(VisitorWorkList &WL, CXCursor Parent, Decl *D) { 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, @@ -334,7 +358,6 @@ public: // 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 @@ public: #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 @@ bool CursorVisitor::VisitExplicitCastExpr(ExplicitCastExpr *E) { 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 @@ void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) { default: EnqueueChildren(WL, C, S); break; + case Stmt::CompoundLiteralExprClass: { + CompoundLiteralExpr *CL = cast(S); + EnqueueChildren(WL, C, CL); + WLAddTypeLoc(WL, C, CL->getTypeSourceInfo()); + break; + } case Stmt::CXXOperatorCallExprClass: { CXXOperatorCallExpr *CE = cast(S); // Note that we enqueue things in reverse order so that @@ -1951,6 +1973,12 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { continue; } + case VisitorJob::TypeLocVisitKind: { + // Perform default visitation for TypeLocs. + if (Visit(cast(LI).get())) + return true; + continue; + } case VisitorJob::StmtVisitKind: { Stmt *S = cast(LI).get(); if (!S) @@ -1969,6 +1997,7 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { case Stmt::BinaryOperatorClass: case Stmt::CallExprClass: case Stmt::CaseStmtClass: + case Stmt::CompoundLiteralExprClass: case Stmt::CompoundStmtClass: case Stmt::CXXMemberCallExprClass: case Stmt::CXXOperatorCallExprClass: