1120 lines
34 KiB
JavaScript
1120 lines
34 KiB
JavaScript
![]() |
"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
|