anchor.diff:    @override
     JS.Statement visitForEachStatement(ForEachStatement node) {
       if (node.awaitKeyword != null) {
  -      return _emitAwaitFor(node);
  -    }
  -
  -    var init = _visitExpression(node.identifier);
  -    var iterable = _visitExpression(node.iterable);
  -
  -    var body = _visitScope(node.body);
  -    if (init == null) {
  -      var id = _emitVariableDef(node.loopVariable.identifier);
  -      init = js.call('let #', id);
  -      if (_annotatedNullCheck(node.loopVariable.declaredElement)) {
  -        body = JS.Block([_nullParameterCheck(JS.Identifier(id.name)), body]);
  -      }
  -      if (variableIsReferenced(id.name, iterable)) {
  -        var temp = JS.TemporaryId('iter');
  -        return JS.Block(
  -            [iterable.toVariableDeclaration(temp), JS.ForOf(init, temp, body)]);
  -      }
  -    }
  -    return JS.ForOf(init, iterable, body);
  -  }
  -
  -  JS.Statement _emitAwaitFor(ForEachStatement node) {
  +      return _emitAwaitFor(
  +          node.identifier, node.loopVariable, node.iterable, node.body);
  +    }
  +
  +    return _emitForEach(
  +        node.identifier, node.loopVariable, node.iterable, node.body);
  +  }
  +
  +  JS.Statement _emitAwaitFor(SimpleIdentifier identifier,
  +      DeclaredIdentifier loopVariable, Expression iterable, Statement body) {
       // Emits `await for (var value in stream) ...`, which desugars as:
       //
       // let iter = new StreamIterator(stream);
  
positive.code:   @override
    visitWithClause(node) => _unreachable(node);
  
    @override
    visitForElement(ForElement node) => _unreachable(node);
  
  
negative.code:       _unreachable(node);
  
    @override
    JS.Statement visitForStatement2(ForStatement2 node) {
      // TODO(nshahan) Simplify when control-flow-collections experiments are removed.
      var forParts = node.forLoopParts;
      if (forParts is ForPartsWithExpression) {
        return _emitFor(forParts.initialization, null, forParts.condition,
            forParts.updaters, node.body);
      } else if (forParts is ForPartsWithDeclarations) {
        return _emitFor(null, forParts.variables, forParts.condition,
            forParts.updaters, node.body);
      } else if (node.awaitKeyword == null) {
        if (forParts is ForEachPartsWithIdentifier) {
          return _emitForEach(
              forParts.identifier, null, forParts.iterable, node.body);
        } else if (forParts is ForEachPartsWithDeclaration) {
          return _emitForEach(
              null, forParts.loopVariable, forParts.iterable, node.body);
        }
      } else if (forParts is ForEachPartsWithIdentifier) {
        return _emitAwaitFor(
            forParts.identifier, null, forParts.iterable, node.body);
      } else if (forParts is ForEachPartsWithDeclaration) {
        return _emitAwaitFor(
            null, forParts.loopVariable, forParts.iterable, node.body);
      }
      return _unreachable(node);
    }
  
    @deprecated
    @override
  