xast
Version:
AST parsing library
48 lines • 1.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.readString = void 0;
const TokenKind_1 = require("../TokenKind");
const createToken_1 = require("../createToken");
const characterClasses_1 = require("../characterClasses");
const readString = (lexer, start, quoteCode) => {
const source = lexer.source;
const body = source.body;
const bodyLength = body.length;
let position = start + 1;
let chunkStart = position;
let value = '';
while (position < bodyLength) {
const code = body.charCodeAt(position);
if (code === quoteCode) {
value += body.slice(chunkStart, position);
return (0, createToken_1.createToken)(lexer, quoteCode === 0x0060 ? TokenKind_1.TokenKind.STRING_EXPR : TokenKind_1.TokenKind.STRING, start, position + 1, value);
}
if (code === 0x005c) {
value += body.slice(chunkStart, position);
const escape = body.charCodeAt(position + 1) === 0x0075
? body.charCodeAt(position + 2) === 0x007b
? source.readEscapedUnicodeVariableWidth(position)
: source.readEscapedUnicodeFixedWidth(position)
: source.readEscapedCharacter(position);
value += escape.value;
position += escape.size;
chunkStart = position;
continue;
}
if (code === 0x000a || code === 0x000d) {
break;
}
if ((0, characterClasses_1.isUnicodeScalarValue)(code)) {
++position;
}
else if ((0, characterClasses_1.isSupplementaryCodePoint)(body, position)) {
position += 2;
}
else {
throw source.syntaxError(position, `Invalid character within String: ${source.printCodePointAt(position)}.`);
}
}
throw source.syntaxError(position, 'Unterminated string.');
};
exports.readString = readString;
//# sourceMappingURL=readString.js.map