"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getParser = void 0; const validate_1 = require("./validate"); const acorn_1 = require("./modules/acorn"); const errors_1 = require("./errors"); const convert_1 = require("./convert"); let parserCache; const PRIVATE = Symbol("ExtendParser#private"); const PRIVATE_PROCESS_NODE = Symbol("ExtendParser#processNode"); function getParser() { if (parserCache) { return parserCache; } parserCache = class ExtendParser extends (0, acorn_1.getAcorn)().Parser { constructor(options, code) { super((() => { const tokenConvertor = new convert_1.TokenConvertor(code); return { ecmaVersion: options.ecmaVersion, sourceType: options.sourceType, ranges: true, locations: true, allowReserved: true, onToken: (token) => { const t = tokenConvertor.convertToken(token); if (t) { this[PRIVATE].tokenStore.add(t); } }, onComment: (block, text, start, end, startLoc, endLoc) => { const comment = { type: block ? "Block" : "Line", value: text, range: [start, end], loc: { start: startLoc, end: endLoc, }, }; if (!this[PRIVATE].ctx.comments) { throw (0, errors_1.throwUnexpectedCommentError)(comment); } this[PRIVATE].comments.push(comment); }, }; })(), code); this[PRIVATE] = { code, ctx: options.ctx, tokenStore: options.tokenStore, comments: options.comments, nodes: options.nodes, }; } finishNode(...args) { const result = super.finishNode(...args); return this[PRIVATE_PROCESS_NODE](result); } finishNodeAt(...args) { const result = super.finishNodeAt(...args); return this[PRIVATE_PROCESS_NODE](result); } [PRIVATE_PROCESS_NODE](node) { const { tokenStore, ctx, nodes } = this[PRIVATE]; (0, validate_1.validateNode)(node, tokenStore, ctx); nodes.push(node); return node; } raise(pos, message) { const loc = (0, acorn_1.getAcorn)().getLineInfo(this[PRIVATE].code, pos); const err = new errors_1.ParseError(message, pos, loc.line, loc.column + 1); throw err; } raiseRecoverable(pos, message) { this.raise(pos, message); } unexpected(pos) { if (pos != null) { this.raise(pos, "Unexpected token."); return; } const start = this.start; const end = this.end; const token = this[PRIVATE].code.slice(start, end); if (token) { const message = `Unexpected token '${token}'.`; this.raise(start, message); } else { if (!this[PRIVATE].nodes.length) { this.raise(0, "Expected to be an expression, but got empty."); } if (this[PRIVATE].tokenStore.tokens.length) { const last = this[PRIVATE].tokenStore.tokens[this[PRIVATE].tokenStore.tokens.length - 1]; this.raise(last.range[0], `Unexpected token '${last.value}'.`); } this.raise(start, "Unexpected token."); } } }; return parserCache; } exports.getParser = getParser;