diff --git a/lib/src/argument_list_visitor.dart b/lib/src/argument_list_visitor.dart
index 06c159e..c71b9f0 100644
--- a/lib/src/argument_list_visitor.dart
+++ b/lib/src/argument_list_visitor.dart
@@ -504,7 +504,7 @@
     // TODO(rnystrom): Should we step into parenthesized expressions?
 
     if (expression is ListLiteral) return expression.leftBracket;
-    if (expression is MapLiteral) return expression.leftBracket;
+    if (expression is SetOrMapLiteral) return expression.leftBracket;
     if (expression is SingleStringLiteral && expression.isMultiline) {
       return expression.beginToken;
     }
diff --git a/lib/src/call_chain_visitor.dart b/lib/src/call_chain_visitor.dart
index 066656b..b7289b0 100644
--- a/lib/src/call_chain_visitor.dart
+++ b/lib/src/call_chain_visitor.dart
@@ -311,7 +311,7 @@
 
     // Don't split right after a collection literal.
     if (expression is ListLiteral) return false;
-    if (expression is MapLiteral) return false;
+    if (expression is SetOrMapLiteral) return false;
 
     // Don't split right after a non-empty curly-bodied function.
     if (expression is FunctionExpression) {
diff --git a/lib/src/source_visitor.dart b/lib/src/source_visitor.dart
index 29f014d..6aa452a 100644
--- a/lib/src/source_visitor.dart
+++ b/lib/src/source_visitor.dart
@@ -503,7 +503,7 @@
   ///     ]..addAll(numbers);
   bool _isCollectionLike(Expression expression) {
     if (expression is ListLiteral) return false;
-    if (expression is MapLiteral) return false;
+    if (expression is SetOrMapLiteral) return false;
 
     // If the target is a call with a trailing comma in the argument list,
     // treat it like a collection literal.
@@ -1048,58 +1048,6 @@
     });
   }
 
-  visitForEachStatement(ForEachStatement node) {
-    builder.nestExpression();
-    token(node.awaitKeyword, after: space);
-    token(node.forKeyword);
-    space();
-    token(node.leftParenthesis);
-
-    if (node.loopVariable != null) {
-      // TODO(rnystrom): The formatting logic here is slightly different from
-      // how parameter metadata is handled and from how variable metadata is
-      // handled. I think what it does works better in the context of a for-in
-      // loop, but consider trying to unify this with one of the above.
-      //
-      // Metadata on class and variable declarations is *always* split:
-      //
-      //     @foo
-      //     class Bar {}
-      //
-      // Metadata on parameters has some complex logic to handle multiple
-      // parameters with metadata. It also indents the parameters farther than
-      // the metadata when split:
-      //
-      //     function(
-      //         @foo(long arg list...)
-      //             parameter1,
-      //         @foo
-      //             parameter2) {}
-      //
-      // For for-in variables, we allow it to not split, like parameters, but
-      // don't indent the variable when it does split:
-      //
-      //     for (
-      //         @foo
-      //         @bar
-      //         var blah in stuff) {}
-      builder.startRule();
-      visitNodes(node.loopVariable.metadata, between: split, after: split);
-      visit(node.loopVariable);
-      builder.endRule();
-    } else {
-      visit(node.identifier);
-    }
-    soloSplit();
-    token(node.inKeyword);
-    space();
-    visit(node.iterable);
-    token(node.rightParenthesis);
-    builder.unnest();
-
-    _visitLoopBody(node.body);
-  }
-
   visitFormalParameterList(FormalParameterList node,
       {bool nestExpression: true}) {
     // Corner case: empty parameter lists.
@@ -1206,38 +1154,103 @@
     if (nestExpression) builder.unnest();
   }
 
