UNPKG

@glimmer/syntax

Version:
185 lines (141 loc) 15.5 kB
"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"); class SymbolTable { static top(locals, customizeComponentName) { return new ProgramSymbolTable(locals, customizeComponentName); } child(locals) { let symbols = locals.map(name => this.allocate(name)); return new BlockSymbolTable(this, locals, symbols); } } exports.SymbolTable = SymbolTable; class ProgramSymbolTable extends SymbolTable { constructor(templateLocals, customizeComponentName) { super(); this.templateLocals = templateLocals; this.customizeComponentName = customizeComponentName; this.symbols = []; this.upvars = []; this.size = 1; this.named = (0, _util.dict)(); this.blocks = (0, _util.dict)(); this.usedTemplateLocals = []; this._hasEval = false; } getUsedTemplateLocals() { return this.usedTemplateLocals; } setHasEval() { this._hasEval = true; } get hasEval() { return this._hasEval; } has(name) { return this.templateLocals.indexOf(name) !== -1; } get(name) { let index = this.usedTemplateLocals.indexOf(name); if (index !== -1) { return [index, true]; } index = this.usedTemplateLocals.length; this.usedTemplateLocals.push(name); return [index, true]; } getLocalsMap() { return (0, _util.dict)(); } getEvalInfo() { let locals = this.getLocalsMap(); return Object.keys(locals).map(symbol => locals[symbol]); } 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); } let index = this.upvars.indexOf(name); if (index !== -1) { return index; } index = this.upvars.length; this.upvars.push(name); return index; } allocateNamed(name) { let named = this.named[name]; if (!named) { named = this.named[name] = this.allocate(name); } return named; } allocateBlock(name) { if (name === 'inverse') { name = 'else'; } let block = this.blocks[name]; if (!block) { block = this.blocks[name] = this.allocate(`&${name}`); } return block; } allocate(identifier) { this.symbols.push(identifier); return this.size++; } } exports.ProgramSymbolTable = ProgramSymbolTable; class BlockSymbolTable extends SymbolTable { constructor(parent, symbols, slots) { super(); this.parent = parent; this.symbols = symbols; this.slots = slots; } get locals() { return this.symbols; } has(name) { return this.symbols.indexOf(name) !== -1 || this.parent.has(name); } get(name) { let slot = this.symbols.indexOf(name); return slot === -1 ? this.parent.get(name) : [this.slots[slot], false]; } getLocalsMap() { let dict = this.parent.getLocalsMap(); this.symbols.forEach(symbol => dict[symbol] = this.get(symbol)[0]); return dict; } getEvalInfo() { let locals = this.getLocalsMap(); return Object.keys(locals).map(symbol => locals[symbol]); } setHasEval() { this.parent.setHasEval(); } allocateFree(name, resolution) { return this.parent.allocateFree(name, resolution); } allocateNamed(name) { return this.parent.allocateNamed(name); } allocateBlock(name) { return this.parent.allocateBlock(name); } allocate(identifier) { return this.parent.allocate(identifier); } } exports.BlockSymbolTable = BlockSymbolTable; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc3ltYm9sLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFHQTs7QUFFTSxNQUFBLFdBQUEsQ0FBMkI7QUFDL0IsU0FBQSxHQUFBLENBQUEsTUFBQSxFQUFBLHNCQUFBLEVBRW1EO0FBRWpELFdBQU8sSUFBQSxrQkFBQSxDQUFBLE1BQUEsRUFBUCxzQkFBTyxDQUFQO0FBQ0Q7O0FBZUQsRUFBQSxLQUFLLENBQUEsTUFBQSxFQUFpQjtBQUNwQixRQUFJLE9BQU8sR0FBRyxNQUFNLENBQU4sR0FBQSxDQUFZLElBQUQsSUFBVSxLQUFBLFFBQUEsQ0FBbkMsSUFBbUMsQ0FBckIsQ0FBZDtBQUNBLFdBQU8sSUFBQSxnQkFBQSxDQUFBLElBQUEsRUFBQSxNQUFBLEVBQVAsT0FBTyxDQUFQO0FBQ0Q7O0FBeEI4Qjs7OztBQTJCM0IsTUFBQSxrQkFBQSxTQUFBLFdBQUEsQ0FBNkM7QUFDakQsRUFBQSxXQUFBLENBQUEsY0FBQSxFQUFBLHNCQUFBLEVBRTJEO0FBRXpEO0FBSFEsU0FBQSxjQUFBLEdBQUEsY0FBQTtBQUNBLFNBQUEsc0JBQUEsR0FBQSxzQkFBQTtBQUtILFNBQUEsT0FBQSxHQUFBLEVBQUE7QUFDQSxTQUFBLE1BQUEsR0FBQSxFQUFBO0FBRUMsU0FBQSxJQUFBLEdBQUEsQ0FBQTtBQUNBLFNBQUEsS0FBQSxHQUFBLGlCQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsaUJBQUE7QUFDQSxTQUFBLGtCQUFBLEdBQUEsRUFBQTtBQUVSLFNBQUEsUUFBQSxHQUFBLEtBQUE7QUFWQzs7QUFZRCxFQUFBLHFCQUFxQixHQUFBO0FBQ25CLFdBQU8sS0FBUCxrQkFBQTtBQUNEOztBQUVELEVBQUEsVUFBVSxHQUFBO0FBQ1IsU0FBQSxRQUFBLEdBQUEsSUFBQTtBQUNEOztBQUVELE1BQUEsT0FBQSxHQUFXO0FBQ1QsV0FBTyxLQUFQLFFBQUE7QUFDRDs7QUFF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QUNEOztBQUVELEVBQUEsYUFBYSxDQUFBLElBQUEsRUFBYTtBQUN4QixXQUFPLEtBQUEsTUFBQSxDQUFBLGFBQUEsQ0FBUCxJQUFPLENBQVA7QUFDRDs7QUFFRCxFQUFBLFFBQVEsQ0FBQSxVQUFBLEVBQW1CO0FBQ3pCLFdBQU8sS0FBQSxNQUFBLENBQUEsUUFBQSxDQUFQLFVBQU8sQ0FBUDtBQUNEOztBQS9DOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb3JlLCBEaWN0LCBTZXhwT3Bjb2RlcyB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgZGljdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBBU1R2MiB9IGZyb20gJy4uJztcbmltcG9ydCB7IGlzVXBwZXJDYXNlIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTeW1ib2xUYWJsZSB7XG4gIHN0YXRpYyB0b3AoXG4gICAgbG9jYWxzOiBzdHJpbmdbXSxcbiAgICBjdXN0b21pemVDb21wb25lbnROYW1lOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nXG4gICk6IFByb2dyYW1TeW1ib2xUYWJsZSB7XG4gICAgcmV0dXJuIG5ldyBQcm9ncmFtU3ltYm9sVGFibGUobG9jYWxzLCBjdXN0b21pemVDb21wb25lbnROYW1lKTtcbiAgfVxuXG4gIGFic3RyYWN0IGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBhYnN0cmFjdCBnZXQobmFtZTogc3RyaW5nKTogW3N5bWJvbDogbnVtYmVyLCBpc1Jvb3Q6IGJvb2xlYW5dO1xuXG4gIGFic3RyYWN0IGdldExvY2Fsc01hcCgpOiBEaWN0PG51bWJlcj47XG4gIGFic3RyYWN0IGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm87XG5cbiAgYWJzdHJhY3QgYWxsb2NhdGVGcmVlKG5hbWU6IHN0cmluZywgcmVzb2x1dGlvbjogQVNUdjIuRnJlZVZhclJlc29sdXRpb24pOiBudW1iZXI7XG4gIGFic3RyYWN0IGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyO1xuICBhYnN0cmFjdCBhbGxvY2F0ZUJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYWJzdHJhY3QgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyO1xuXG4gIGFic3RyYWN0IHNldEhhc0V2YWwoKTogdm9pZDtcblxuICBjaGlsZChsb2NhbHM6IHN0cmluZ1tdKTogQmxvY2tTeW1ib2xUYWJsZSB7XG4gICAgbGV0IHN5bWJvbHMgPSBsb2NhbHMubWFwKChuYW1lKSA9PiB0aGlzLmFsbG9jYXRlKG5hbWUpKTtcbiAgICByZXR1cm4gbmV3IEJsb2NrU3ltYm9sVGFibGUodGhpcywgbG9jYWxzLCBzeW1ib2xzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvZ3JhbVN5bWJvbFRhYmxlIGV4dGVuZHMgU3ltYm9sVGFibGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRlbXBsYXRlTG9jYWxzOiBzdHJpbmdbXSxcbiAgICBwcml2YXRlIGN1c3RvbWl6ZUNvbXBvbmVudE5hbWU6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBzeW1ib2xzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgdXB2YXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHByaXZhdGUgc2l6ZSA9IDE7XG4gIHByaXZhdGUgbmFtZWQgPSBkaWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBibG9ja3MgPSBkaWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSB1c2VkVGVtcGxhdGVMb2NhbHM6IHN0cmluZ1tdID0gW107XG5cbiAgX2hhc0V2YWwgPSBmYWxzZTtcblxuICBnZXRVc2VkVGVtcGxhdGVMb2NhbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnVzZWRUZW1wbGF0ZUxvY2FscztcbiAgfVxuXG4gIHNldEhhc0V2YWwoKTogdm9pZCB7XG4gICAgdGhpcy5faGFzRXZhbCA9IHRydWU7XG4gIH1cblxuICBnZXQgaGFzRXZhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFzRXZhbDtcbiAgfVxuXG4gIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZUxvY2Fscy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBbbnVtYmVyLCBib29sZWFuXSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBbaW5kZXgsIHRydWVdO1xuICAgIH1cblxuICAgIGluZGV4ID0gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHMubGVuZ3RoO1xuICAgIHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLnB1c2gobmFtZSk7XG4gICAgcmV0dXJuIFtpbmRleCwgdHJ1ZV07XG4gIH1cblxuICBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+IHtcbiAgICByZXR1cm4gZGljdCgpO1xuICB9XG5cbiAgZ2V0RXZhbEluZm8oKTogQ29yZS5FdmFsSW5mbyB7XG4gICAgbGV0IGxvY2FscyA9IHRoaXMuZ2V0TG9jYWxzTWFwKCk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxvY2FscykubWFwKChzeW1ib2wpID0+IGxvY2Fsc1tzeW1ib2xdKTtcbiAgfVxuXG4gIGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyIHtcbiAgICAvLyBJZiB0aGUgbmFtZSBpbiBxdWVzdGlvbiBpcyBhbiB1cHBlcmNhc2UgKGkuZS4gYW5nbGUtYnJhY2tldCkgY29tcG9uZW50IGludm9jYXRpb24sIHJ1blxuICAgIC8vIHRoZSBvcHRpb25hbCBgY3VzdG9taXplQ29tcG9uZW50TmFtZWAgZnVuY3Rpb24gcHJvdmlkZWQgdG8gdGhlIHByZWNvbXBpbGVyLlxuICAgIGlmIChcbiAgICAgIHJlc29sdXRpb24ucmVzb2x1dGlvbigpID09PSBTZXhwT3Bjb2Rlcy5HZXRGcmVlQXNDb21wb25lbnRIZWFkICYmXG4gICAgICByZXNvbHV0aW9uLmlzQW5nbGVCcmFja2V0ICYmXG4gICAgICBpc1VwcGVyQ2FzZShuYW1lKVxuICAgICkge1xuICAgICAgbmFtZSA9IHRoaXMuY3VzdG9taXplQ29tcG9uZW50TmFtZShuYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgaW5kZXggPSB0aGlzLnVwdmFycy5pbmRleE9mKG5hbWUpO1xuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGluZGV4ID0gdGhpcy51cHZhcnMubGVuZ3RoO1xuICAgIHRoaXMudXB2YXJzLnB1c2gobmFtZSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYWxsb2NhdGVOYW1lZChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGxldCBuYW1lZCA9IHRoaXMubmFtZWRbbmFtZV07XG5cbiAgICBpZiAoIW5hbWVkKSB7XG4gICAgICBuYW1lZCA9IHRoaXMubmFtZWRbbmFtZV0gPSB0aGlzLmFsbG9jYXRlKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuYW1lZDtcbiAgfVxuXG4gIGFsbG9jYXRlQmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAobmFtZSA9PT0gJ2ludmVyc2UnKSB7XG4gICAgICBuYW1lID0gJ2Vsc2UnO1xuICAgIH1cblxuICAgIGxldCBibG9jayA9IHRoaXMuYmxvY2tzW25hbWVdO1xuXG4gICAgaWYgKCFibG9jaykge1xuICAgICAgYmxvY2sgPSB0aGlzLmJsb2Nrc1tuYW1lXSA9IHRoaXMuYWxsb2NhdGUoYCYke25hbWV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2NrO1xuICB9XG5cbiAgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICB0aGlzLnN5bWJvbHMucHVzaChpZGVudGlmaWVyKTtcbiAgICByZXR1cm4gdGhpcy5zaXplKys7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJsb2NrU3ltYm9sVGFibGUgZXh0ZW5kcyBTeW1ib2xUYWJsZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcGFyZW50OiBTeW1ib2xUYWJsZSwgcHVibGljIHN5bWJvbHM6IHN0cmluZ1tdLCBwdWJsaWMgc2xvdHM6IG51bWJlcltdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCBsb2NhbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbHM7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3ltYm9scy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0aGlzLnBhcmVudC5oYXMobmFtZSk7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogW251bWJlciwgYm9vbGVhbl0ge1xuICAgIGxldCBzbG90ID0gdGhpcy5zeW1ib2xzLmluZGV4T2YobmFtZSk7XG4gICAgcmV0dXJuIHNsb3QgPT09IC0xID8gdGhpcy5wYXJlbnQuZ2V0KG5hbWUpIDogW3RoaXMuc2xvdHNbc2xvdF0sIGZhbHNlXTtcbiAgfVxuXG4gIGdldExvY2Fsc01hcCgpOiBEaWN0PG51bWJlcj4ge1xuICAgIGxldCBkaWN0ID0gdGhpcy5wYXJlbnQuZ2V0TG9jYWxzTWFwKCk7XG4gICAgdGhpcy5zeW1ib2xzLmZvckVhY2goKHN5bWJvbCkgPT4gKGRpY3Rbc3ltYm9sXSA9IHRoaXMuZ2V0KHN5bWJvbClbMF0pKTtcbiAgICByZXR1cm4gZGljdDtcbiAgfVxuXG4gIGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm8ge1xuICAgIGxldCBsb2NhbHMgPSB0aGlzLmdldExvY2Fsc01hcCgpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsb2NhbHMpLm1hcCgoc3ltYm9sKSA9PiBsb2NhbHNbc3ltYm9sXSk7XG4gIH1cblxuICBzZXRIYXNFdmFsKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50LnNldEhhc0V2YWwoKTtcbiAgfVxuXG4gIGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVGcmVlKG5hbWUsIHJlc29sdXRpb24pO1xuICB9XG5cbiAgYWxsb2NhdGVOYW1lZChuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hbGxvY2F0ZU5hbWVkKG5hbWUpO1xuICB9XG5cbiAgYWxsb2NhdGVCbG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBhcmVudC5hbGxvY2F0ZUJsb2NrKG5hbWUpO1xuICB9XG5cbiAgYWxsb2NhdGUoaWRlbnRpZmllcjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGUoaWRlbnRpZmllcik7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=