From ae1fd6fd47ce3fbb878155af6f517adaeae15a51 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 17 Nov 2010 00:50:45 +0000 Subject: [PATCH] CursorVisitor: migrate handling of AddrLabelExpr to data-recursion algorithm, and unify that reasoning with GotoStmt. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119441 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/libclang/CIndex.cpp | 50 ++++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index 717db17f0e..23d2597613 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -136,7 +136,7 @@ class VisitorJob { public: enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind, TypeLocVisitKind, OverloadExprPartsKind, - DeclRefExprPartsKind }; + DeclRefExprPartsKind, LabelRefVisitKind }; protected: void *dataA; void *dataB; @@ -338,7 +338,6 @@ public: // Expression visitors bool VisitOffsetOfExpr(OffsetOfExpr *E); bool VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); - bool VisitAddrLabelExpr(AddrLabelExpr *E); bool VisitDesignatedInitExpr(DesignatedInitExpr *E); bool VisitCXXUuidofExpr(CXXUuidofExpr *E); bool VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E); @@ -1481,10 +1480,6 @@ bool CursorVisitor::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { return VisitExpr(E); } -bool CursorVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) { - return Visit(MakeCursorLabelRef(E->getLabel(), E->getLabelLoc(), TU)); -} - bool CursorVisitor::VisitDesignatedInitExpr(DesignatedInitExpr *E) { // Visit the designators. typedef DesignatedInitExpr::Designator Designator; @@ -1673,6 +1668,20 @@ public: } }; +class LabelRefVisit : public VisitorJob { +public: + LabelRefVisit(LabelStmt *LS, SourceLocation labelLoc, CXCursor parent) + : VisitorJob(parent, VisitorJob::LabelRefVisitKind, LS, + (void*) labelLoc.getRawEncoding()) {} + + static bool classof(const VisitorJob *VJ) { + return VJ->getKind() == VisitorJob::LabelRefVisitKind; + } + LabelStmt *get() const { return static_cast(dataA); } + SourceLocation getLoc() const { + return SourceLocation::getFromRawEncoding((unsigned)(uintptr_t) dataB); } +}; + class EnqueueVisitor : public StmtVisitor { VisitorWorkList &WL; CXCursor Parent; @@ -1680,6 +1689,7 @@ public: EnqueueVisitor(VisitorWorkList &wl, CXCursor parent) : WL(wl), Parent(parent) {} + void VisitAddrLabelExpr(AddrLabelExpr *E); void VisitBlockExpr(BlockExpr *B); void VisitCompoundLiteralExpr(CompoundLiteralExpr *E); void VisitCompoundStmt(CompoundStmt *S); @@ -1693,6 +1703,7 @@ public: void VisitDeclStmt(DeclStmt *S); void VisitExplicitCastExpr(ExplicitCastExpr *E); void VisitForStmt(ForStmt *FS); + void VisitGotoStmt(GotoStmt *GS); void VisitIfStmt(IfStmt *If); void VisitInitListExpr(InitListExpr *IE); void VisitMemberExpr(MemberExpr *M); @@ -1739,6 +1750,9 @@ void EnqueueVisitor::EnqueueChildren(Stmt *S) { VisitorWorkList::iterator I = WL.begin() + size, E = WL.end(); std::reverse(I, E); } +void EnqueueVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) { + WL.push_back(LabelRefVisit(E->getLabel(), E->getLabelLoc(), Parent)); +} void EnqueueVisitor::VisitBlockExpr(BlockExpr *B) { AddDecl(B->getBlockDecl()); } @@ -1814,6 +1828,9 @@ void EnqueueVisitor::VisitForStmt(ForStmt *FS) { AddDecl(FS->getConditionVariable()); AddStmt(FS->getInit()); } +void EnqueueVisitor::VisitGotoStmt(GotoStmt *GS) { + WL.push_back(LabelRefVisit(GS->getLabel(), GS->getLabelLoc(), Parent)); +} void EnqueueVisitor::VisitIfStmt(IfStmt *If) { AddStmt(If->getElse()); AddStmt(If->getThen()); @@ -1908,6 +1925,14 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { return true; continue; } + case VisitorJob::LabelRefVisitKind: { + LabelStmt *LS = cast(&LI)->get(); + if (Visit(MakeCursorLabelRef(LS, + cast(&LI)->getLoc(), + TU))) + return true; + continue; + } case VisitorJob::StmtVisitKind: { Stmt *S = cast(&LI)->get(); if (!S) @@ -1917,29 +1942,16 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { CXCursor Cursor = MakeCXCursor(S, StmtParent, TU); switch (S->getStmtClass()) { - case Stmt::GotoStmtClass: { - GotoStmt *GS = cast(S); - if (Visit(MakeCursorLabelRef(GS->getLabel(), - GS->getLabelLoc(), TU))) { - return true; - } - continue; - } // Cases not yet handled by the data-recursion // algorithm. case Stmt::OffsetOfExprClass: case Stmt::SizeOfAlignOfExprClass: - case Stmt::AddrLabelExprClass: - case Stmt::TypesCompatibleExprClass: - case Stmt::VAArgExprClass: case Stmt::DesignatedInitExprClass: - case Stmt::CXXTypeidExprClass: case Stmt::CXXUuidofExprClass: case Stmt::CXXScalarValueInitExprClass: case Stmt::CXXPseudoDestructorExprClass: case Stmt::UnaryTypeTraitExprClass: case Stmt::DependentScopeDeclRefExprClass: - case Stmt::CXXUnresolvedConstructExprClass: case Stmt::CXXDependentScopeMemberExprClass: if (Visit(Cursor)) return true; -- 2.40.0