anchor.diff:        Token start = token.next;
   
         // Check for extraneous token in the middle of an import statement.
  -      // TODO(brianwilkerson) Remove the invocation of `previous` when
  -      // `skipUnexpectedTokenOpt` returns the last consumed token.
  -      token = skipUnexpectedTokenOpt(start,
  -          const <String>['if', 'deferred', 'as', 'hide', 'show', ';']).previous;
  +      token = skipUnexpectedTokenOpt(
  +          token, const <String>['if', 'deferred', 'as', 'hide', 'show', ';']);
   
         // During recovery, clauses are parsed in the same order
         // and generate the same events as in the parseImport method above.
  
positive.code:     return rewriter.insertToken(newToken, token);
    }
  
    /// Report the given token as unexpected and return the next token
    /// if the next token is one of the [expectedNext],
    /// otherwise just return the given token.
    Token skipUnexpectedTokenOpt(Token token, List<String> expectedNext) {
      if (token.keyword == null) {
        final String nextValue = token.next.stringValue;
        for (String expectedValue in expectedNext) {
          if (identical(nextValue, expectedValue)) {
            reportRecoverableErrorWithToken(token, fasta.templateUnexpectedToken);
            return token.next;
          }
        }
      }
  
negative.code:     Token equals = token = token.next;
      assert(optional('=', equals));
      token = parseType(token.next);
      token = parseMixinApplicationRest(token).next;
      Token implementsKeyword = null;
      if (optional('implements', token)) {
        implementsKeyword = token;
  