-  visitForStatement(ForStatement node) {
+  visitForStatement2(ForStatement2 node) {
     builder.nestExpression();
+    token(node.awaitKeyword, after: space);
     token(node.forKeyword);
     space();
     token(node.leftParenthesis);
 
     builder.startRule();
 
-    // The initialization clause.
-    if (node.initialization != null) {
-      visit(node.initialization);
-    } else if (node.variables != null) {
-      // Nest split variables more so they aren't at the same level
-      // as the rest of the loop clauses.
-      builder.nestExpression();
+    visit(node.forLoopParts);
 
-      // Allow the variables to stay unsplit even if the clauses split.
-      builder.startRule();
+    token(node.rightParenthesis);
+    builder.endRule();
+    builder.unnest();
 
-      var declaration = node.variables;
-      visitMetadata(declaration.metadata);
-      modifier(declaration.keyword);
-      visit(declaration.type, after: space);
+    _visitLoopBody(node.body);
+  }
 
-      visitCommaSeparatedNodes(declaration.variables, between: () {
-        split();
-      });
+  visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
+    // TODO(rnystrom): The formatting logic here is slightly different from
+    // how parameter metadata is handled and from how variable metadata is
+    // handled. I think what it does works better in the context of a for-in
+    // loop, but consider trying to unify this with one of the above.
+    //
+    // Metadata on class and variable declarations is *always* split:
+    //
+    //     @foo
+    //     class Bar {}
+    //
+    // Metadata on parameters has some complex logic to handle multiple
+    // parameters with metadata. It also indents the parameters farther than
+    // the metadata when split:
+    //
+    //     function(
+    //         @foo(long arg list...)
+    //             parameter1,
+    //         @foo
+    //             parameter2) {}
+    //
+    // For for-in variables, we allow it to not split, like parameters, but
+    // don't indent the variable when it does split:
+    //
+    //     for (
+    //         @foo
+    //         @bar
+    //         var blah in stuff) {}
+    // TODO(rnystrom): we used to call builder.startRule() here, but now we call
+    // it from visitForStatement2 prior to the `(`.  Is that ok?
+    visitNodes(node.loopVariable.metadata, between: split, after: split);
+    visit(node.loopVariable);
+    // TODO(rnystrom): we used to call builder.endRule() here, but now we call
+    // it from visitForStatement2 after the `)`.  Is that ok?
 
-      builder.endRule();
-      builder.unnest();
-    }
+    _visitForEachPartsFromIn(node);
+  }
 
+  void _visitForEachPartsFromIn(ForEachParts node) {
+    soloSplit();
+    token(node.inKeyword);
+    space();
+    visit(node.iterable);
+  }
+
+  visitForEachPartsWithIdentifier(ForEachPartsWithIdentifier node) {
+    visit(node.identifier);
+    _visitForEachPartsFromIn(node);
+  }
+
+  visitForPartsWithDeclarations(ForPartsWithDeclarations node) {
+    // Nest split variables more so they aren't at the same level
+    // as the rest of the loop clauses.
+    builder.nestExpression();
+
+    // Allow the variables to stay unsplit even if the clauses split.
+    builder.startRule();
+
+    var declaration = node.variables;
+    visitMetadata(declaration.metadata);
+    modifier(declaration.keyword);
+    visit(declaration.type, after: space);
+
+    visitCommaSeparatedNodes(declaration.variables, between: () {
+      split();
+    });
+
+    builder.endRule();
+    builder.unnest();
+
+    _visitForPartsFromLeftSeparator(node);
+  }
+
+  visitForPartsWithExpression(ForPartsWithExpression node) {
+    visit(node.initialization);
+    _visitForPartsFromLeftSeparator(node);
+  }
+
+  void _visitForPartsFromLeftSeparator(ForParts node) {
     token(node.leftSeparator);
 
     // The condition clause.
@@ -1256,12 +1269,6 @@
 
       builder.endRule();
     }
-
-    token(node.rightParenthesis);
-    builder.endRule();
-    builder.unnest();
-
-    _visitLoopBody(node.body);
   }
 
   visitFunctionDeclaration(FunctionDeclaration node) {
@@ -1597,14 +1604,10 @@
   visitListLiteral(ListLiteral node) {
     // Corner case: Splitting inside a list looks bad if there's only one
     // element, so make those more costly.
-    var cost = node.elements.length <= 1 ? Cost.singleElementList : Cost.normal;
+    var cost =
+        node.elements2.length <= 1 ? Cost.singleElementList : Cost.normal;
     _visitCollectionLiteral(
-        node, node.leftBracket, node.elements, node.rightBracket, cost);
-  }
-
-  visitMapLiteral(MapLiteral node) {
-    _visitCollectionLiteral(
-        node, node.leftBracket, node.entries, node.rightBracket);
+        node, node.leftBracket, node.elements2, node.rightBracket, cost);
   }
 
   visitMapLiteralEntry(MapLiteralEntry node) {
@@ -1834,9 +1837,9 @@
     newline();
   }
 
