1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = exports.Token = void 0;
- var _location = require("../util/location");
- var _comments = require("../parser/comments");
- var _identifier = require("../util/identifier");
- var _types = require("./types");
- var _parseError = require("../parse-error");
- var _whitespace = require("../util/whitespace");
- var _state = require("./state");
- var _helperStringParser = require("@babel/helper-string-parser");
- const _excluded = ["at"],
- _excluded2 = ["at"];
- function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
- function buildPosition(pos, lineStart, curLine) {
- return new _location.Position(curLine, pos - lineStart, pos);
- }
- const VALID_REGEX_FLAGS = new Set([103, 109, 115, 105, 121, 117, 100, 118]);
- class Token {
- constructor(state) {
- this.type = state.type;
- this.value = state.value;
- this.start = state.start;
- this.end = state.end;
- this.loc = new _location.SourceLocation(state.startLoc, state.endLoc);
- }
- }
- exports.Token = Token;
- class Tokenizer extends _comments.default {
- constructor(options, input) {
- super();
- this.isLookahead = void 0;
- this.tokens = [];
- this.errorHandlers_readInt = {
- invalidDigit: (pos, lineStart, curLine, radix) => {
- if (!this.options.errorRecovery) return false;
- this.raise(_parseError.Errors.InvalidDigit, {
- at: buildPosition(pos, lineStart, curLine),
- radix
- });
- return true;
- },
- numericSeparatorInEscapeSequence: this.errorBuilder(_parseError.Errors.NumericSeparatorInEscapeSequence),
- unexpectedNumericSeparator: this.errorBuilder(_parseError.Errors.UnexpectedNumericSeparator)
- };
- this.errorHandlers_readCodePoint = Object.assign({}, this.errorHandlers_readInt, {
- invalidEscapeSequence: this.errorBuilder(_parseError.Errors.InvalidEscapeSequence),
- invalidCodePoint: this.errorBuilder(_parseError.Errors.InvalidCodePoint)
- });
- this.errorHandlers_readStringContents_string = Object.assign({}, this.errorHandlers_readCodePoint, {
- strictNumericEscape: (pos, lineStart, curLine) => {
- this.recordStrictModeErrors(_parseError.Errors.StrictNumericEscape, {
- at: buildPosition(pos, lineStart, curLine)
- });
- },
- unterminated: (pos, lineStart, curLine) => {
- throw this.raise(_parseError.Errors.UnterminatedString, {
- at: buildPosition(pos - 1, lineStart, curLine)
- });
- }
- });
- this.errorHandlers_readStringContents_template = Object.assign({}, this.errorHandlers_readCodePoint, {
- strictNumericEscape: this.errorBuilder(_parseError.Errors.StrictNumericEscape),
- unterminated: (pos, lineStart, curLine) => {
- throw this.raise(_parseError.Errors.UnterminatedTemplate, {
- at: buildPosition(pos, lineStart, curLine)
- });
- }
- });
- this.state = new _state.default();
- this.state.init(options);
- this.input = input;
- this.length = input.length;
- this.isLookahead = false;
- }
- pushToken(token) {
- this.tokens.length = this.state.tokensLength;
- this.tokens.push(token);
- ++this.state.tokensLength;
- }
- next() {
- this.checkKeywordEscapes();
- if (this.options.tokens) {
- this.pushToken(new Token(this.state));
- }
- this.state.lastTokStart = this.state.start;
- this.state.lastTokEndLoc = this.state.endLoc;
- this.state.lastTokStartLoc = this.state.startLoc;
- this.nextToken();
- }
- eat(type) {
- if (this.match(type)) {
- this.next();
- return true;
- } else {
- return false;
- }
- }
- match(type) {
- return this.state.type === type;
- }
- createLookaheadState(state) {
- return {
- pos: state.pos,
- value: null,
- type: state.type,
- start: state.start,
- end: state.end,
- context: [this.curContext()],
- inType: state.inType,
- startLoc: state.startLoc,
- lastTokEndLoc: state.lastTokEndLoc,
- curLine: state.curLine,
- lineStart: state.lineStart,
- curPosition: state.curPosition
- };
- }
- lookahead() {
- const old = this.state;
- this.state = this.createLookaheadState(old);
- this.isLookahead = true;
- this.nextToken();
- this.isLookahead = false;
- const curr = this.state;
- this.state = old;
- return curr;
- }
- nextTokenStart() {
- return this.nextTokenStartSince(this.state.pos);
- }
- nextTokenStartSince(pos) {
- _whitespace.skipWhiteSpace.lastIndex = pos;
- return _whitespace.skipWhiteSpace.test(this.input) ? _whitespace.skipWhiteSpace.lastIndex : pos;
- }
- lookaheadCharCode() {
- return this.input.charCodeAt(this.nextTokenStart());
- }
- nextTokenInLineStart() {
- return this.nextTokenInLineStartSince(this.state.pos);
- }
- nextTokenInLineStartSince(pos) {
- _whitespace.skipWhiteSpaceInLine.lastIndex = pos;
- return _whitespace.skipWhiteSpaceInLine.test(this.input) ? _whitespace.skipWhiteSpaceInLine.lastIndex : pos;
- }
- lookaheadInLineCharCode() {
- return this.input.charCodeAt(this.nextTokenInLineStart());
- }
- codePointAtPos(pos) {
- let cp = this.input.charCodeAt(pos);
- if ((cp & 0xfc00) === 0xd800 && ++pos < this.input.length) {
- const trail = this.input.charCodeAt(pos);
- if ((trail & 0xfc00) === 0xdc00) {
- cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);
- }
- }
- return cp;
- }
- setStrict(strict) {
- this.state.strict = strict;
- if (strict) {
- this.state.strictErrors.forEach(([toParseError, at]) => this.raise(toParseError, {
- at
- }));
- this.state.strictErrors.clear();
- }
- }
- curContext() {
- return this.state.context[this.state.context.length - 1];
- }
- nextToken() {
- this.skipSpace();
- this.state.start = this.state.pos;
- if (!this.isLookahead) this.state.startLoc = this.state.curPosition();
- if (this.state.pos >= this.length) {
- this.finishToken(137);
- return;
- }
- this.getTokenFromCode(this.codePointAtPos(this.state.pos));
- }
- skipBlockComment(commentEnd) {
- let startLoc;
- if (!this.isLookahead) startLoc = this.state.curPosition();
- const start = this.state.pos;
- const end = this.input.indexOf(commentEnd, start + 2);
- if (end === -1) {
- throw this.raise(_parseError.Errors.UnterminatedComment, {
- at: this.state.curPosition()
- });
- }
- this.state.pos = end + commentEnd.length;
- _whitespace.lineBreakG.lastIndex = start + 2;
- while (_whitespace.lineBreakG.test(this.input) && _whitespace.lineBreakG.lastIndex <= end) {
- ++this.state.curLine;
- this.state.lineStart = _whitespace.lineBreakG.lastIndex;
- }
- if (this.isLookahead) return;
- const comment = {
- type: "CommentBlock",
- value: this.input.slice(start + 2, end),
- start,
- end: end + commentEnd.length,
- loc: new _location.SourceLocation(startLoc, this.state.curPosition())
- };
- if (this.options.tokens) this.pushToken(comment);
- return comment;
- }
- skipLineComment(startSkip) {
- const start = this.state.pos;
- let startLoc;
- if (!this.isLookahead) startLoc = this.state.curPosition();
- let ch = this.input.charCodeAt(this.state.pos += startSkip);
- if (this.state.pos < this.length) {
- while (!(0, _whitespace.isNewLine)(ch) && ++this.state.pos < this.length) {
- ch = this.input.charCodeAt(this.state.pos);
- }
- }
- if (this.isLookahead) return;
- const end = this.state.pos;
- const value = this.input.slice(start + startSkip, end);
- const comment = {
- type: "CommentLine",
- value,
- start,
- end,
- loc: new _location.SourceLocation(startLoc, this.state.curPosition())
- };
- if (this.options.tokens) this.pushToken(comment);
- return comment;
- }
- skipSpace() {
- const spaceStart = this.state.pos;
- const comments = [];
- loop: while (this.state.pos < this.length) {
- const ch = this.input.charCodeAt(this.state.pos);
- switch (ch) {
- case 32:
- case 160:
- case 9:
- ++this.state.pos;
- break;
- case 13:
- if (this.input.charCodeAt(this.state.pos + 1) === 10) {
- ++this.state.pos;
- }
- case 10:
- case 8232:
- case 8233:
- ++this.state.pos;
- ++this.state.curLine;
- this.state.lineStart = this.state.pos;
- break;
- case 47:
- switch (this.input.charCodeAt(this.state.pos + 1)) {
- case 42:
- {
- const comment = this.skipBlockComment("*/");
- if (comment !== undefined) {
- this.addComment(comment);
- if (this.options.attachComment) comments.push(comment);
- }
- break;
- }
- case 47:
- {
- const comment = this.skipLineComment(2);
- if (comment !== undefined) {
- this.addComment(comment);
- if (this.options.attachComment) comments.push(comment);
- }
- break;
- }
- default:
- break loop;
- }
- break;
- default:
- if ((0, _whitespace.isWhitespace)(ch)) {
- ++this.state.pos;
- } else if (ch === 45 && !this.inModule && this.options.annexB) {
- const pos = this.state.pos;
- if (this.input.charCodeAt(pos + 1) === 45 && this.input.charCodeAt(pos + 2) === 62 && (spaceStart === 0 || this.state.lineStart > spaceStart)) {
- const comment = this.skipLineComment(3);
- if (comment !== undefined) {
- this.addComment(comment);
- if (this.options.attachComment) comments.push(comment);
- }
- } else {
- break loop;
- }
- } else if (ch === 60 && !this.inModule && this.options.annexB) {
- const pos = this.state.pos;
- if (this.input.charCodeAt(pos + 1) === 33 && this.input.charCodeAt(pos + 2) === 45 && this.input.charCodeAt(pos + 3) === 45) {
- const comment = this.skipLineComment(4);
- if (comment !== undefined) {
- this.addComment(comment);
- if (this.options.attachComment) comments.push(comment);
- }
- } else {
- break loop;
- }
- } else {
- break loop;
- }
- }
- }
- if (comments.length > 0) {
- const end = this.state.pos;
- const commentWhitespace = {
- start: spaceStart,
- end,
- comments,
- leadingNode: null,
- trailingNode: null,
- containingNode: null
- };
- this.state.commentStack.push(commentWhitespace);
- }
- }
- finishToken(type, val) {
- this.state.end = this.state.pos;
- this.state.endLoc = this.state.curPosition();
- const prevType = this.state.type;
- this.state.type = type;
- this.state.value = val;
- if (!this.isLookahead) {
- this.updateContext(prevType);
- }
- }
- replaceToken(type) {
- this.state.type = type;
- this.updateContext();
- }
- readToken_numberSign() {
- if (this.state.pos === 0 && this.readToken_interpreter()) {
- return;
- }
- const nextPos = this.state.pos + 1;
- const next = this.codePointAtPos(nextPos);
- if (next >= 48 && next <= 57) {
- throw this.raise(_parseError.Errors.UnexpectedDigitAfterHash, {
- at: this.state.curPosition()
- });
- }
- if (next === 123 || next === 91 && this.hasPlugin("recordAndTuple")) {
- this.expectPlugin("recordAndTuple");
- if (this.getPluginOption("recordAndTuple", "syntaxType") === "bar") {
- throw this.raise(next === 123 ? _parseError.Errors.RecordExpressionHashIncorrectStartSyntaxType : _parseError.Errors.TupleExpressionHashIncorrectStartSyntaxType, {
- at: this.state.curPosition()
- });
- }
- this.state.pos += 2;
- if (next === 123) {
- this.finishToken(7);
- } else {
- this.finishToken(1);
- }
- } else if ((0, _identifier.isIdentifierStart)(next)) {
- ++this.state.pos;
- this.finishToken(136, this.readWord1(next));
- } else if (next === 92) {
- ++this.state.pos;
- this.finishToken(136, this.readWord1());
- } else {
- this.finishOp(27, 1);
- }
- }
- readToken_dot() {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next >= 48 && next <= 57) {
- this.readNumber(true);
- return;
- }
- if (next === 46 && this.input.charCodeAt(this.state.pos + 2) === 46) {
- this.state.pos += 3;
- this.finishToken(21);
- } else {
- ++this.state.pos;
- this.finishToken(16);
- }
- }
- readToken_slash() {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === 61) {
- this.finishOp(31, 2);
- } else {
- this.finishOp(56, 1);
- }
- }
- readToken_interpreter() {
- if (this.state.pos !== 0 || this.length < 2) return false;
- let ch = this.input.charCodeAt(this.state.pos + 1);
- if (ch !== 33) return false;
- const start = this.state.pos;
- this.state.pos += 1;
- while (!(0, _whitespace.isNewLine)(ch) && ++this.state.pos < this.length) {
- ch = this.input.charCodeAt(this.state.pos);
- }
- const value = this.input.slice(start + 2, this.state.pos);
- this.finishToken(28, value);
- return true;
- }
- readToken_mult_modulo(code) {
- let type = code === 42 ? 55 : 54;
- let width = 1;
- let next = this.input.charCodeAt(this.state.pos + 1);
- if (code === 42 && next === 42) {
- width++;
- next = this.input.charCodeAt(this.state.pos + 2);
- type = 57;
- }
- if (next === 61 && !this.state.inType) {
- width++;
- type = code === 37 ? 33 : 30;
- }
- this.finishOp(type, width);
- }
- readToken_pipe_amp(code) {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === code) {
- if (this.input.charCodeAt(this.state.pos + 2) === 61) {
- this.finishOp(30, 3);
- } else {
- this.finishOp(code === 124 ? 41 : 42, 2);
- }
- return;
- }
- if (code === 124) {
- if (next === 62) {
- this.finishOp(39, 2);
- return;
- }
- if (this.hasPlugin("recordAndTuple") && next === 125) {
- if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
- throw this.raise(_parseError.Errors.RecordExpressionBarIncorrectEndSyntaxType, {
- at: this.state.curPosition()
- });
- }
- this.state.pos += 2;
- this.finishToken(9);
- return;
- }
- if (this.hasPlugin("recordAndTuple") && next === 93) {
- if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
- throw this.raise(_parseError.Errors.TupleExpressionBarIncorrectEndSyntaxType, {
- at: this.state.curPosition()
- });
- }
- this.state.pos += 2;
- this.finishToken(4);
- return;
- }
- }
- if (next === 61) {
- this.finishOp(30, 2);
- return;
- }
- this.finishOp(code === 124 ? 43 : 45, 1);
- }
- readToken_caret() {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === 61 && !this.state.inType) {
- this.finishOp(32, 2);
- } else if (next === 94 && this.hasPlugin(["pipelineOperator", {
- proposal: "hack",
- topicToken: "^^"
- }])) {
- this.finishOp(37, 2);
- const lookaheadCh = this.input.codePointAt(this.state.pos);
- if (lookaheadCh === 94) {
- this.unexpected();
- }
- } else {
- this.finishOp(44, 1);
- }
- }
- readToken_atSign() {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === 64 && this.hasPlugin(["pipelineOperator", {
- proposal: "hack",
- topicToken: "@@"
- }])) {
- this.finishOp(38, 2);
- } else {
- this.finishOp(26, 1);
- }
- }
- readToken_plus_min(code) {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === code) {
- this.finishOp(34, 2);
- return;
- }
- if (next === 61) {
- this.finishOp(30, 2);
- } else {
- this.finishOp(53, 1);
- }
- }
- readToken_lt() {
- const {
- pos
- } = this.state;
- const next = this.input.charCodeAt(pos + 1);
- if (next === 60) {
- if (this.input.charCodeAt(pos + 2) === 61) {
- this.finishOp(30, 3);
- return;
- }
- this.finishOp(51, 2);
- return;
- }
- if (next === 61) {
- this.finishOp(49, 2);
- return;
- }
- this.finishOp(47, 1);
- }
- readToken_gt() {
- const {
- pos
- } = this.state;
- const next = this.input.charCodeAt(pos + 1);
- if (next === 62) {
- const size = this.input.charCodeAt(pos + 2) === 62 ? 3 : 2;
- if (this.input.charCodeAt(pos + size) === 61) {
- this.finishOp(30, size + 1);
- return;
- }
- this.finishOp(52, size);
- return;
- }
- if (next === 61) {
- this.finishOp(49, 2);
- return;
- }
- this.finishOp(48, 1);
- }
- readToken_eq_excl(code) {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === 61) {
- this.finishOp(46, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2);
- return;
- }
- if (code === 61 && next === 62) {
- this.state.pos += 2;
- this.finishToken(19);
- return;
- }
- this.finishOp(code === 61 ? 29 : 35, 1);
- }
- readToken_question() {
- const next = this.input.charCodeAt(this.state.pos + 1);
- const next2 = this.input.charCodeAt(this.state.pos + 2);
- if (next === 63) {
- if (next2 === 61) {
- this.finishOp(30, 3);
- } else {
- this.finishOp(40, 2);
- }
- } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) {
- this.state.pos += 2;
- this.finishToken(18);
- } else {
- ++this.state.pos;
- this.finishToken(17);
- }
- }
- getTokenFromCode(code) {
- switch (code) {
- case 46:
- this.readToken_dot();
- return;
- case 40:
- ++this.state.pos;
- this.finishToken(10);
- return;
- case 41:
- ++this.state.pos;
- this.finishToken(11);
- return;
- case 59:
- ++this.state.pos;
- this.finishToken(13);
- return;
- case 44:
- ++this.state.pos;
- this.finishToken(12);
- return;
- case 91:
- if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
- if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
- throw this.raise(_parseError.Errors.TupleExpressionBarIncorrectStartSyntaxType, {
- at: this.state.curPosition()
- });
- }
- this.state.pos += 2;
- this.finishToken(2);
- } else {
- ++this.state.pos;
- this.finishToken(0);
- }
- return;
- case 93:
- ++this.state.pos;
- this.finishToken(3);
- return;
- case 123:
- if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
- if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
- throw this.raise(_parseError.Errors.RecordExpressionBarIncorrectStartSyntaxType, {
- at: this.state.curPosition()
- });
- }
- this.state.pos += 2;
- this.finishToken(6);
- } else {
- ++this.state.pos;
- this.finishToken(5);
- }
- return;
- case 125:
- ++this.state.pos;
- this.finishToken(8);
- return;
- case 58:
- if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) {
- this.finishOp(15, 2);
- } else {
- ++this.state.pos;
- this.finishToken(14);
- }
- return;
- case 63:
- this.readToken_question();
- return;
- case 96:
- this.readTemplateToken();
- return;
- case 48:
- {
- const next = this.input.charCodeAt(this.state.pos + 1);
- if (next === 120 || next === 88) {
- this.readRadixNumber(16);
- return;
- }
- if (next === 111 || next === 79) {
- this.readRadixNumber(8);
- return;
- }
- if (next === 98 || next === 66) {
- this.readRadixNumber(2);
- return;
- }
- }
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- this.readNumber(false);
- return;
- case 34:
- case 39:
- this.readString(code);
- return;
- case 47:
- this.readToken_slash();
- return;
- case 37:
- case 42:
- this.readToken_mult_modulo(code);
- return;
- case 124:
- case 38:
- this.readToken_pipe_amp(code);
- return;
- case 94:
- this.readToken_caret();
- return;
- case 43:
- case 45:
- this.readToken_plus_min(code);
- return;
- case 60:
- this.readToken_lt();
- return;
- case 62:
- this.readToken_gt();
- return;
- case 61:
- case 33:
- this.readToken_eq_excl(code);
- return;
- case 126:
- this.finishOp(36, 1);
- return;
- case 64:
- this.readToken_atSign();
- return;
- case 35:
- this.readToken_numberSign();
- return;
- case 92:
- this.readWord();
- return;
- default:
- if ((0, _identifier.isIdentifierStart)(code)) {
- this.readWord(code);
- return;
- }
- }
- throw this.raise(_parseError.Errors.InvalidOrUnexpectedToken, {
- at: this.state.curPosition(),
- unexpected: String.fromCodePoint(code)
- });
- }
- finishOp(type, size) {
- const str = this.input.slice(this.state.pos, this.state.pos + size);
- this.state.pos += size;
- this.finishToken(type, str);
- }
- readRegexp() {
- const startLoc = this.state.startLoc;
- const start = this.state.start + 1;
- let escaped, inClass;
- let {
- pos
- } = this.state;
- for (;; ++pos) {
- if (pos >= this.length) {
- throw this.raise(_parseError.Errors.UnterminatedRegExp, {
- at: (0, _location.createPositionWithColumnOffset)(startLoc, 1)
- });
- }
- const ch = this.input.charCodeAt(pos);
- if ((0, _whitespace.isNewLine)(ch)) {
- throw this.raise(_parseError.Errors.UnterminatedRegExp, {
- at: (0, _location.createPositionWithColumnOffset)(startLoc, 1)
- });
- }
- if (escaped) {
- escaped = false;
- } else {
- if (ch === 91) {
- inClass = true;
- } else if (ch === 93 && inClass) {
- inClass = false;
- } else if (ch === 47 && !inClass) {
- break;
- }
- escaped = ch === 92;
- }
- }
- const content = this.input.slice(start, pos);
- ++pos;
- let mods = "";
- const nextPos = () => (0, _location.createPositionWithColumnOffset)(startLoc, pos + 2 - start);
- while (pos < this.length) {
- const cp = this.codePointAtPos(pos);
- const char = String.fromCharCode(cp);
- if (VALID_REGEX_FLAGS.has(cp)) {
- if (cp === 118) {
- if (mods.includes("u")) {
- this.raise(_parseError.Errors.IncompatibleRegExpUVFlags, {
- at: nextPos()
- });
- }
- } else if (cp === 117) {
- if (mods.includes("v")) {
- this.raise(_parseError.Errors.IncompatibleRegExpUVFlags, {
- at: nextPos()
- });
- }
- }
- if (mods.includes(char)) {
- this.raise(_parseError.Errors.DuplicateRegExpFlags, {
- at: nextPos()
- });
- }
- } else if ((0, _identifier.isIdentifierChar)(cp) || cp === 92) {
- this.raise(_parseError.Errors.MalformedRegExpFlags, {
- at: nextPos()
- });
- } else {
- break;
- }
- ++pos;
- mods += char;
- }
- this.state.pos = pos;
- this.finishToken(135, {
- pattern: content,
- flags: mods
- });
- }
- readInt(radix, len, forceLen = false, allowNumSeparator = true) {
- const {
- n,
- pos
- } = (0, _helperStringParser.readInt)(this.input, this.state.pos, this.state.lineStart, this.state.curLine, radix, len, forceLen, allowNumSeparator, this.errorHandlers_readInt, false);
- this.state.pos = pos;
- return n;
- }
- readRadixNumber(radix) {
- const startLoc = this.state.curPosition();
- let isBigInt = false;
- this.state.pos += 2;
- const val = this.readInt(radix);
- if (val == null) {
- this.raise(_parseError.Errors.InvalidDigit, {
- at: (0, _location.createPositionWithColumnOffset)(startLoc, 2),
- radix
- });
- }
- const next = this.input.charCodeAt(this.state.pos);
- if (next === 110) {
- ++this.state.pos;
- isBigInt = true;
- } else if (next === 109) {
- throw this.raise(_parseError.Errors.InvalidDecimal, {
- at: startLoc
- });
- }
- if ((0, _identifier.isIdentifierStart)(this.codePointAtPos(this.state.pos))) {
- throw this.raise(_parseError.Errors.NumberIdentifier, {
- at: this.state.curPosition()
- });
- }
- if (isBigInt) {
- const str = this.input.slice(startLoc.index, this.state.pos).replace(/[_n]/g, "");
- this.finishToken(133, str);
- return;
- }
- this.finishToken(132, val);
- }
- readNumber(startsWithDot) {
- const start = this.state.pos;
- const startLoc = this.state.curPosition();
- let isFloat = false;
- let isBigInt = false;
- let isDecimal = false;
- let hasExponent = false;
- let isOctal = false;
- if (!startsWithDot && this.readInt(10) === null) {
- this.raise(_parseError.Errors.InvalidNumber, {
- at: this.state.curPosition()
- });
- }
- const hasLeadingZero = this.state.pos - start >= 2 && this.input.charCodeAt(start) === 48;
- if (hasLeadingZero) {
- const integer = this.input.slice(start, this.state.pos);
- this.recordStrictModeErrors(_parseError.Errors.StrictOctalLiteral, {
- at: startLoc
- });
- if (!this.state.strict) {
- const underscorePos = integer.indexOf("_");
- if (underscorePos > 0) {
- this.raise(_parseError.Errors.ZeroDigitNumericSeparator, {
- at: (0, _location.createPositionWithColumnOffset)(startLoc, underscorePos)
- });
- }
- }
- isOctal = hasLeadingZero && !/[89]/.test(integer);
- }
- let next = this.input.charCodeAt(this.state.pos);
- if (next === 46 && !isOctal) {
- ++this.state.pos;
- this.readInt(10);
- isFloat = true;
- next = this.input.charCodeAt(this.state.pos);
- }
- if ((next === 69 || next === 101) && !isOctal) {
- next = this.input.charCodeAt(++this.state.pos);
- if (next === 43 || next === 45) {
- ++this.state.pos;
- }
- if (this.readInt(10) === null) {
- this.raise(_parseError.Errors.InvalidOrMissingExponent, {
- at: startLoc
- });
- }
- isFloat = true;
- hasExponent = true;
- next = this.input.charCodeAt(this.state.pos);
- }
- if (next === 110) {
- if (isFloat || hasLeadingZero) {
- this.raise(_parseError.Errors.InvalidBigIntLiteral, {
- at: startLoc
- });
- }
- ++this.state.pos;
- isBigInt = true;
- }
- if (next === 109) {
- this.expectPlugin("decimal", this.state.curPosition());
- if (hasExponent || hasLeadingZero) {
- this.raise(_parseError.Errors.InvalidDecimal, {
- at: startLoc
- });
- }
- ++this.state.pos;
- isDecimal = true;
- }
- if ((0, _identifier.isIdentifierStart)(this.codePointAtPos(this.state.pos))) {
- throw this.raise(_parseError.Errors.NumberIdentifier, {
- at: this.state.curPosition()
- });
- }
- const str = this.input.slice(start, this.state.pos).replace(/[_mn]/g, "");
- if (isBigInt) {
- this.finishToken(133, str);
- return;
- }
- if (isDecimal) {
- this.finishToken(134, str);
- return;
- }
- const val = isOctal ? parseInt(str, 8) : parseFloat(str);
- this.finishToken(132, val);
- }
- readCodePoint(throwOnInvalid) {
- const {
- code,
- pos
- } = (0, _helperStringParser.readCodePoint)(this.input, this.state.pos, this.state.lineStart, this.state.curLine, throwOnInvalid, this.errorHandlers_readCodePoint);
- this.state.pos = pos;
- return code;
- }
- readString(quote) {
- const {
- str,
- pos,
- curLine,
- lineStart
- } = (0, _helperStringParser.readStringContents)(quote === 34 ? "double" : "single", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_string);
- this.state.pos = pos + 1;
- this.state.lineStart = lineStart;
- this.state.curLine = curLine;
- this.finishToken(131, str);
- }
- readTemplateContinuation() {
- if (!this.match(8)) {
- this.unexpected(null, 8);
- }
- this.state.pos--;
- this.readTemplateToken();
- }
- readTemplateToken() {
- const opening = this.input[this.state.pos];
- const {
- str,
- firstInvalidLoc,
- pos,
- curLine,
- lineStart
- } = (0, _helperStringParser.readStringContents)("template", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_template);
- this.state.pos = pos + 1;
- this.state.lineStart = lineStart;
- this.state.curLine = curLine;
- if (firstInvalidLoc) {
- this.state.firstInvalidTemplateEscapePos = new _location.Position(firstInvalidLoc.curLine, firstInvalidLoc.pos - firstInvalidLoc.lineStart, firstInvalidLoc.pos);
- }
- if (this.input.codePointAt(pos) === 96) {
- this.finishToken(24, firstInvalidLoc ? null : opening + str + "`");
- } else {
- this.state.pos++;
- this.finishToken(25, firstInvalidLoc ? null : opening + str + "${");
- }
- }
- recordStrictModeErrors(toParseError, {
- at
- }) {
- const index = at.index;
- if (this.state.strict && !this.state.strictErrors.has(index)) {
- this.raise(toParseError, {
- at
- });
- } else {
- this.state.strictErrors.set(index, [toParseError, at]);
- }
- }
- readWord1(firstCode) {
- this.state.containsEsc = false;
- let word = "";
- const start = this.state.pos;
- let chunkStart = this.state.pos;
- if (firstCode !== undefined) {
- this.state.pos += firstCode <= 0xffff ? 1 : 2;
- }
- while (this.state.pos < this.length) {
- const ch = this.codePointAtPos(this.state.pos);
- if ((0, _identifier.isIdentifierChar)(ch)) {
- this.state.pos += ch <= 0xffff ? 1 : 2;
- } else if (ch === 92) {
- this.state.containsEsc = true;
- word += this.input.slice(chunkStart, this.state.pos);
- const escStart = this.state.curPosition();
- const identifierCheck = this.state.pos === start ? _identifier.isIdentifierStart : _identifier.isIdentifierChar;
- if (this.input.charCodeAt(++this.state.pos) !== 117) {
- this.raise(_parseError.Errors.MissingUnicodeEscape, {
- at: this.state.curPosition()
- });
- chunkStart = this.state.pos - 1;
- continue;
- }
- ++this.state.pos;
- const esc = this.readCodePoint(true);
- if (esc !== null) {
- if (!identifierCheck(esc)) {
- this.raise(_parseError.Errors.EscapedCharNotAnIdentifier, {
- at: escStart
- });
- }
- word += String.fromCodePoint(esc);
- }
- chunkStart = this.state.pos;
- } else {
- break;
- }
- }
- return word + this.input.slice(chunkStart, this.state.pos);
- }
- readWord(firstCode) {
- const word = this.readWord1(firstCode);
- const type = _types.keywords.get(word);
- if (type !== undefined) {
- this.finishToken(type, (0, _types.tokenLabelName)(type));
- } else {
- this.finishToken(130, word);
- }
- }
- checkKeywordEscapes() {
- const {
- type
- } = this.state;
- if ((0, _types.tokenIsKeyword)(type) && this.state.containsEsc) {
- this.raise(_parseError.Errors.InvalidEscapedReservedWord, {
- at: this.state.startLoc,
- reservedWord: (0, _types.tokenLabelName)(type)
- });
- }
- }
- raise(toParseError, raiseProperties) {
- const {
- at
- } = raiseProperties,
- details = _objectWithoutPropertiesLoose(raiseProperties, _excluded);
- const loc = at instanceof _location.Position ? at : at.loc.start;
- const error = toParseError({
- loc,
- details
- });
- if (!this.options.errorRecovery) throw error;
- if (!this.isLookahead) this.state.errors.push(error);
- return error;
- }
- raiseOverwrite(toParseError, raiseProperties) {
- const {
- at
- } = raiseProperties,
- details = _objectWithoutPropertiesLoose(raiseProperties, _excluded2);
- const loc = at instanceof _location.Position ? at : at.loc.start;
- const pos = loc.index;
- const errors = this.state.errors;
- for (let i = errors.length - 1; i >= 0; i--) {
- const error = errors[i];
- if (error.loc.index === pos) {
- return errors[i] = toParseError({
- loc,
- details
- });
- }
- if (error.loc.index < pos) break;
- }
- return this.raise(toParseError, raiseProperties);
- }
- updateContext(prevType) {}
- unexpected(loc, type) {
- throw this.raise(_parseError.Errors.UnexpectedToken, {
- expected: type ? (0, _types.tokenLabelName)(type) : null,
- at: loc != null ? loc : this.state.startLoc
- });
- }
- expectPlugin(pluginName, loc) {
- if (this.hasPlugin(pluginName)) {
- return true;
- }
- throw this.raise(_parseError.Errors.MissingPlugin, {
- at: loc != null ? loc : this.state.startLoc,
- missingPlugin: [pluginName]
- });
- }
- expectOnePlugin(pluginNames) {
- if (!pluginNames.some(name => this.hasPlugin(name))) {
- throw this.raise(_parseError.Errors.MissingOneOfPlugins, {
- at: this.state.startLoc,
- missingPlugin: pluginNames
- });
- }
- }
- errorBuilder(error) {
- return (pos, lineStart, curLine) => {
- this.raise(error, {
- at: buildPosition(pos, lineStart, curLine)
- });
- };
- }
- }
- exports.default = Tokenizer;
- //# sourceMappingURL=index.js.map
|