anchor.diff:    ///   'library' qualified ';'
     /// ;
     /// ```
  -  Token parseLibraryName(Token token) {
  -    Token libraryKeyword = token.next;
  +  Token parseLibraryName(Token libraryKeyword) {
       assert(optional('library', libraryKeyword));
       listener.beginLibraryName(libraryKeyword);
  -    token = parseQualified(libraryKeyword, IdentifierContext.libraryName,
  +    Token token = parseQualified(libraryKeyword, IdentifierContext.libraryName,
           IdentifierContext.libraryNameContinuation);
       token = ensureSemicolon(token);
       listener.endLibraryName(libraryKeyword, token);
  
positive.code:     token = parseMetadataStar(token);
      Token next = token.next;
      if (next.isTopLevelKeyword) {
        return parseTopLevelKeywordDeclaration(token, null, directiveState);
      }
      Token start = token;
      // Skip modifiers to find a top level keyword or identifier
  
negative.code:   }
  
    Token parseClassOrNamedMixinApplication(
        Token abstractToken, Token classKeyword) {
      assert(optional('class', classKeyword));
      Token begin = abstractToken ?? classKeyword;
      listener.beginClassOrNamedMixinApplication(begin);
      Token name = ensureIdentifier(
          classKeyword, IdentifierContext.classOrNamedMixinDeclaration);
      Token token = computeTypeParamOrArg(name, true).parseVariables(name, this);
      if (optional('=', token.next)) {
        listener.beginNamedMixinApplication(begin, abstractToken, name);
        return parseNamedMixinApplication(token, begin, classKeyword);
  