15:  scanNewLine,
175:  parser.flags = (parser.flags | Flags.NewLine) ^ Flags.NewLine;
246:          state |= LexerState.NewLine | LexerState.LastIsCR;
247:          scanNewLine(parser);
252:          state = (state & ~LexerState.LastIsCR) | LexerState.NewLine;
381:            if ((state & LexerState.NewLine || isStartOfLine) && parser.currentChar === Chars.GreaterThan) {
559:        state = (state & ~LexerState.LastIsCR) | LexerState.NewLine;
560:        scanNewLine(parser);
---
        case Token.Template:
          return scanTemplate(parser, context);

        // Look for a escaped identifier
        case Token.EscapeStart:
          return scanUnicodeIdentifier(parser, context);

        // `#` (private name)
        case Token.PrivateField:
          return scanPrivateIdentifier(parser);

        case Token.WhiteSpace:
          advanceChar(parser);
          break;

        case Token.CarriageReturn:
          state |= LexerState.NewLine | LexerState.LastIsCR;
          scanNewLine(parser);
          break;

        case Token.LineFeed:
          consumeLineFeed(parser, state);
          state = (state & ~LexerState.LastIsCR) | LexerState.NewLine;
          break;

        // `<`, `<=`, `<<`, `<<=`, `<!--`
        case Token.LessThan: {
          const ch = advanceChar(parser);
          if (parser.index < parser.end) {
            if (ch === Chars.LessThan) {
              if (parser.index < parser.end && advanceChar(parser) === Chars.EqualSign) {
                advanceChar(parser);
                return Token.ShiftLeftAssign;
              }
              return Token.ShiftLeft;
            } else if (ch === Chars.EqualSign) {
              advanceChar(parser);
              return Token.LessThanOrEqual;
            }
            if (ch === Chars.Exclamation) {
              // Treat HTML begin-comment as comment-till-end-of-line.
