Merge remote-tracking branch 'origin/swift-3.1-branch' into stable

* origin/swift-3.1-branch:
  [index] Avoid using a RecursiveASTVisitor for SyntacticFormIndexer and iterate the DesignatedInitExprs of the InitListExpr directly.
diff --git a/lib/Index/IndexBody.cpp b/lib/Index/IndexBody.cpp
index f891542..5de0f0b 100644
--- a/lib/Index/IndexBody.cpp
+++ b/lib/Index/IndexBody.cpp
@@ -293,48 +293,6 @@
   // Also visit things that are in the syntactic form but not the semantic one,
   // for example the indices in DesignatedInitExprs.
   bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) {
-
-    class SyntacticFormIndexer :
-              public RecursiveASTVisitor<SyntacticFormIndexer> {
-      IndexingContext &IndexCtx;
-      const NamedDecl *Parent;
-      const DeclContext *ParentDC;
-      bool Visited = false;
-
-    public:
-      SyntacticFormIndexer(IndexingContext &indexCtx,
-                            const NamedDecl *Parent, const DeclContext *DC)
-        : IndexCtx(indexCtx), Parent(Parent), ParentDC(DC) { }
-
-      bool shouldWalkTypesOfTypeLocs() const { return false; }
-
-      bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) {
-        // Don't visit nested InitListExprs, this visitor will be called again
-        // later on for the nested ones.
-        if (Visited)
-          return true;
-        Visited = true;
-        InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S;
-        if (SyntaxForm) {
-          for (Stmt *SubStmt : SyntaxForm->children()) {
-            if (!TraverseStmt(SubStmt, Q))
-              return false;
-          }
-        }
-        return true;
-      }
-
-      bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {
-        for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) {
-          if (D.isFieldDesignator())
-            return IndexCtx.handleReference(D.getField(), D.getFieldLoc(),
-                                            Parent, ParentDC, SymbolRoleSet(),
-                                            {}, E);
-        }
-        return true;
-      }
-    };
-
     auto visitForm = [&](InitListExpr *Form) {
       for (Stmt *SubStmt : Form->children()) {
         if (!TraverseStmt(SubStmt, Q))
@@ -343,13 +301,26 @@
       return true;
     };
 
+    auto visitSyntacticDesignatedInitExpr = [&](DesignatedInitExpr *E) -> bool {
+      for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) {
+        if (D.isFieldDesignator())
+          return IndexCtx.handleReference(D.getField(), D.getFieldLoc(),
+                                          Parent, ParentDC, SymbolRoleSet(),
+                                          {}, E);
+      }
+      return true;
+    };
+
     InitListExpr *SemaForm = S->isSemanticForm() ? S : S->getSemanticForm();
     InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S;
 
     if (SemaForm) {
       // Visit things present in syntactic form but not the semantic form.
       if (SyntaxForm) {
-        SyntacticFormIndexer(IndexCtx, Parent, ParentDC).TraverseStmt(SyntaxForm);
+        for (Expr *init : SyntaxForm->inits()) {
+          if (auto *DIE = dyn_cast<DesignatedInitExpr>(init))
+            visitSyntacticDesignatedInitExpr(DIE);
+        }
       }
       return visitForm(SemaForm);
     }