CursorVisitor: migrate 'DoStmt', 'ForStmt', and 'WhileStmt' over to data-recursion algorithm.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118912 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index da7f42d..680b4d1 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -330,8 +330,6 @@
   bool VisitStmt(Stmt *S);
   bool VisitDeclStmt(DeclStmt *S);
   bool VisitGotoStmt(GotoStmt *S);
-  bool VisitWhileStmt(WhileStmt *S);
-  bool VisitForStmt(ForStmt *S);
 
   // Expression visitors
   bool VisitDeclRefExpr(DeclRefExpr *E);
@@ -366,9 +364,12 @@
   DATA_RECURSIVE_VISIT(BinaryOperator)
   DATA_RECURSIVE_VISIT(CXXMemberCallExpr)
   DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
+  DATA_RECURSIVE_VISIT(DoStmt)
   DATA_RECURSIVE_VISIT(IfStmt)
+  DATA_RECURSIVE_VISIT(ForStmt)
   DATA_RECURSIVE_VISIT(MemberExpr)
   DATA_RECURSIVE_VISIT(SwitchStmt)
+  DATA_RECURSIVE_VISIT(WhileStmt)
   
   // Data-recursive visitor functions.
   bool IsInRegionOfInterest(CXCursor C);
@@ -1472,38 +1473,6 @@
   return Visit(MakeCursorLabelRef(S->getLabel(), S->getLabelLoc(), TU));
 }
 
-bool CursorVisitor::VisitWhileStmt(WhileStmt *S) {
-  if (VarDecl *Var = S->getConditionVariable()) {
-    if (Visit(MakeCXCursor(Var, TU)))
-      return true;
-  }
-
-  if (S->getCond() && Visit(MakeCXCursor(S->getCond(), StmtParent, TU)))
-    return true;
-  if (S->getBody() && Visit(MakeCXCursor(S->getBody(), StmtParent, TU)))
-    return true;
-
-  return false;
-}
-
-bool CursorVisitor::VisitForStmt(ForStmt *S) {
-  if (S->getInit() && Visit(MakeCXCursor(S->getInit(), StmtParent, TU)))
-    return true;
-  if (VarDecl *Var = S->getConditionVariable()) {
-    if (Visit(MakeCXCursor(Var, TU)))
-      return true;
-  }
-
-  if (S->getCond() && Visit(MakeCXCursor(S->getCond(), StmtParent, TU)))
-    return true;
-  if (S->getInc() && Visit(MakeCXCursor(S->getInc(), StmtParent, TU)))
-    return true;
-  if (S->getBody() && Visit(MakeCXCursor(S->getBody(), StmtParent, TU)))
-    return true;
-
-  return false;
-}
-
 bool CursorVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
   // Visit nested-name-specifier, if present.
   if (NestedNameSpecifier *Qualifier = E->getQualifier())
@@ -1906,6 +1875,15 @@
       WLAddStmt(WL, C, B->getLHS());
       break;
     }
+    case Stmt::ForStmtClass: {
+      ForStmt *FS = cast<ForStmt>(S);
+      WLAddStmt(WL, C, FS->getBody());
+      WLAddStmt(WL, C, FS->getInc());
+      WLAddStmt(WL, C, FS->getCond());
+      WLAddDecl(WL, C, FS->getConditionVariable());
+      WLAddStmt(WL, C, FS->getInit());
+      break;
+    }
     case Stmt::IfStmtClass: {
       IfStmt *If = cast<IfStmt>(S);
       WLAddStmt(WL, C, If->getElse());
@@ -1931,6 +1909,13 @@
       WLAddDecl(WL, C, SS->getConditionVariable());
       break;
     }
+    case Stmt::WhileStmtClass: {
+      WhileStmt *W = cast<WhileStmt>(S);
+      WLAddStmt(WL, C, W->getBody());
+      WLAddStmt(WL, C, W->getCond());
+      WLAddDecl(WL, C, W->getConditionVariable());
+      break;
+    }
   }
 }
 
@@ -1985,11 +1970,14 @@
           case Stmt::CXXMemberCallExprClass:
           case Stmt::CXXOperatorCallExprClass:
           case Stmt::DefaultStmtClass:
+          case Stmt::DoStmtClass:
+          case Stmt::ForStmtClass:
           case Stmt::IfStmtClass:
           case Stmt::MemberExprClass:
           case Stmt::ParenExprClass:
           case Stmt::SwitchStmtClass:
           case Stmt::UnaryOperatorClass:
+          case Stmt::WhileStmtClass:
           {
             if (!IsInRegionOfInterest(Cursor))
               continue;