@glimmer/syntax
Version:
185 lines (141 loc) • 15.5 kB
JavaScript
"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=