UNPKG

xast

Version:
48 lines 1.99 kB
"use strict"; 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