-  visitSetLiteral(SetLiteral node) {
+  visitSetOrMapLiteral(SetOrMapLiteral node) {
     _visitCollectionLiteral(
-        node, node.leftBracket, node.elements, node.rightBracket);
+        node, node.leftBracket, node.elements2, node.rightBracket);
   }
 
   visitShowCombinator(ShowCombinator node) {
@@ -2173,7 +2176,7 @@
 
     // Don't allow a split between a name and a collection. Instead, we want
     // the collection itself to split, or to split before the argument.
-    if (node.expression is ListLiteral || node.expression is MapLiteral) {
+    if (node.expression is ListLiteral || node.expression is SetOrMapLiteral) {
       space();
     } else {
       var split = soloSplit();
@@ -2700,7 +2703,7 @@
   ///         new SomeBuilderClass()..method()..method();
   int _assignmentCost(Expression rightHandSide) {
     if (rightHandSide is ListLiteral) return Cost.assignBlock;
-    if (rightHandSide is MapLiteral) return Cost.assignBlock;
+    if (rightHandSide is SetOrMapLiteral) return Cost.assignBlock;
     if (rightHandSide is CascadeExpression) return Cost.assignBlock;
 
     return Cost.assign;
diff --git a/pubspec.lock b/pubspec.lock
index 5c0437e..6172ed6 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -7,7 +7,7 @@
       name: analyzer
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.35.1"
+    version: "0.35.3"
   args:
     dependency: "direct main"
     description:
@@ -77,7 +77,7 @@
       name: front_end
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.1.11"
+    version: "0.1.13"
   glob:
     dependency: transitive
     description:
@@ -98,7 +98,7 @@
       name: html
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.13.3+3"
+    version: "0.13.4+1"
   http:
     dependency: transitive
     description:
@@ -147,7 +147,7 @@
       name: kernel
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.11"
+    version: "0.3.13"
   logging:
     dependency: transitive
     description:
@@ -203,7 +203,7 @@
       name: package_resolver
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.6"
+    version: "1.0.10"
   path:
     dependency: "direct main"
     description:
@@ -217,7 +217,7 @@
       name: pedantic
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.4.0"
+    version: "1.5.0"
   plugin:
     dependency: transitive
     description:
@@ -287,7 +287,7 @@
       name: source_span
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.5.4"
+    version: "1.5.5"
   stack_trace:
     dependency: transitive
     description:
@@ -394,4 +394,4 @@
     source: hosted
     version: "2.1.15"
 sdks:
-  dart: ">=2.1.0 <3.0.0"
+  dart: ">=2.1.1-dev.0.0 <3.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 2c0c2f6..ccd6217 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -9,7 +9,7 @@
   sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
-  analyzer: '>=0.35.1 <0.36.0'
+  analyzer: '>=0.35.3 <0.36.0'
   args: '>=0.12.1 <2.0.0'
   path: ^1.0.0
   source_span: ^1.4.0
diff --git a/test/comments/sets.stmt b/test/comments/sets.stmt
index 6d310c6..5ec54a7 100644
--- a/test/comments/sets.stmt
+++ b/test/comments/sets.stmt
@@ -50,8 +50,9 @@
 >>> multiple inline block comments
 var set = <int>{  /* 1 */   /* 2 */   /* 3 */  };
 <<<
-var set =
-    <int>{/* 1 */ /* 2 */ /* 3 */};
+var set = <int>{
+  /* 1 */ /* 2 */ /* 3 */
+};
 >>> multiline trailing block comment
 var set = <int>{  /* comment
 */  };
diff --git a/test/splitting/sets.stmt b/test/splitting/sets.stmt
index 743498a..43e7c3f 100644
--- a/test/splitting/sets.stmt
+++ b/test/splitting/sets.stmt
@@ -90,8 +90,12 @@
 >>> const
 var set = const {"foo", "bar", "fuz", null};
 <<<
-var set =
-    const {"foo", "bar", "fuz", null};
+var set = const {
+  "foo",
+  "bar",
+  "fuz",
+  null
+};
 >>> trailing comma forces split
 var set = {"foo", "bar" , };
 <<<
