]> granicus.if.org Git - clang/commitdiff
CursorVisitor: refactor visitation of
authorTed Kremenek <kremenek@apple.com>
Wed, 17 Nov 2010 00:50:47 +0000 (00:50 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 17 Nov 2010 00:50:47 +0000 (00:50 +0000)
explicit template args within data-recursion
algorithm.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119442 91177308-0d34-0410-b5e6-96231b3b80d8

tools/libclang/CIndex.cpp

index 23d259761326f2c925edc66e204133a87164bd21..3b17414052f51953191db64160c6a83d30261b5b 100644 (file)
@@ -136,7 +136,8 @@ class VisitorJob {
 public:
   enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
               TypeLocVisitKind, OverloadExprPartsKind,
-              DeclRefExprPartsKind, LabelRefVisitKind };
+              DeclRefExprPartsKind, LabelRefVisitKind,
+              ExplicitTemplateArgsVisitKind };
 protected:
   void *dataA;
   void *dataB;
@@ -1638,6 +1639,8 @@ DEF_JOB(StmtVisit, Stmt, StmtVisitKind)
 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
+DEF_JOB(ExplicitTemplateArgsVisit, ExplicitTemplateArgumentList, 
+        ExplicitTemplateArgsVisitKind)
 #undef DEF_JOB
 
 class DeclVisit : public VisitorJob {
@@ -1651,7 +1654,6 @@ public:
   Decl *get() const { return static_cast<Decl*>(dataA); }
   bool isFirst() const { return dataB ? true : false; }
 };
-
 class TypeLocVisit : public VisitorJob {
 public:
   TypeLocVisit(TypeLoc tl, CXCursor parent) :
@@ -1718,6 +1720,7 @@ public:
   void VisitVAArgExpr(VAArgExpr *E);
 
 private:
+  void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A);
   void AddStmt(Stmt *S);
   void AddDecl(Decl *D, bool isFirst = true);
   void AddTypeLoc(TypeSourceInfo *TI);
@@ -1733,6 +1736,12 @@ void EnqueueVisitor::AddDecl(Decl *D, bool isFirst) {
   if (D)
     WL.push_back(DeclVisit(D, Parent, isFirst));
 }
+void EnqueueVisitor::
+  AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A) {
+  if (A)
+    WL.push_back(ExplicitTemplateArgsVisit(
+                        const_cast<ExplicitTemplateArgumentList*>(A), Parent));
+}
 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
   if (TI)
     WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
@@ -1800,6 +1809,9 @@ void EnqueueVisitor::VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr
   AddTypeLoc(E->getTypeSourceInfo());
 }
 void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) {
+  if (DR->hasExplicitTemplateArgs()) {
+    AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs());
+  }
   WL.push_back(DeclRefExprParts(DR, Parent));
 }
 void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) {
@@ -1855,6 +1867,7 @@ void EnqueueVisitor::VisitObjCMessageExpr(ObjCMessageExpr *M) {
   AddTypeLoc(M->getClassReceiverTypeInfo());
 }
 void EnqueueVisitor::VisitOverloadExpr(OverloadExpr *E) {
+  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
   WL.push_back(OverloadExprParts(E, Parent));
 }
 void EnqueueVisitor::VisitStmt(Stmt *S) {
@@ -1919,6 +1932,17 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
 
         continue;
       }
+      case VisitorJob::ExplicitTemplateArgsVisitKind: {
+        const ExplicitTemplateArgumentList *ArgList =
+          cast<ExplicitTemplateArgsVisit>(&LI)->get();
+        for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
+               *ArgEnd = Arg + ArgList->NumTemplateArgs;
+               Arg != ArgEnd; ++Arg) {
+          if (VisitTemplateArgumentLoc(*Arg))
+            return true;
+        }
+        continue;
+      }
       case VisitorJob::TypeLocVisitKind: {
         // Perform default visitation for TypeLocs.
         if (Visit(cast<TypeLocVisit>(&LI)->get()))
@@ -2005,15 +2029,6 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
         // Visit declaration name.
         if (VisitDeclarationNameInfo(DR->getNameInfo()))
           return true;
-        // Visit explicitly-specified template arguments.
-        if (DR->hasExplicitTemplateArgs()) {
-          ExplicitTemplateArgumentList &Args = DR->getExplicitTemplateArgs();
-          for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(),
-                 *ArgEnd = Arg + Args.NumTemplateArgs;
-               Arg != ArgEnd; ++Arg)
-            if (VisitTemplateArgumentLoc(*Arg))
-              return true;
-        }
         continue;
       }
       case VisitorJob::OverloadExprPartsKind: {
@@ -2028,16 +2043,6 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) {
         // Visit the overloaded declaration reference.
         if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
           return true;
-        // Visit the explicitly-specified template arguments.
-        if (const ExplicitTemplateArgumentList *ArgList
-                                      = O->getOptionalExplicitTemplateArgs()) {
-          for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
-                 *ArgEnd = Arg + ArgList->NumTemplateArgs;
-               Arg != ArgEnd; ++Arg) {
-            if (VisitTemplateArgumentLoc(*Arg))
-              return true;
-          }
-        }
         continue;
       }
     }