anchor.diff:    ///   'part' 'of' (qualified | uri) ';'
     /// ;
     /// ```
  -  Token parsePartOf(Token token) {
  -    Token partKeyword = token.next;
  +  Token parsePartOf(Token partKeyword) {
       Token ofKeyword = partKeyword.next;
       assert(optional('part', partKeyword));
       assert(optional('of', ofKeyword));
       listener.beginPartOf(partKeyword);
       bool hasName = ofKeyword.next.isIdentifier;
  +    Token token;
       if (hasName) {
         token = parseQualified(ofKeyword, IdentifierContext.partName,
             IdentifierContext.partNameContinuation);
  
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:     }
      next = token.next;
      if (next.isTopLevelKeyword) {
        return parseTopLevelKeywordDeclaration(start, next, directiveState);
      } else if (next.isKeywordOrIdentifier) {
        // TODO(danrubel): improve parseTopLevelMember
        // so that we don't parse modifiers twice.
  