"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BlockSymbolTable = exports.ProgramSymbolTable = exports.SymbolTable = void 0; var _util = require("@glimmer/util"); var _utils = require("./utils"); function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } var __classPrivateFieldSet = void 0 && (void 0).__classPrivateFieldSet || function (receiver, privateMap, value) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to set private field on non-instance"); } privateMap.set(receiver, value); return value; }; var __classPrivateFieldGet = void 0 && (void 0).__classPrivateFieldGet || function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); }; var _hasEval; var SymbolTable = /*#__PURE__*/function () { function SymbolTable() {} SymbolTable.top = function top(locals, customizeComponentName) { return new ProgramSymbolTable(locals, customizeComponentName); }; var _proto = SymbolTable.prototype; _proto.child = function child(locals) { var _this = this; var symbols = locals.map(function (name) { return _this.allocate(name); }); return new BlockSymbolTable(this, locals, symbols); }; return SymbolTable; }(); exports.SymbolTable = SymbolTable; var ProgramSymbolTable = /*#__PURE__*/function (_SymbolTable) { _inheritsLoose(ProgramSymbolTable, _SymbolTable); function ProgramSymbolTable(templateLocals, customizeComponentName) { var _this2; _this2 = _SymbolTable.call(this) || this; _this2.templateLocals = templateLocals; _this2.customizeComponentName = customizeComponentName; _this2.symbols = []; _this2.upvars = []; _this2.size = 1; _this2.named = (0, _util.dict)(); _this2.blocks = (0, _util.dict)(); _this2.usedTemplateLocals = []; _hasEval.set(_assertThisInitialized(_this2), false); return _this2; } var _proto2 = ProgramSymbolTable.prototype; _proto2.getUsedTemplateLocals = function getUsedTemplateLocals() { return this.usedTemplateLocals; }; _proto2.setHasEval = function setHasEval() { __classPrivateFieldSet(this, _hasEval, true); }; _proto2.has = function has(name) { return this.templateLocals.indexOf(name) !== -1; }; _proto2.get = function get(name) { var index = this.usedTemplateLocals.indexOf(name); if (index !== -1) { return [index, true]; } index = this.usedTemplateLocals.length; this.usedTemplateLocals.push(name); return [index, true]; }; _proto2.getLocalsMap = function getLocalsMap() { return (0, _util.dict)(); }; _proto2.getEvalInfo = function getEvalInfo() { var locals = this.getLocalsMap(); return Object.keys(locals).map(function (symbol) { return locals[symbol]; }); }; _proto2.allocateFree = function allocateFree(name, resolution) { // If the name in question is an uppercase (i.e. angle-bracket) component invocation, run // the optional `customizeComponentName` function provided to the precompiler. if (resolution.resolution() === 39 /* GetFreeAsComponentHead */ && resolution.isAngleBracket && (0, _utils.isUpperCase)(name)) { name = this.customizeComponentName(name); } var index = this.upvars.indexOf(name); if (index !== -1) { return index; } index = this.upvars.length; this.upvars.push(name); return index; }; _proto2.allocateNamed = function allocateNamed(name) { var named = this.named[name]; if (!named) { named = this.named[name] = this.allocate(name); } return named; }; _proto2.allocateBlock = function allocateBlock(name) { if (name === 'inverse') { name = 'else'; } var block = this.blocks[name]; if (!block) { block = this.blocks[name] = this.allocate("&" + name); } return block; }; _proto2.allocate = function allocate(identifier) { this.symbols.push(identifier); return this.size++; }; _createClass(ProgramSymbolTable, [{ key: "hasEval", get: function get() { return __classPrivateFieldGet(this, _hasEval); } }]); return ProgramSymbolTable; }(SymbolTable); exports.ProgramSymbolTable = ProgramSymbolTable; _hasEval = new WeakMap(); var BlockSymbolTable = /*#__PURE__*/function (_SymbolTable2) { _inheritsLoose(BlockSymbolTable, _SymbolTable2); function BlockSymbolTable(parent, symbols, slots) { var _this3; _this3 = _SymbolTable2.call(this) || this; _this3.parent = parent; _this3.symbols = symbols; _this3.slots = slots; return _this3; } var _proto3 = BlockSymbolTable.prototype; _proto3.has = function has(name) { return this.symbols.indexOf(name) !== -1 || this.parent.has(name); }; _proto3.get = function get(name) { var slot = this.symbols.indexOf(name); return slot === -1 ? this.parent.get(name) : [this.slots[slot], false]; }; _proto3.getLocalsMap = function getLocalsMap() { var _this4 = this; var dict = this.parent.getLocalsMap(); this.symbols.forEach(function (symbol) { return dict[symbol] = _this4.get(symbol)[0]; }); return dict; }; _proto3.getEvalInfo = function getEvalInfo() { var locals = this.getLocalsMap(); return Object.keys(locals).map(function (symbol) { return locals[symbol]; }); }; _proto3.setHasEval = function setHasEval() { this.parent.setHasEval(); }; _proto3.allocateFree = function allocateFree(name, resolution) { return this.parent.allocateFree(name, resolution); }; _proto3.allocateNamed = function allocateNamed(name) { return this.parent.allocateNamed(name); }; _proto3.allocateBlock = function allocateBlock(name) { return this.parent.allocateBlock(name); }; _proto3.allocate = function allocate(identifier) { return this.parent.allocate(identifier); }; _createClass(BlockSymbolTable, [{ key: "locals", get: function get() { return this.symbols; } }]); return BlockSymbolTable; }(SymbolTable); exports.BlockSymbolTable = BlockSymbolTable; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc3ltYm9sLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxXQUFOLEdBQUEsYUFBQSxZQUFBO0FBQUEsV0FBQSxXQUFBLEdBQUEsQ0FBQTs7QUFBQSxFQUFBLFdBQUEsQ0FBQSxHQUFBLEdBQ0UsU0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLHNCQUFBLEVBRW1EO0FBRWpELFdBQU8sSUFBQSxrQkFBQSxDQUFBLE1BQUEsRUFBUCxzQkFBTyxDQUFQO0FBTEosR0FBQTs7QUFBQSxNQUFBLE1BQUEsR0FBQSxXQUFBLENBQUEsU0FBQTs7QUFBQSxFQUFBLE1BQUEsQ0FBQSxLQUFBLEdBcUJFLFNBQUEsS0FBQSxDQUFBLE1BQUEsRUFBc0I7QUFBQSxRQUFBLEtBQUEsR0FBQSxJQUFBOztBQUNwQixRQUFJLE9BQU8sR0FBRyxNQUFNLENBQU4sR0FBQSxDQUFZLFVBQUQsSUFBQyxFQUFEO0FBQUEsYUFBVSxLQUFBLENBQUEsUUFBQSxDQUFuQyxJQUFtQyxDQUFWO0FBQXpCLEtBQWMsQ0FBZDtBQUNBLFdBQU8sSUFBQSxnQkFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQVAsT0FBTyxDQUFQO0FBdkJKLEdBQUE7O0FBQUEsU0FBQSxXQUFBO0FBQUEsQ0FBQSxFQUFBOzs7O0FBMkJBLElBQU0sa0JBQU4sR0FBQSxhQUFBLFVBQUEsWUFBQSxFQUFBO0FBQUEsRUFBQSxjQUFBLENBQUEsa0JBQUEsRUFBQSxZQUFBLENBQUE7O0FBQ0UsV0FBQSxrQkFBQSxDQUFBLGNBQUEsRUFBQSxzQkFBQSxFQUUyRDtBQUFBLFFBQUEsTUFBQTs7QUFFekQsSUFBQSxNQUFBLEdBQUEsWUFBQSxDQUFBLElBQUEsQ0FBQSxJQUFBLEtBQUEsSUFBQTtBQUhRLElBQUEs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QUE7QUFBQSxJQUFBLEdBQUEsRUFBQSxRQUFBO0FBQUEsSUFBQSxHQUFBLEVBQUEsU0FBQSxHQUFBLEdBS1k7QUFDUixhQUFPLEtBQVAsT0FBQTtBQUNEO0FBUEgsR0FBQSxDQUFBLENBQUE7O0FBQUEsU0FBQSxnQkFBQTtBQUFBLENBQUEsQ0FBQSxXQUFBLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlLCBEaWN0LCBTZXhwT3Bjb2RlcyB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGljdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBBU1R2MiB9IGZyb20gJy4uJztcbmltcG9ydCB7IGlzVXBwZXJDYXNlIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTeW1ib2xUYWJsZSB7XG4gIHN0YXRpYyB0b3AoXG4gICAgbG9jYWxzOiBzdHJpbmdbXSxcbiAgICBjdXN0b21pemVDb21wb25lbnROYW1lOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nXG4gICk6IFByb2dyYW1TeW1ib2xUYWJsZSB7XG4gICAgcmV0dXJuIG5ldyBQcm9ncmFtU3ltYm9sVGFibGUobG9jYWxzLCBjdXN0b21pemVDb21wb25lbnROYW1lKTtcbiAgfVxuXG4gIGFic3RyYWN0IGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBhYnN0cmFjdCBnZXQobmFtZTogc3RyaW5nKTogW3N5bWJvbDogbnVtYmVyLCBpc1Jvb3Q6IGJvb2xlYW5dO1xuXG4gIGFic3RyYWN0IGdldExvY2Fsc01hcCgpOiBEaWN0PG51bWJlcj47XG4gIGFic3RyYWN0IGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm87XG5cbiAgYWJzdHJhY3QgYWxsb2NhdGVGcmVlKG5hbWU6IHN0cmluZywgcmVzb2x1dGlvbjogQVNUdjIuRnJlZVZhclJlc29sdXRpb24pOiBudW1iZXI7XG4gIGFic3RyYWN0IGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBhYnN0cmFjdCBhbGxvY2F0ZUJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYWJzdHJhY3QgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IHNldEhhc0V2YWwoKTogdm9pZDtcblxuICBjaGlsZChsb2NhbHM6IHN0cmluZ1tdKTogQmxvY2tTeW1ib2xUYWJsZSB7XG4gICAgbGV0IHN5bWJvbHMgPSBsb2NhbHMubWFwKChuYW1lKSA9PiB0aGlzLmFsbG9jYXRlKG5hbWUpKTtcbiAgICByZXR1cm4gbmV3IEJsb2NrU3ltYm9sVGFibGUodGhpcywgbG9jYWxzLCBzeW1ib2xzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbVN5bWJvbFRhYmxlIGV4dGVuZHMgU3ltYm9sVGFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbXBsYXRlTG9jYWxzOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIGN1c3RvbWl6ZUNvbXBvbmVudE5hbWU6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBzeW1ib2xzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgdXB2YXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgc2l6ZSA9IDE7XG4gIHByaXZhdGUgbmFtZWQgPSBkaWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBibG9ja3MgPSBkaWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSB1c2VkVGVtcGxhdGVMb2NhbHM6IHN0cmluZ1tdID0gW107XG5cbiAgI2hhc0V2YWwgPSBmYWxzZTtcblxuICBnZXRVc2VkVGVtcGxhdGVMb2NhbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnVzZWRUZW1wbGF0ZUxvY2FscztcbiAgfVxuXG4gIHNldEhhc0V2YWwoKTogdm9pZCB7XG4gICAgdGhpcy4jaGFzRXZhbCA9IHRydWU7XG4gIH1cblxuICBnZXQgaGFzRXZhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jaGFzRXZhbDtcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUxvY2Fscy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBbbnVtYmVyLCBib29sZWFuXSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBbaW5kZXgsIHRydWVdO1xuICAgIH1cblxuICAgIGluZGV4ID0gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHMubGVuZ3RoO1xuICAgIHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLnB1c2gobmFtZSk7XG4gICAgcmV0dXJuIFtpbmRleCwgdHJ1ZV07XG4gIH1cblxuICBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+IHtcbiAgICByZXR1cm4gZGljdCgpO1xuICB9XG5cbiAgZ2V0RXZhbEluZm8oKTogQ29yZS5FdmFsSW5mbyB7XG4gICAgbGV0IGxvY2FscyA9IHRoaXMuZ2V0TG9jYWxzTWFwKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxvY2FscykubWFwKChzeW1ib2wpID0+IGxvY2Fsc1tzeW1ib2xdKTtcbiAgfVxuXG4gIGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBJZiB0aGUgbmFtZSBpbiBxdWVzdGlvbiBpcyBhbiB1cHBlcmNhc2UgKGkuZS4gYW5nbGUtYnJhY2tldCkgY29tcG9uZW50IGludm9jYXRpb24sIHJ1blxuICAgIC8vIHRoZSBvcHRpb25hbCBgY3VzdG9taXplQ29tcG9uZW50TmFtZWAgZnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhlIHByZWNvbXBpbGVyLlxuICAgIGlmIChcbiAgICAgIHJlc29sdXRpb24ucmVzb2x1dGlvbigpID09PSBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNDb21wb25lbnRIZWFkICYmXG4gICAgICByZXNvbHV0aW9uLmlzQW5nbGVCcmFja2V0ICYmXG4gICAgICBpc1VwcGVyQ2FzZShuYW1lKVxuICAgICkge1xuICAgICAgbmFtZSA9IHRoaXMuY3VzdG9taXplQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLnVwdmFycy5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGluZGV4ID0gdGhpcy51cHZhcnMubGVuZ3RoO1xuICAgIHRoaXMudXB2YXJzLnB1c2gobmFtZSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWxsb2NhdGVOYW1lZChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWRbbmFtZV07XG5cbiAgICBpZiAoIW5hbWVkKSB7XG4gICAgICBuYW1lZCA9IHRoaXMubmFtZWRbbmFtZV0gPSB0aGlzLmFsbG9jYXRlKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lZDtcbiAgfVxuXG4gIGFsbG9jYXRlQmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAobmFtZSA9PT0gJ2ludmVyc2UnKSB7XG4gICAgICBuYW1lID0gJ2Vsc2UnO1xuICAgIH1cblxuICAgIGxldCBibG9jayA9IHRoaXMuYmxvY2tzW25hbWVdO1xuXG4gICAgaWYgKCFibG9jaykge1xuICAgICAgYmxvY2sgPSB0aGlzLmJsb2Nrc1tuYW1lXSA9IHRoaXMuYWxsb2NhdGUoYCYke25hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG5cbiAgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB0aGlzLnN5bWJvbHMucHVzaChpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gdGhpcy5zaXplKys7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrU3ltYm9sVGFibGUgZXh0ZW5kcyBTeW1ib2xUYWJsZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyZW50OiBTeW1ib2xUYWJsZSwgcHVibGljIHN5bWJvbHM6IHN0cmluZ1tdLCBwdWJsaWMgc2xvdHM6IG51bWJlcltdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCBsb2NhbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbHM7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9scy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0aGlzLnBhcmVudC5oYXMobmFtZSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogW251bWJlciwgYm9vbGVhbl0ge1xuICAgIGxldCBzbG90ID0gdGhpcy5zeW1ib2xzLmluZGV4T2YobmFtZSk7XG4gICAgcmV0dXJuIHNsb3QgPT09IC0xID8gdGhpcy5wYXJlbnQuZ2V0KG5hbWUpIDogW3RoaXMuc2xvdHNbc2xvdF0sIGZhbHNlXTtcbiAgfVxuXG4gIGdldExvY2Fsc01hcCgpOiBEaWN0PG51bWJlcj4ge1xuICAgIGxldCBkaWN0ID0gdGhpcy5wYXJlbnQuZ2V0TG9jYWxzTWFwKCk7XG4gICAgdGhpcy5zeW1ib2xzLmZvckVhY2goKHN5bWJvbCkgPT4gKGRpY3Rbc3ltYm9sXSA9IHRoaXMuZ2V0KHN5bWJvbClbMF0pKTtcbiAgICByZXR1cm4gZGljdDtcbiAgfVxuXG4gIGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm8ge1xuICAgIGxldCBsb2NhbHMgPSB0aGlzLmdldExvY2Fsc01hcCgpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsb2NhbHMpLm1hcCgoc3ltYm9sKSA9PiBsb2NhbHNbc3ltYm9sXSk7XG4gIH1cblxuICBzZXRIYXNFdmFsKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50LnNldEhhc0V2YWwoKTtcbiAgfVxuXG4gIGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVGcmVlKG5hbWUsIHJlc29sdXRpb24pO1xuICB9XG5cbiAgYWxsb2NhdGVOYW1lZChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hbGxvY2F0ZU5hbWVkKG5hbWUpO1xuICB9XG5cbiAgYWxsb2NhdGVCbG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hbGxvY2F0ZUJsb2NrKG5hbWUpO1xuICB9XG5cbiAgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGUoaWRlbnRpZmllcik7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=