symbol-table.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.BlockSymbolTable = exports.ProgramSymbolTable = exports.SymbolTable = void 0;
  6. var _util = require("@glimmer/util");
  7. var _utils = require("./utils");
  8. var __classPrivateFieldSet = void 0 && (void 0).__classPrivateFieldSet || function (receiver, privateMap, value) {
  9. if (!privateMap.has(receiver)) {
  10. throw new TypeError("attempted to set private field on non-instance");
  11. }
  12. privateMap.set(receiver, value);
  13. return value;
  14. };
  15. var __classPrivateFieldGet = void 0 && (void 0).__classPrivateFieldGet || function (receiver, privateMap) {
  16. if (!privateMap.has(receiver)) {
  17. throw new TypeError("attempted to get private field on non-instance");
  18. }
  19. return privateMap.get(receiver);
  20. };
  21. var _hasEval;
  22. class SymbolTable {
  23. static top(locals, customizeComponentName) {
  24. return new ProgramSymbolTable(locals, customizeComponentName);
  25. }
  26. child(locals) {
  27. let symbols = locals.map(name => this.allocate(name));
  28. return new BlockSymbolTable(this, locals, symbols);
  29. }
  30. }
  31. exports.SymbolTable = SymbolTable;
  32. class ProgramSymbolTable extends SymbolTable {
  33. constructor(templateLocals, customizeComponentName) {
  34. super();
  35. this.templateLocals = templateLocals;
  36. this.customizeComponentName = customizeComponentName;
  37. this.symbols = [];
  38. this.upvars = [];
  39. this.size = 1;
  40. this.named = (0, _util.dict)();
  41. this.blocks = (0, _util.dict)();
  42. this.usedTemplateLocals = [];
  43. _hasEval.set(this, false);
  44. }
  45. getUsedTemplateLocals() {
  46. return this.usedTemplateLocals;
  47. }
  48. setHasEval() {
  49. __classPrivateFieldSet(this, _hasEval, true);
  50. }
  51. get hasEval() {
  52. return __classPrivateFieldGet(this, _hasEval);
  53. }
  54. has(name) {
  55. return this.templateLocals.indexOf(name) !== -1;
  56. }
  57. get(name) {
  58. let index = this.usedTemplateLocals.indexOf(name);
  59. if (index !== -1) {
  60. return [index, true];
  61. }
  62. index = this.usedTemplateLocals.length;
  63. this.usedTemplateLocals.push(name);
  64. return [index, true];
  65. }
  66. getLocalsMap() {
  67. return (0, _util.dict)();
  68. }
  69. getEvalInfo() {
  70. let locals = this.getLocalsMap();
  71. return Object.keys(locals).map(symbol => locals[symbol]);
  72. }
  73. allocateFree(name, resolution) {
  74. // If the name in question is an uppercase (i.e. angle-bracket) component invocation, run
  75. // the optional `customizeComponentName` function provided to the precompiler.
  76. if (resolution.resolution() === 39
  77. /* GetFreeAsComponentHead */
  78. && resolution.isAngleBracket && (0, _utils.isUpperCase)(name)) {
  79. name = this.customizeComponentName(name);
  80. }
  81. let index = this.upvars.indexOf(name);
  82. if (index !== -1) {
  83. return index;
  84. }
  85. index = this.upvars.length;
  86. this.upvars.push(name);
  87. return index;
  88. }
  89. allocateNamed(name) {
  90. let named = this.named[name];
  91. if (!named) {
  92. named = this.named[name] = this.allocate(name);
  93. }
  94. return named;
  95. }
  96. allocateBlock(name) {
  97. if (name === 'inverse') {
  98. name = 'else';
  99. }
  100. let block = this.blocks[name];
  101. if (!block) {
  102. block = this.blocks[name] = this.allocate(`&${name}`);
  103. }
  104. return block;
  105. }
  106. allocate(identifier) {
  107. this.symbols.push(identifier);
  108. return this.size++;
  109. }
  110. }
  111. exports.ProgramSymbolTable = ProgramSymbolTable;
  112. _hasEval = new WeakMap();
  113. class BlockSymbolTable extends SymbolTable {
  114. constructor(parent, symbols, slots) {
  115. super();
  116. this.parent = parent;
  117. this.symbols = symbols;
  118. this.slots = slots;
  119. }
  120. get locals() {
  121. return this.symbols;
  122. }
  123. has(name) {
  124. return this.symbols.indexOf(name) !== -1 || this.parent.has(name);
  125. }
  126. get(name) {
  127. let slot = this.symbols.indexOf(name);
  128. return slot === -1 ? this.parent.get(name) : [this.slots[slot], false];
  129. }
  130. getLocalsMap() {
  131. let dict = this.parent.getLocalsMap();
  132. this.symbols.forEach(symbol => dict[symbol] = this.get(symbol)[0]);
  133. return dict;
  134. }
  135. getEvalInfo() {
  136. let locals = this.getLocalsMap();
  137. return Object.keys(locals).map(symbol => locals[symbol]);
  138. }
  139. setHasEval() {
  140. this.parent.setHasEval();
  141. }
  142. allocateFree(name, resolution) {
  143. return this.parent.allocateFree(name, resolution);
  144. }
  145. allocateNamed(name) {
  146. return this.parent.allocateNamed(name);
  147. }
  148. allocateBlock(name) {
  149. return this.parent.allocateBlock(name);
  150. }
  151. allocate(identifier) {
  152. return this.parent.allocate(identifier);
  153. }
  154. }
  155. exports.BlockSymbolTable = BlockSymbolTable;
  156. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvc3ltYm9sLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRU0sTUFBQSxXQUFBLENBQTJCO0FBQy9CLFNBQUEsR0FBQSxDQUFBLE1BQUEsRUFBQSxzQkFBQSxFQUVtRDtBQUVqRCxXQUFPLElBQUEsa0JBQUEsQ0FBQSxNQUFBLEVBQVAsc0JBQU8sQ0FBUDtBQUNEOztBQWVELEVBQUEsS0FBSyxDQUFBLE1BQUEsRUFBaUI7QUFDcEIsUUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFOLEdBQUEsQ0FBWSxJQUFELElBQVUsS0FBQSxRQUFBLENBQW5DLElBQW1DLENBQXJCLENBQWQ7QUFDQSxXQUFPLElBQUEsZ0JBQUEsQ0FBQSxJQUFBLEVBQUEsTUFBQSxFQUFQLE9BQU8sQ0FBUDtBQUNEOztBQXhCOEI7Ozs7QUEyQjNCLE1BQUEsa0JBQUEsU0FBQSxXQUFBLENBQTZDO0FBQ2pELEVBQUEsV0FBQSxDQUFBLGNBQUEsRUFBQSxzQkFBQSxFQUUyRDtBQUV6RDtBQUhRLFNBQUEsY0FBQSxHQUFBLGNBQUE7QUFDQSxTQUFBLHNCQUFBLEdBQUEsc0JBQUE7QUFLSCxTQUFBLE9BQUEsR0FBQSxFQUFBO0FBQ0EsU0FBQSxNQUFBLEdBQUEsRUFBQTtBQUVDLFNBQUEsSUFBQSxHQUFBLENBQUE7QUFDQSxTQUFBLEtBQUEsR0FBQSxpQkFBQTtBQUNBLFNBQUEsTUFBQSxHQUFBLGlCQUFBO0FBQ0EsU0FBQSxrQkFBQSxHQUFBLEVBQUE7O0FBRVIsSUFBQSxRQUFBLENBQUEsR0FBQSxDQUFBLElBQUEsRUFBQSxLQUFBO0FBVkM7O0FBWUQsRUFBQSxxQkFBcUIsR0FBQTtBQUNuQixXQUFPLEtBQVAsa0JBQUE7QUFDRDs7QUFFRCxFQUFBLFVBQVUsR0FBQTtBQUNSLElBQUEsc0JBQUEsQ0FBQSxJQUFBLEVBQUEsUUFBQSxFQUFB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Q0FBUDtBQUNEOztBQUVELEVBQUEsYUFBYSxDQUFBLElBQUEsRUFBYTtBQUN4QixXQUFPLEtBQUEsTUFBQSxDQUFBLGFBQUEsQ0FBUCxJQUFPLENBQVA7QUFDRDs7QUFFRCxFQUFBLGFBQWEsQ0FBQSxJQUFBLEVBQWE7QUFDeEIsV0FBTyxLQUFBLE1BQUEsQ0FBQSxhQUFBLENBQVAsSUFBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxRQUFRLENBQUEsVUFBQSxFQUFtQjtBQUN6QixXQUFPLEtBQUEsTUFBQSxDQUFBLFFBQUEsQ0FBUCxVQUFPLENBQVA7QUFDRDs7QUEvQzhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29yZSwgRGljdCwgU2V4cE9wY29kZXMgfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGRpY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgQVNUdjIgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBpc1VwcGVyQ2FzZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3ltYm9sVGFibGUge1xuICBzdGF0aWMgdG9wKFxuICAgIGxvY2Fsczogc3RyaW5nW10sXG4gICAgY3VzdG9taXplQ29tcG9uZW50TmFtZTogKGlucHV0OiBzdHJpbmcpID0+IHN0cmluZ1xuICApOiBQcm9ncmFtU3ltYm9sVGFibGUge1xuICAgIHJldHVybiBuZXcgUHJvZ3JhbVN5bWJvbFRhYmxlKGxvY2FscywgY3VzdG9taXplQ29tcG9uZW50TmFtZSk7XG4gIH1cblxuICBhYnN0cmFjdCBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgZ2V0KG5hbWU6IHN0cmluZyk6IFtzeW1ib2w6IG51bWJlciwgaXNSb290OiBib29sZWFuXTtcblxuICBhYnN0cmFjdCBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+O1xuICBhYnN0cmFjdCBnZXRFdmFsSW5mbygpOiBDb3JlLkV2YWxJbmZvO1xuXG4gIGFic3RyYWN0IGFsbG9jYXRlRnJlZShuYW1lOiBzdHJpbmcsIHJlc29sdXRpb246IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uKTogbnVtYmVyO1xuICBhYnN0cmFjdCBhbGxvY2F0ZU5hbWVkKG5hbWU6IHN0cmluZyk6IG51bWJlcjtcbiAgYWJzdHJhY3QgYWxsb2NhdGVCbG9jayhuYW1lOiBzdHJpbmcpOiBudW1iZXI7XG4gIGFic3RyYWN0IGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlcjtcblxuICBhYnN0cmFjdCBzZXRIYXNFdmFsKCk6IHZvaWQ7XG5cbiAgY2hpbGQobG9jYWxzOiBzdHJpbmdbXSk6IEJsb2NrU3ltYm9sVGFibGUge1xuICAgIGxldCBzeW1ib2xzID0gbG9jYWxzLm1hcCgobmFtZSkgPT4gdGhpcy5hbGxvY2F0ZShuYW1lKSk7XG4gICAgcmV0dXJuIG5ldyBCbG9ja1N5bWJvbFRhYmxlKHRoaXMsIGxvY2Fscywgc3ltYm9scyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFByb2dyYW1TeW1ib2xUYWJsZSBleHRlbmRzIFN5bWJvbFRhYmxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZUxvY2Fsczogc3RyaW5nW10sXG4gICAgcHJpdmF0ZSBjdXN0b21pemVDb21wb25lbnROYW1lOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgc3ltYm9sczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIHVwdmFyczogc3RyaW5nW10gPSBbXTtcblxuICBwcml2YXRlIHNpemUgPSAxO1xuICBwcml2YXRlIG5hbWVkID0gZGljdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgYmxvY2tzID0gZGljdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgdXNlZFRlbXBsYXRlTG9jYWxzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICNoYXNFdmFsID0gZmFsc2U7XG5cbiAgZ2V0VXNlZFRlbXBsYXRlTG9jYWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy51c2VkVGVtcGxhdGVMb2NhbHM7XG4gIH1cblxuICBzZXRIYXNFdmFsKCk6IHZvaWQge1xuICAgIHRoaXMuI2hhc0V2YWwgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IGhhc0V2YWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2hhc0V2YWw7XG4gIH1cblxuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVMb2NhbHMuaW5kZXhPZihuYW1lKSAhPT0gLTE7XG4gIH1cblxuICBnZXQobmFtZTogc3RyaW5nKTogW251bWJlciwgYm9vbGVhbl0ge1xuICAgIGxldCBpbmRleCA9IHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLmluZGV4T2YobmFtZSk7XG5cbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gW2luZGV4LCB0cnVlXTtcbiAgICB9XG5cbiAgICBpbmRleCA9IHRoaXMudXNlZFRlbXBsYXRlTG9jYWxzLmxlbmd0aDtcbiAgICB0aGlzLnVzZWRUZW1wbGF0ZUxvY2Fscy5wdXNoKG5hbWUpO1xuICAgIHJldHVybiBbaW5kZXgsIHRydWVdO1xuICB9XG5cbiAgZ2V0TG9jYWxzTWFwKCk6IERpY3Q8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGRpY3QoKTtcbiAgfVxuXG4gIGdldEV2YWxJbmZvKCk6IENvcmUuRXZhbEluZm8ge1xuICAgIGxldCBsb2NhbHMgPSB0aGlzLmdldExvY2Fsc01hcCgpO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsb2NhbHMpLm1hcCgoc3ltYm9sKSA9PiBsb2NhbHNbc3ltYm9sXSk7XG4gIH1cblxuICBhbGxvY2F0ZUZyZWUobmFtZTogc3RyaW5nLCByZXNvbHV0aW9uOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbik6IG51bWJlciB7XG4gICAgLy8gSWYgdGhlIG5hbWUgaW4gcXVlc3Rpb24gaXMgYW4gdXBwZXJjYXNlIChpLmUuIGFuZ2xlLWJyYWNrZXQpIGNvbXBvbmVudCBpbnZvY2F0aW9uLCBydW5cbiAgICAvLyB0aGUgb3B0aW9uYWwgYGN1c3RvbWl6ZUNvbXBvbmVudE5hbWVgIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIHRoZSBwcmVjb21waWxlci5cbiAgICBpZiAoXG4gICAgICByZXNvbHV0aW9uLnJlc29sdXRpb24oKSA9PT0gU2V4cE9wY29kZXMuR2V0RnJlZUFzQ29tcG9uZW50SGVhZCAmJlxuICAgICAgcmVzb2x1dGlvbi5pc0FuZ2xlQnJhY2tldCAmJlxuICAgICAgaXNVcHBlckNhc2UobmFtZSlcbiAgICApIHtcbiAgICAgIG5hbWUgPSB0aGlzLmN1c3RvbWl6ZUNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IGluZGV4ID0gdGhpcy51cHZhcnMuaW5kZXhPZihuYW1lKTtcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBpbmRleCA9IHRoaXMudXB2YXJzLmxlbmd0aDtcbiAgICB0aGlzLnVwdmFycy5wdXNoKG5hbWUpO1xuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgbmFtZWQgPSB0aGlzLm5hbWVkW25hbWVdO1xuXG4gICAgaWYgKCFuYW1lZCkge1xuICAgICAgbmFtZWQgPSB0aGlzLm5hbWVkW25hbWVdID0gdGhpcy5hbGxvY2F0ZShuYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZWQ7XG4gIH1cblxuICBhbGxvY2F0ZUJsb2NrKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgaWYgKG5hbWUgPT09ICdpbnZlcnNlJykge1xuICAgICAgbmFtZSA9ICdlbHNlJztcbiAgICB9XG5cbiAgICBsZXQgYmxvY2sgPSB0aGlzLmJsb2Nrc1tuYW1lXTtcblxuICAgIGlmICghYmxvY2spIHtcbiAgICAgIGJsb2NrID0gdGhpcy5ibG9ja3NbbmFtZV0gPSB0aGlzLmFsbG9jYXRlKGAmJHtuYW1lfWApO1xuICAgIH1cblxuICAgIHJldHVybiBibG9jaztcbiAgfVxuXG4gIGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgdGhpcy5zeW1ib2xzLnB1c2goaWRlbnRpZmllcik7XG4gICAgcmV0dXJuIHRoaXMuc2l6ZSsrO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCbG9ja1N5bWJvbFRhYmxlIGV4dGVuZHMgU3ltYm9sVGFibGUge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBhcmVudDogU3ltYm9sVGFibGUsIHB1YmxpYyBzeW1ib2xzOiBzdHJpbmdbXSwgcHVibGljIHNsb3RzOiBudW1iZXJbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgbG9jYWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5zeW1ib2xzO1xuICB9XG5cbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbHMuaW5kZXhPZihuYW1lKSAhPT0gLTEgfHwgdGhpcy5wYXJlbnQuaGFzKG5hbWUpO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IFtudW1iZXIsIGJvb2xlYW5dIHtcbiAgICBsZXQgc2xvdCA9IHRoaXMuc3ltYm9scy5pbmRleE9mKG5hbWUpO1xuICAgIHJldHVybiBzbG90ID09PSAtMSA/IHRoaXMucGFyZW50LmdldChuYW1lKSA6IFt0aGlzLnNsb3RzW3Nsb3RdLCBmYWxzZV07XG4gIH1cblxuICBnZXRMb2NhbHNNYXAoKTogRGljdDxudW1iZXI+IHtcbiAgICBsZXQgZGljdCA9IHRoaXMucGFyZW50LmdldExvY2Fsc01hcCgpO1xuICAgIHRoaXMuc3ltYm9scy5mb3JFYWNoKChzeW1ib2wpID0+IChkaWN0W3N5bWJvbF0gPSB0aGlzLmdldChzeW1ib2wpWzBdKSk7XG4gICAgcmV0dXJuIGRpY3Q7XG4gIH1cblxuICBnZXRFdmFsSW5mbygpOiBDb3JlLkV2YWxJbmZvIHtcbiAgICBsZXQgbG9jYWxzID0gdGhpcy5nZXRMb2NhbHNNYXAoKTtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobG9jYWxzKS5tYXAoKHN5bWJvbCkgPT4gbG9jYWxzW3N5bWJvbF0pO1xuICB9XG5cbiAgc2V0SGFzRXZhbCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudC5zZXRIYXNFdmFsKCk7XG4gIH1cblxuICBhbGxvY2F0ZUZyZWUobmFtZTogc3RyaW5nLCByZXNvbHV0aW9uOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmFsbG9jYXRlRnJlZShuYW1lLCByZXNvbHV0aW9uKTtcbiAgfVxuXG4gIGFsbG9jYXRlTmFtZWQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVOYW1lZChuYW1lKTtcbiAgfVxuXG4gIGFsbG9jYXRlQmxvY2sobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuYWxsb2NhdGVCbG9jayhuYW1lKTtcbiAgfVxuXG4gIGFsbG9jYXRlKGlkZW50aWZpZXI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmFsbG9jYXRlKGlkZW50aWZpZXIpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6IiJ9