anchor.diff:      assert(optional('do', token));
       Token doToken = token;
       listener.beginDoWhileStatement(doToken);
  -    token = token.next;
  -    listener.beginDoWhileStatementBody(token);
  -    token = parseStatementOpt(token).next;
  +    listener.beginDoWhileStatementBody(token.next);
  +    token = parseStatementOpt(token.next).next;
       listener.endDoWhileStatementBody(token);
       Token whileToken = token;
       token = expect('while', token);
  
positive.code:     Token commaToken = null;
      token = expect('assert', token);
      Token leftParenthesis = token;
      token = expect('(', token);
      bool old = mayParseFunctionExpressions;
      mayParseFunctionExpressions = true;
      token = parseExpression(token);
      if (optional(',', token)) {
        commaToken = token;
        token = token.next;
        if (optional(')', token)) {
          commaToken = null;
        } else {
          token = parseExpression(token);
        }
      }
      if (optional(',', token)) {
  
negative.code:     bool old = mayParseFunctionExpressions;
      mayParseFunctionExpressions = true;
      do {
        Token next = token.next;
        if (optional(')', next)) {
          token = next;
          break;
        }
        Token colon = null;
        if (optional(':', next.next)) {
          token = ensureIdentifier(next, IdentifierContext.namedArgumentReference)
              .next;
          colon = token;
          hasSeenNamedArgument = true;
        } else if (hasSeenNamedArgument) {
          // Positional argument after named argument.
          reportRecoverableError(next, fasta.messagePositionalAfterNamedArgument);
        }
        token = parseExpression(token.next);
        if (colon != null) listener.handleNamedArgument(colon);
        ++argumentCount;
      } while (optional(',', token));
  