anchor.diff:            Message message = fasta.templateExpectedButGot.withArguments(']');
             Token newToken = new SyntheticToken(
                 TokenType.CLOSE_SQUARE_BRACKET, next.charOffset);
  -          next = rewriteAndRecover(token, message, newToken);
  +          next = rewriteAndRecover(token, message, newToken).next;
           }
           listener.handleIndexedExpression(openSquareBracket, next);
           token = next;
  
positive.code:     Message message = context.recoveryTemplate.withArguments(next);
      Token identifier = new SyntheticStringToken(
          TokenType.IDENTIFIER, stringValue, next.charOffset, 0);
      return rewriteAndRecover(token, message, identifier);
    }
  
    /// Parse a simple identifier at the given [token], and return the identifier
  
negative.code:           // If this looks like the start of an expression,
            // then report an error, insert the comma, and continue parsing.
            next = rewriteAndRecover(
                    token,
                    fasta.templateExpectedButGot.withArguments(','),
                    new SyntheticToken(TokenType.COMMA, next.offset))
                .next;
          } else {
            reportRecoverableError(
                next, fasta.templateExpectedButGot.withArguments(')'));
  