[llvm-branch-commits] [cfe-branch] r119631 - /cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp

Daniel Dunbar daniel at zuster.org
Wed Nov 17 18:36:48 PST 2010


Author: ddunbar
Date: Wed Nov 17 20:36:48 2010
New Revision: 119631

URL: http://llvm.org/viewvc/llvm-project?rev=119631&view=rev
Log:
Merge r118928:
--
Author: Ted Kremenek <kremenek at apple.com>
Date:   Fri Nov 12 21:34:12 2010 +0000

    CursorVisitor: migrate CompoundLiteralExpr over to data-recursion algorithm.

Modified:
    cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp

Modified: cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp?rev=119631&r1=119630&r2=119631&view=diff
==============================================================================
--- cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp (original)
+++ cfe/branches/Apple/whitney/tools/libclang/CIndex.cpp Wed Nov 17 20:36:48 2010
@@ -136,12 +136,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; }
@@ -153,9 +156,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)
@@ -163,6 +166,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));
@@ -171,6 +190,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>,
@@ -348,7 +372,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);
@@ -375,6 +398,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)
@@ -1578,14 +1602,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));
 }
@@ -1868,6 +1884,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
@@ -1966,6 +1988,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)
@@ -1984,6 +2012,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 llvm-branch-commits mailing list