  8210→  );
  8211→}
  8212→
  8213→/**
  8214→ * Parses binding pattern
  8215→ *
  8216→ * @param parser Parser object
  8217→ * @param context Context masks
  8218→ * @param type Binding kind
  8219→ */
  8220→function parseBindingPattern(
  8221→  parser: Parser,
  8222→  context: Context,
  8223→  scope: Scope | undefined,
  8224→  privateScope: PrivateScope | undefined,
  8225→  type: BindingKind,
  8226→  origin: Origin,
  8227→): ESTree.BindingPattern {
  8228→  // Pattern ::
  8229→  //   Identifier
  8230→  //   ArrayLiteral
  8231→  //   ObjectLiteral
  8232→
  8233→  if (
  8234→    parser.getToken() & Token.IsIdentifier ||
  8235→    ((context & Context.Strict) === 0 && parser.getToken() === Token.EscapedFutureReserved)
  8236→  )
  8237→    return parseAndClassifyIdentifier(parser, context, scope, type, origin);
  8238→
  8239→  if ((parser.getToken() & Token.IsPatternStart) !== Token.IsPatternStart)
  8240→    parser.report(Errors.UnexpectedToken, KeywordDescTable[parser.getToken() & Token.Type]);
  8241→
  8242→  const left: any =
  8243→    parser.getToken() === Token.LeftBracket
  8244→      ? parseArrayExpressionOrPattern(parser, context, scope, privateScope, 1, 0, 1, type, origin)
  8245→      : parseObjectLiteralOrPattern(parser, context, scope, privateScope, 1, 0, 1, type, origin);
  8246→
  8247→  if (parser.destructible & DestructuringKind.CannotDestruct) parser.report(Errors.InvalidBindingDestruct);
  8248→
  8249→  if (parser.destructible & DestructuringKind.Assignable) parser.report(Errors.InvalidBindingDestruct);
  8250→
  8251→  return left;
  8252→}
  8253→
  8254→/**
  8255→ * Classify and parse identifier if of valid type
  8256→ *
  8257→ * @param parser Parser object
  8258→ * @param context  Context masks
  8259→ * @param type Binding kind
  8260→ */
  8261→function parseAndClassifyIdentifier(
  8262→  parser: Parser,
  8263→  context: Context,
  8264→  scope: Scope | undefined,
  8265→  kind: BindingKind,
  8266→  origin: Origin,
  8267→): ESTree.Identifier {
  8268→  const token = parser.getToken();
  8269→
  8270→  if (context & Context.Strict) {
  8271→    if ((token & Token.IsEvalOrArguments) === Token.IsEvalOrArguments) {
  8272→      parser.report(Errors.StrictEvalArguments);
  8273→    } else if ((token & Token.FutureReserved) === Token.FutureReserved || token === Token.EscapedFutureReserved) {
  8274→      parser.report(Errors.UnexpectedStrictReserved);
  8275→    }
  8276→  }
  8277→
  8278→  if ((token & Token.Reserved) === Token.Reserved) {
  8279→    parser.report(Errors.KeywordNotId);
  8280→  }
  8281→
  8282→  if (token === Token.YieldKeyword) {
  8283→    if (context & Context.InYieldContext) parser.report(Errors.YieldInParameter);
  8284→    if (context & Context.Module) parser.report(Errors.YieldIdentInModule);
  8285→  }
  8286→
  8287→  if ((token & Token.Type) === (Token.LetKeyword & Token.Type)) {
  8288→    if (kind & (BindingKind.Let | BindingKind.Const)) parser.report(Errors.InvalidLetConstBinding);
  8289→  }
  8290→  if (token === Token.AwaitKeyword) {
  8291→    if (context & Context.InAwaitContext) parser.report(Errors.InvalidAwaitAsIdentifier);
  8292→    if (context & Context.Module) parser.report(Errors.AwaitIdentInModuleOrAsyncFunc);
  8293→  }
  8294→
  8295→  const { tokenValue, tokenStart: start } = parser;
  8296→  nextToken(parser, context);
  8297→
  8298→  scope?.addVarOrBlock(context, tokenValue, kind, origin);
  8299→
  8300→  return parser.finishNode<ESTree.Identifier>(
  8301→    {
  8302→      type: 'Identifier',
  8303→      name: tokenValue,
  8304→    },
  8305→    start,
  8306→  );
  8307→}
  8308→
  8309→/**
  8310→ * Parses either a JSX element or JSX Fragment
  8311→ *
  8312→ * @param parser Parser object
  8313→ * @param context  Context masks
  8314→ * @param inJSXChild
  8315→ */
  8316→
  8317→function parseJSXRootElementOrFragment(
  8318→  parser: Parser,
  8319→  context: Context,
  8320→  privateScope: PrivateScope | undefined,
  8321→  inJSXChild: 0 | 1,
  8322→  start: Location,
  8323→): ESTree.JSXElement | ESTree.JSXFragment {
  8324→  // "<" is pre-consumed in parseJSXChildren
  8325→  if (!inJSXChild) consume(parser, context, Token.LessThan);
  8326→
  8327→  // JSX fragments
  8328→  if (parser.getToken() === Token.GreaterThan) {
  8329→    const openingFragment = parseJSXOpeningFragment(parser, start);
  8330→    const [children, closingFragment] = parseJSXChildrenAndClosingFragment(parser, context, privateScope, inJSXChild);
  8331→
  8332→    return parser.finishNode<ESTree.JSXFragment>(
  8333→      {
  8334→        type: 'JSXFragment',
  8335→        openingFragment,
  8336→        children,
  8337→        closingFragment,
  8338→      },
  8339→      start,

[574 more lines in file. Use offset=8340 to continue.]