anchor.diff:            // 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));
  +                  token,
  +                  fasta.templateExpectedButGot.withArguments(','),
  +                  new SyntheticToken(TokenType.COMMA, next.offset))
  +              .next;
           } else {
             reportRecoverableError(
                 next, fasta.templateExpectedButGot.withArguments(')'));
  
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:         // forgotten the `operator` keyword.
          token = rewriteAndRecover(token, fasta.messageMissingOperatorKeyword,
              new SyntheticKeywordToken(Keyword.OPERATOR, next.offset));
          return parseOperatorName(token);
        } else {
          reportRecoverableErrorWithToken(next, context.recoveryTemplate);
          if (context == IdentifierContext.methodDeclaration) {
  