anchor.diff:    ///   expression? ';'
     /// ;
     /// ```
  +  ///
  +  /// Note: This method can fail to make progress. If there is neither an
  +  /// expression nor a semi-colon, then a synthetic identifier and synthetic
  +  /// semicolon will be inserted before [token] and the semicolon will be
  +  /// returned.
     Token parseExpressionStatement(Token token) {
       // TODO(brianwilkerson) Accept the last consumed token.
       // TODO(brianwilkerson): If the next token is not the start of a valid
  
positive.code: 
      listener.beginFactoryMethod(factoryKeyword);
      token = parseConstructorReference(token);
      token = parseFormalParametersRequiredOpt(token, MemberKind.Factory).next;
      Token asyncToken = token;
      token = parseAsyncModifier(token);
      if (!inPlainSync) {
        reportRecoverableError(asyncToken, fasta.messageFactoryNotSync);
      }
  
negative.code:       } else {
          token = ensureIdentifier(begin, context);
          token = parseQualifiedRestOpt(
              token, IdentifierContext.typeReferenceContinuation);
          assert(typeArguments == null || typeArguments == token.next);
          token = parseTypeArgumentsOpt(token.next);
          listener.handleType(begin, token);
        }
  
  