  3276→function parseAwaitExpressionOrIdentifier(
  3277→  parser: Parser,
  3278→  context: Context,
  3279→  privateScope: PrivateScope | undefined,
  3280→  inNew: 0 | 1,
  3281→  inGroup: 0 | 1,
  3282→  start: Location,
  3283→): ESTree.IdentifierOrExpression | ESTree.AwaitExpression {
  3284→  if (inGroup) parser.destructible |= DestructuringKind.Await;
  3285→  if (context & Context.InStaticBlock) parser.report(Errors.InvalidAwaitInStaticBlock);
  3286→
  3287→  // Peek next Token first;
  3288→  const possibleIdentifierOrArrowFunc = parseIdentifierOrArrow(parser, context, privateScope);
  3289→
  3290→  // If got an arrow function, or token after "await" is not an expression.
  3291→  const isIdentifier =
  3292→    possibleIdentifierOrArrowFunc.type === 'ArrowFunctionExpression' ||
  3293→    (parser.getToken() & Token.IsExpressionStart) === 0;
  3294→
  3295→  if (isIdentifier) {
  3296→    if (context & Context.InAwaitContext)
  3297→      throw new ParseError(
  3298→        start,
  3299→        { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3300→        Errors.InvalidAwaitAsIdentifier,
  3301→      );
  3302→    if (context & Context.Module)
  3303→      throw new ParseError(
  3304→        start,
  3305→        { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3306→        Errors.AwaitIdentInModuleOrAsyncFunc,
  3307→      );
  3308→
  3309→    if (context & Context.InArgumentList && context & Context.InAwaitContext)
  3310→      throw new ParseError(
  3311→        start,
  3312→        { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3313→        Errors.AwaitIdentInModuleOrAsyncFunc,
  3314→      );
  3315→    // "await" can be identifier out of async func.
  3316→    return possibleIdentifierOrArrowFunc;
  3317→  }
  3318→
  3319→  // "await" is start of await expression.
  3320→  if (context & Context.InArgumentList) {
  3321→    throw new ParseError(
  3322→      start,
  3323→      { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3324→      Errors.AwaitInParameter,
  3325→    );
  3326→  }
  3327→
  3328→  // await expression is only allowed in async func or at module top level.
  3329→  if (context & Context.InAwaitContext || (context & Context.Module && context & Context.InGlobal)) {
  3330→    if (inNew)
  3331→      throw new ParseError(
  3332→        start,
  3333→        { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3334→        Errors.Unexpected,
  3335→      );
  3336→
  3337→    const argument = parseLeftHandSideExpression(parser, context, privateScope, 0, 0, 1);
  3338→
  3339→    if (parser.getToken() === Token.Exponentiation) parser.report(Errors.InvalidExponentiationLHS);
  3340→
  3341→    parser.assignable = AssignmentKind.CannotAssign;
  3342→
  3343→    return parser.finishNode<ESTree.AwaitExpression>(
  3344→      {
  3345→        type: 'AwaitExpression',
  3346→        argument,
  3347→      },
  3348→      start,
  3349→    );
  3350→  }
  3351→
  3352→  if (context & Context.Module)
  3353→    throw new ParseError(
  3354→      start,
  3355→      { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
  3356→      Errors.AwaitOutsideAsync,
  3357→    );
  3358→  // Fallback to identifier in script mode
  3359→  return possibleIdentifierOrArrowFunc;
  3360→}
  3361→
  3362→/**
  3363→ * Parses function body
  3364→ *
  3365→ * @param parser  Parser object
  3366→ * @param context Context masks
  3367→ * @param scope Scope object | null
  3368→ * @param origin Binding origin
  3369→ * @param funcNameToken
  3370→ * @param functionScope
  3371→ */
  3372→function parseFunctionBody(
  3373→  parser: Parser,
  3374→  context: Context,
  3375→  scope: Scope | undefined,
  3376→  privateScope: PrivateScope | undefined,
  3377→  origin: Origin,
  3378→  funcNameToken: Token | undefined,
  3379→  functionScope: Scope | undefined,
  3380→): ESTree.BlockStatement {
  3381→  const { tokenStart } = parser;
  3382→
  3383→  consume(parser, context | Context.AllowRegExp, Token.LeftBrace);
  3384→
  3385→  const body: ESTree.Statement[] = [];
  3386→
  3387→  if (parser.getToken() !== Token.RightBrace) {
  3388→    while (parser.getToken() === Token.StringLiteral) {
  3389→      const { index, tokenStart, tokenIndex, tokenValue } = parser;
  3390→      const token = parser.getToken();
  3391→      const expr = parseLiteral<ESTree.StringLiteral>(parser, context);
  3392→      if (isValidStrictMode(parser, index, tokenIndex, tokenValue)) {
  3393→        context |= Context.Strict;
  3394→        // TC39 deemed "use strict" directives to be an error when occurring
  3395→        // in the body of a function with non-simple parameter list, on
  3396→        // 29/7/2015. https://goo.gl/ueA7Ln
  3397→        if (parser.flags & Flags.NonSimpleParameterList) {
  3398→          throw new ParseError(tokenStart, parser.currentLocation, Errors.IllegalUseStrict);
  3399→        }
  3400→
  3401→        if (parser.flags & Flags.Octal) {
  3402→          throw new ParseError(tokenStart, parser.currentLocation, Errors.StrictOctalLiteral);
  3403→        }
  3404→
  3405→        if (parser.flags & Flags.EightAndNine) {

[5508 more lines in file. Use offset=3406 to continue.]