anchor.diff:      var createStreamIter = _emitInstanceCreationExpression(
           streamIterator.element.unnamedConstructor,
           streamIterator,
  -        () => [_visitExpression(node.iterable)]);
  +        () => [_visitExpression(iterable)]);
       var iter = JS.TemporaryId('iter');
  -    var variable = node.identifier ?? node.loopVariable.identifier;
  -    var init = _visitExpression(node.identifier);
  +    var variable = identifier ?? loopVariable.identifier;
  +    var init = _visitExpression(identifier);
       if (init == null) {
         init = js.call('let # = #.current', [_emitVariableDef(variable), iter]);
       } else {
  
positive.code:   @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) {
      // Emits `await for (var value in stream) ...`, which desugars as:
      //
      // let iter = new StreamIterator(stream);
  
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
  