function parseAwaitExpressionOrIdentifier(
  parser: Parser,
  context: Context,
  privateScope: PrivateScope | undefined,
  inNew: 0 | 1,
  inGroup: 0 | 1,
  start: Location,
): ESTree.IdentifierOrExpression | ESTree.AwaitExpression {
  if (inGroup) parser.destructible |= DestructuringKind.Await;
  if (context & Context.InStaticBlock) parser.report(Errors.InvalidAwaitInStaticBlock);

  // Peek next Token first;
  const possibleIdentifierOrArrowFunc = parseIdentifierOrArrow(parser, context, privateScope);

  return parseAwaitExpressionRest(parser, context, privateScope, inNew, start, possibleIdentifierOrArrowFunc);
}
function parseAwaitExpressionRest(
  parser: Parser,
  context: Context,
  privateScope: PrivateScope | undefined,
  inNew: 0 | 1,
  start: Location,
  possibleIdentifierOrArrowFunc: ESTree.Identifier | ESTree.ArrowFunctionExpression,
): ESTree.IdentifierOrExpression | ESTree.AwaitExpression {
  // If got an arrow function, or token after "await" is not an expression.
  const isIdentifier =
    possibleIdentifierOrArrowFunc.type === 'ArrowFunctionExpression' ||
    (parser.getToken() & Token.IsExpressionStart) === 0;

  if (isIdentifier) {
    if (context & Context.InAwaitContext)
      throw new ParseError(
        start,
        { index: parser.startIndex, line: parser.startLine, column: parser.startColumn },
        Errors.InvalidAwaitAsIdentifier,
      );
