anchor.diff:      Token begin = token = token.next;
       listener.beginClassBody(token);
       if (!optional('{', token)) {
  -      token = begin = recoverFromMissingClassBody(previousToken);
  +      token =
  +          begin = ensureBlock(previousToken, fasta.templateExpectedClassBody);
       }
       int count = 0;
       while (notEofOrValue('}', token.next)) {
  
positive.code:     return token;
    }
  
    /// If the next token is an opening curly brace, return it.
    /// Otherwise, report an error, insert an opening and a closing
    /// curly brace, and return the newly inserted opening curly brace.
    Token ensureBlock(Token token) {
      Token next = token.next;
      if (optional('{', next)) return next;
      reportRecoverableError(
          next, fasta.templateExpectedButGot.withArguments('{'));
      Token replacement = link(
          new SyntheticBeginToken(TokenType.OPEN_CURLY_BRACKET, next.offset),
          new SyntheticToken(TokenType.CLOSE_CURLY_BRACKET, next.offset));
  
negative.code:     Token begin = next;
      int statementCount = 0;
      if (!optional('{', next)) {
        token = ensureBlock(token, fasta.templateExpectedFunctionBody);
        listener.handleInvalidFunctionBody(token);
        return token.endGroup;
      }
  