anchor.diff:            if (optional(';', token)) {
               reportRecoverableError(token, fasta.messageExpectedOpenParens);
             }
  +          previous = token;
             token = expect("(", token);
           }
           if (token is BeginToken) {
             Token closeBrace = closeBraceTokenFor(token);
             if (closeBrace == null) {
  -            token = reportUnmatchedToken(token).next;
  +            previous = reportUnmatchedToken(token);
  +            token = previous.next;
             } else {
  -            token = closeBrace.next;
  +            previous = closeBrace;
  +            token = previous.next;
             }
           }
         }
  
positive.code:     token = token.next;
      listener.beginTopLevelMember(token);
  
      Link<Token> identifiers = findMemberName(token);
      if (identifiers.isEmpty) {
        return reportUnrecoverableErrorWithToken(
            token, fasta.templateExpectedDeclaration);
      }
      Token afterName = identifiers.head;
      identifiers = identifiers.tail;
  
      if (identifiers.isEmpty) {
        return reportUnrecoverableErrorWithToken(
            token, fasta.templateExpectedDeclaration);
      }
      Token name = identifiers.head;
      identifiers = identifiers.tail;
      Token getOrSet;
      if (!identifiers.isEmpty) {
        String value = identifiers.head.stringValue;
        if ((identical(value, 'get')) || (identical(value, 'set'))) {
          getOrSet = identifiers.head;
          identifiers = identifiers.tail;
        }
      }
      Token type;
      if (!identifiers.isEmpty) {
        if (isValidTypeReference(identifiers.head)) {
          type = identifiers.head;
          identifiers = identifiers.tail;
        }
      }
  
negative.code:           optional("{", token) ||
            optional("=>", token)) {
          // A method.
          identifiers = identifiers.prepend(previous);
          return identifiers;
        } else if (optional("=", token) ||
            optional(";", token) ||
            optional(",", token)) {
          // A field or abstract getter.
          identifiers = identifiers.prepend(previous);
          return identifiers;
        } else if (optional('native', token) &&
            (token.next.kind == STRING_TOKEN || optional(';', token.next))) {
          // Skip.
          previous = token;
          token = token.next;
          if (token.kind == STRING_TOKEN) {
            previous = token;
            token = token.next;
          }
          continue;
  