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:           JS.Yield(js.call('#.moveNext()', iter))
              ..sourceInformation = _nodeStart(variable),
            init,
            _visitStatement(node.body),
            JS.Yield(js.call('#.cancel()', iter))
              ..sourceInformation = _nodeStart(variable)
          ]);
  
negative.code: 
    @override
    JS.For visitForStatement(ForStatement node) {
      return _emitFor(node.initialization, node.variables, node.condition,
          node.updaters, node.body);
    }
  
    @override
  