scope.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = exports.TransformScope = void 0;
  6. function _inheritsLoose(subClass, superClass) {
  7. subClass.prototype = Object.create(superClass.prototype);
  8. subClass.prototype.constructor = subClass;
  9. subClass.__proto__ = superClass;
  10. }
  11. function _createForOfIteratorHelperLoose(o, allowArrayLike) {
  12. var it;
  13. if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {
  14. if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
  15. if (it) o = it;
  16. var i = 0;
  17. return function () {
  18. if (i >= o.length) return {
  19. done: true
  20. };
  21. return {
  22. done: false,
  23. value: o[i++]
  24. };
  25. };
  26. }
  27. throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
  28. }
  29. it = o[Symbol.iterator]();
  30. return it.next.bind(it);
  31. }
  32. function _unsupportedIterableToArray(o, minLen) {
  33. if (!o) return;
  34. if (typeof o === "string") return _arrayLikeToArray(o, minLen);
  35. var n = Object.prototype.toString.call(o).slice(8, -1);
  36. if (n === "Object" && o.constructor) n = o.constructor.name;
  37. if (n === "Map" || n === "Set") return Array.from(o);
  38. if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
  39. }
  40. function _arrayLikeToArray(arr, len) {
  41. if (len == null || len > arr.length) len = arr.length;
  42. for (var i = 0, arr2 = new Array(len); i < len; i++) {
  43. arr2[i] = arr[i];
  44. }
  45. return arr2;
  46. }
  47. function getLocalName(node) {
  48. switch (node.type) {
  49. case 'ElementNode':
  50. // unfortunately the ElementNode stores `tag` as a string
  51. // if that changes in glimmer-vm this will need to be updated
  52. return node.tag.split('.')[0];
  53. case 'SubExpression':
  54. case 'MustacheStatement':
  55. case 'BlockStatement':
  56. return getLocalName(node.path);
  57. case 'UndefinedLiteral':
  58. case 'NullLiteral':
  59. case 'BooleanLiteral':
  60. case 'StringLiteral':
  61. case 'NumberLiteral':
  62. case 'TextNode':
  63. case 'Template':
  64. case 'Block':
  65. case 'CommentStatement':
  66. case 'MustacheCommentStatement':
  67. case 'PartialStatement':
  68. case 'ElementModifierStatement':
  69. case 'AttrNode':
  70. case 'ConcatStatement':
  71. case 'Program':
  72. case 'Hash':
  73. case 'HashPair':
  74. return undefined;
  75. case 'PathExpression':
  76. default:
  77. return node.parts.length ? node.parts[0] : undefined;
  78. }
  79. }
  80. function getLocals(node) {
  81. switch (node.type) {
  82. case 'ElementNode':
  83. case 'Program':
  84. case 'Block':
  85. case 'Template':
  86. return node.blockParams;
  87. case 'BlockStatement':
  88. return node.program.blockParams;
  89. default:
  90. return undefined;
  91. }
  92. }
  93. var TransformScope = /*#__PURE__*/function () {
  94. function TransformScope(locals) {
  95. this.locals = locals;
  96. this.hasPartial = false;
  97. this.usedLocals = {};
  98. for (var _iterator = _createForOfIteratorHelperLoose(locals), _step; !(_step = _iterator()).done;) {
  99. var local = _step.value;
  100. this.usedLocals[local] = false;
  101. }
  102. }
  103. var _proto = TransformScope.prototype;
  104. _proto.child = function child(node) {
  105. var locals = getLocals(node);
  106. return locals ? new ChildTransformScope(locals, this) : this;
  107. };
  108. _proto.usePartial = function usePartial() {
  109. this.hasPartial = true;
  110. };
  111. return TransformScope;
  112. }();
  113. exports.TransformScope = TransformScope;
  114. var RootTransformScope = /*#__PURE__*/function (_TransformScope) {
  115. _inheritsLoose(RootTransformScope, _TransformScope);
  116. function RootTransformScope(node) {
  117. var _a;
  118. var locals = (_a = getLocals(node)) !== null && _a !== void 0 ? _a : [];
  119. return _TransformScope.call(this, locals) || this;
  120. }
  121. var _proto2 = RootTransformScope.prototype;
  122. _proto2.useLocal = function useLocal(node) {
  123. var name = getLocalName(node);
  124. if (name && name in this.usedLocals) {
  125. this.usedLocals[name] = true;
  126. }
  127. };
  128. _proto2.isLocal = function isLocal(name) {
  129. return this.locals.indexOf(name) !== -1;
  130. };
  131. _proto2.currentUnusedLocals = function currentUnusedLocals() {
  132. var _this = this;
  133. if (!this.hasPartial && this.locals.length > 0) {
  134. return this.locals.filter(function (local) {
  135. return !_this.usedLocals[local];
  136. });
  137. }
  138. return false;
  139. };
  140. return RootTransformScope;
  141. }(TransformScope);
  142. exports.default = RootTransformScope;
  143. var ChildTransformScope = /*#__PURE__*/function (_TransformScope2) {
  144. _inheritsLoose(ChildTransformScope, _TransformScope2);
  145. function ChildTransformScope(locals, parent) {
  146. var _this2;
  147. _this2 = _TransformScope2.call(this, locals) || this;
  148. _this2.parent = parent;
  149. return _this2;
  150. }
  151. var _proto3 = ChildTransformScope.prototype;
  152. _proto3.useLocal = function useLocal(node) {
  153. var name = getLocalName(node);
  154. if (name && name in this.usedLocals) {
  155. this.usedLocals[name] = true;
  156. } else {
  157. this.parent.useLocal(node);
  158. }
  159. };
  160. _proto3.isLocal = function isLocal(name) {
  161. return this.locals.indexOf(name) !== -1 || this.parent.isLocal(name);
  162. };
  163. _proto3.currentUnusedLocals = function currentUnusedLocals() {
  164. if (!this.hasPartial && this.locals.length > 0) {
  165. // We only care about the last local, because if it is used then it implies
  166. // usage of the others (specifically when in a child block, |foo bar|)
  167. if (!this.usedLocals[this.locals[this.locals.length - 1]]) {
  168. return [this.locals[this.locals.length - 1]];
  169. }
  170. }
  171. return false;
  172. };
  173. return ChildTransformScope;
  174. }(TransformScope);
  175. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdHJhdmVyc2FsL3Njb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLFNBQUEsWUFBQSxDQUFBLElBQUEsRUFBc0M7QUFDcEMsVUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFNBQUEsYUFBQTtBQUNFO0FBQ0E7QUFDQSxhQUFPLElBQUksQ0FBSixHQUFBLENBQUEsS0FBQSxDQUFBLEdBQUEsRUFBUCxDQUFPLENBQVA7O0FBRUYsU0FBQSxlQUFBO0FBQ0EsU0FBQSxtQkFBQTtBQUNBLFNBQUEsZ0JBQUE7QUFDRSxhQUFPLFlBQVksQ0FBQyxJQUFJLENBQXhCLElBQW1CLENBQW5COztBQUVGLFNBQUEsa0JBQUE7QUFDQSxTQUFBLGFBQUE7QUFDQSxTQUFBLGdCQUFBO0FBQ0EsU0FBQSxlQUFBO0FBQ0EsU0FBQSxlQUFBO0FBQ0EsU0FBQSxVQUFBO0FBQ0EsU0FBQSxVQUFBO0FBQ0EsU0FBQSxPQUFBO0FBQ0EsU0FBQSxrQkFBQTtBQUNBLFNBQUEsMEJBQUE7QUFDQSxTQUFBLGtCQUFBO0FBQ0EsU0FBQSwwQkFBQTtBQUNBLFNBQUEsVUFBQTtBQUNBLFNBQUEsaUJBQUE7QUFDQSxTQUFBLFNBQUE7QUFDQSxTQUFBLE1BQUE7QUFDQSxTQUFBLFVBQUE7QUFDRSxhQUFBLFNBQUE7O0FBQ0YsU0FBQSxnQkFBQTtBQUNBO0FBQ0UsYUFBTyxJQUFJLENBQUosS0FBQSxDQUFBLE1BQUEsR0FBb0IsSUFBSSxDQUFKLEtBQUEsQ0FBcEIsQ0FBb0IsQ0FBcEIsR0FBUCxTQUFBO0FBL0JKO0FBaUNEOztBQUVELFNBQUEsU0FBQSxDQUFBLElBQUEsRUFBbUM7QUFDakMsVUFBUSxJQUFJLENBQVosSUFBQTtBQUNFLFNBQUEsYUFBQTtBQUNBLFNBQUEsU0FBQTtBQUNBLFNBQUEsT0FB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QUFJLElBQUksR0FBRyxZQUFZLENBQXZCLElBQXVCLENBQXZCOztBQUVBLFFBQUksSUFBSSxJQUFJLElBQUksSUFBSSxLQUFwQixVQUFBLEVBQXFDO0FBQ25DLFdBQUEsVUFBQSxDQUFBLElBQUEsSUFBQSxJQUFBO0FBREYsS0FBQSxNQUVPO0FBQ0wsV0FBQSxNQUFBLENBQUEsUUFBQSxDQUFBLElBQUE7QUFDRDs7O1VBR0gsTyxHQUFBLFNBQUEsT0FBQSxDQUFBLElBQUEsRUFBb0I7QUFDbEIsV0FBTyxLQUFBLE1BQUEsQ0FBQSxPQUFBLENBQUEsSUFBQSxNQUE4QixDQUE5QixDQUFBLElBQW9DLEtBQUEsTUFBQSxDQUFBLE9BQUEsQ0FBM0MsSUFBMkMsQ0FBM0M7OztVQUdGLG1CLEdBQUEsU0FBQSxtQkFBQSxHQUFtQjtBQUNqQixRQUFJLENBQUMsS0FBRCxVQUFBLElBQW9CLEtBQUEsTUFBQSxDQUFBLE1BQUEsR0FBeEIsQ0FBQSxFQUFnRDtBQUM5QztBQUNBO0FBQ0EsVUFBSSxDQUFDLEtBQUEsVUFBQSxDQUFnQixLQUFBLE1BQUEsQ0FBWSxLQUFBLE1BQUEsQ0FBQSxNQUFBLEdBQWpDLENBQXFCLENBQWhCLENBQUwsRUFBMkQ7QUFDekQsZUFBTyxDQUFDLEtBQUEsTUFBQSxDQUFZLEtBQUEsTUFBQSxDQUFBLE1BQUEsR0FBcEIsQ0FBUSxDQUFELENBQVA7QUFDRDtBQUNGOztBQUVELFdBQUEsS0FBQTs7OztFQTVCSixjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi4vdjEvYXBpJztcblxuZnVuY3Rpb24gZ2V0TG9jYWxOYW1lKG5vZGU6IEFTVHYxLk5vZGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKG5vZGUudHlwZSkge1xuICAgIGNhc2UgJ0VsZW1lbnROb2RlJzpcbiAgICAgIC8vIHVuZm9ydHVuYXRlbHkgdGhlIEVsZW1lbnROb2RlIHN0b3JlcyBgdGFnYCBhcyBhIHN0cmluZ1xuICAgICAgLy8gaWYgdGhhdCBjaGFuZ2VzIGluIGdsaW1tZXItdm0gdGhpcyB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZFxuICAgICAgcmV0dXJuIG5vZGUudGFnLnNwbGl0KCcuJylbMF07XG5cbiAgICBjYXNlICdTdWJFeHByZXNzaW9uJzpcbiAgICBjYXNlICdNdXN0YWNoZVN0YXRlbWVudCc6XG4gICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgcmV0dXJuIGdldExvY2FsTmFtZShub2RlLnBhdGgpO1xuXG4gICAgY2FzZSAnVW5kZWZpbmVkTGl0ZXJhbCc6XG4gICAgY2FzZSAnTnVsbExpdGVyYWwnOlxuICAgIGNhc2UgJ0Jvb2xlYW5MaXRlcmFsJzpcbiAgICBjYXNlICdTdHJpbmdMaXRlcmFsJzpcbiAgICBjYXNlICdOdW1iZXJMaXRlcmFsJzpcbiAgICBjYXNlICdUZXh0Tm9kZSc6XG4gICAgY2FzZSAnVGVtcGxhdGUnOlxuICAgIGNhc2UgJ0Jsb2NrJzpcbiAgICBjYXNlICdDb21tZW50U3RhdGVtZW50JzpcbiAgICBjYXNlICdNdXN0YWNoZUNvbW1lbnRTdGF0ZW1lbnQnOlxuICAgIGNhc2UgJ1BhcnRpYWxTdGF0ZW1lbnQnOlxuICAgIGNhc2UgJ0VsZW1lbnRNb2RpZmllclN0YXRlbWVudCc6XG4gICAgY2FzZSAnQXR0ck5vZGUnOlxuICAgIGNhc2UgJ0NvbmNhdFN0YXRlbWVudCc6XG4gICAgY2FzZSAnUHJvZ3JhbSc6XG4gICAgY2FzZSAnSGFzaCc6XG4gICAgY2FzZSAnSGFzaFBhaXInOlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjYXNlICdQYXRoRXhwcmVzc2lvbic6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBub2RlLnBhcnRzLmxlbmd0aCA/IG5vZGUucGFydHNbMF0gOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TG9jYWxzKG5vZGU6IEFTVHYxLk5vZGUpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnRWxlbWVudE5vZGUnOlxuICAgIGNhc2UgJ1Byb2dyYW0nOlxuICAgIGNhc2UgJ0Jsb2NrJzpcbiAgICBjYXNlICdUZW1wbGF0ZSc6XG4gICAgICByZXR1cm4gbm9kZS5ibG9ja1BhcmFtcztcblxuICAgIGNhc2UgJ0Jsb2NrU3RhdGVtZW50JzpcbiAgICAgIHJldHVybiBub2RlLnByb2dyYW0uYmxvY2tQYXJhbXM7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNmb3JtU2NvcGUge1xuICBoYXNQYXJ0aWFsID0gZmFsc2U7XG4gIHVzZWRMb2NhbHM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGxvY2Fsczogc3RyaW5nW10pIHtcbiAgICBmb3IgKGNvbnN0IGxvY2FsIG9mIGxvY2Fscykge1xuICAgICAgdGhpcy51c2VkTG9jYWxzW2xvY2FsXSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNoaWxkKG5vZGU6IEFTVHYxLk5vZGUpOiBUcmFuc2Zvcm1TY29wZSB7XG4gICAgbGV0IGxvY2FscyA9IGdldExvY2Fscyhub2RlKTtcblxuICAgIHJldHVybiBsb2NhbHMgPyBuZXcgQ2hpbGRUcmFuc2Zvcm1TY29wZShsb2NhbHMsIHRoaXMpIDogdGhpcztcbiAgfVxuXG4gIHVzZVBhcnRpYWwoKTogdm9pZCB7XG4gICAgdGhpcy5oYXNQYXJ0aWFsID0gdHJ1ZTtcbiAgfVxuXG4gIGFic3RyYWN0IGlzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgdXNlTG9jYWwobm9kZTogQVNUdjEuTm9kZSk6IHZvaWQ7XG4gIGFic3RyYWN0IGN1cnJlbnRVbnVzZWRMb2NhbHMoKTogc3RyaW5nW10gfCBmYWxzZTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vdFRyYW5zZm9ybVNjb3BlIGV4dGVuZHMgVHJhbnNmb3JtU2NvcGUge1xuICBjb25zdHJ1Y3Rvcihub2RlOiBBU1R2MS5Ob2RlKSB7XG4gICAgbGV0IGxvY2FscyA9IGdldExvY2Fscyhub2RlKSA/PyBbXTtcblxuICAgIHN1cGVyKGxvY2Fscyk7XG4gIH1cblxuICB1c2VMb2NhbChub2RlOiBBU1R2MS5Ob2RlKTogdm9pZCB7XG4gICAgbGV0IG5hbWUgPSBnZXRMb2NhbE5hbWUobm9kZSk7XG5cbiAgICBpZiAobmFtZSAmJiBuYW1lIGluIHRoaXMudXNlZExvY2Fscykge1xuICAgICAgdGhpcy51c2VkTG9jYWxzW25hbWVdID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY2Fscy5pbmRleE9mKG5hbWUpICE9PSAtMTtcbiAgfVxuXG4gIGN1cnJlbnRVbnVzZWRMb2NhbHMoKTogc3RyaW5nW10gfCBmYWxzZSB7XG4gICAgaWYgKCF0aGlzLmhhc1BhcnRpYWwgJiYgdGhpcy5sb2NhbHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYWxzLmZpbHRlcigobG9jYWwpID0+ICF0aGlzLnVzZWRMb2NhbHNbbG9jYWxdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgQ2hpbGRUcmFuc2Zvcm1TY29wZSBleHRlbmRzIFRyYW5zZm9ybVNjb3BlIHtcbiAgY29uc3RydWN0b3IobG9jYWxzOiBzdHJpbmdbXSwgcHJpdmF0ZSBwYXJlbnQ6IFRyYW5zZm9ybVNjb3BlKSB7XG4gICAgc3VwZXIobG9jYWxzKTtcbiAgfVxuXG4gIHVzZUxvY2FsKG5vZGU6IEFTVHYxLk5vZGUpOiB2b2lkIHtcbiAgICBsZXQgbmFtZSA9IGdldExvY2FsTmFtZShub2RlKTtcblxuICAgIGlmIChuYW1lICYmIG5hbWUgaW4gdGhpcy51c2VkTG9jYWxzKSB7XG4gICAgICB0aGlzLnVzZWRMb2NhbHNbbmFtZV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcmVudC51c2VMb2NhbChub2RlKTtcbiAgICB9XG4gIH1cblxuICBpc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvY2Fscy5pbmRleE9mKG5hbWUpICE9PSAtMSB8fCB0aGlzLnBhcmVudC5pc0xvY2FsKG5hbWUpO1xuICB9XG5cbiAgY3VycmVudFVudXNlZExvY2FscygpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgICBpZiAoIXRoaXMuaGFzUGFydGlhbCAmJiB0aGlzLmxvY2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGxhc3QgbG9jYWwsIGJlY2F1c2UgaWYgaXQgaXMgdXNlZCB0aGVuIGl0IGltcGxpZXNcbiAgICAgIC8vIHVzYWdlIG9mIHRoZSBvdGhlcnMgKHNwZWNpZmljYWxseSB3aGVuIGluIGEgY2hpbGQgYmxvY2ssIHxmb28gYmFyfClcbiAgICAgIGlmICghdGhpcy51c2VkTG9jYWxzW3RoaXMubG9jYWxzW3RoaXMubG9jYWxzLmxlbmd0aCAtIDFdXSkge1xuICAgICAgICByZXR1cm4gW3RoaXMubG9jYWxzW3RoaXMubG9jYWxzLmxlbmd0aCAtIDFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=