anchor.diff:        token = parseImportPrefixOpt(token, true);
         if (previous != token && optional('deferred', previous)) {
           if (firstDeferredKeyword != null) {
  -          reportRecoverableError(
  -              firstDeferredKeyword, fasta.messageDuplicateDeferred);
  +          reportRecoverableError(previous, fasta.messageDuplicateDeferred);
           } else {
             if (hasPrefix) {
  -            reportRecoverableError(token, fasta.messageDeferredAfterPrefix);
  +            reportRecoverableError(previous, fasta.messageDeferredAfterPrefix);
             }
             firstDeferredKeyword = previous;
           }
  
positive.code:       final String value = token.stringValue;
        if (identical(value, 'deferred')) {
          firstDeferredKeyword ??= token;
        }
        if (identical(value, 'as')) {
          hasPrefix = true;
        }
        if (identical(value, 'show') || identical(value, 'hide')) {
          hasCombinator = true;
          if (hasPrefix) {
            token = recoveryStart;
  
negative.code:     if (firstToken == null) return reportUnrecoverableError(token, message);
      reportRecoverableError(token, message);
      return rewriter.insertTokenBefore(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);
            token = token.next;
          }
        }
      }
      return token;
    }
  
    Token parseLiteralStringOrRecoverExpression(Token token) {
  