scope.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = exports.TransformScope = void 0;
  6. function getLocalName(node) {
  7. switch (node.type) {
  8. case 'ElementNode':
  9. // unfortunately the ElementNode stores `tag` as a string
  10. // if that changes in glimmer-vm this will need to be updated
  11. return node.tag.split('.')[0];
  12. case 'SubExpression':
  13. case 'MustacheStatement':
  14. case 'BlockStatement':
  15. return getLocalName(node.path);
  16. case 'UndefinedLiteral':
  17. case 'NullLiteral':
  18. case 'BooleanLiteral':
  19. case 'StringLiteral':
  20. case 'NumberLiteral':
  21. case 'TextNode':
  22. case 'Template':
  23. case 'Block':
  24. case 'CommentStatement':
  25. case 'MustacheCommentStatement':
  26. case 'PartialStatement':
  27. case 'ElementModifierStatement':
  28. case 'AttrNode':
  29. case 'ConcatStatement':
  30. case 'Program':
  31. case 'Hash':
  32. case 'HashPair':
  33. return undefined;
  34. case 'PathExpression':
  35. default:
  36. return node.parts.length ? node.parts[0] : undefined;
  37. }
  38. }
  39. function getLocals(node) {
  40. switch (node.type) {
  41. case 'ElementNode':
  42. case 'Program':
  43. case 'Block':
  44. case 'Template':
  45. return node.blockParams;
  46. case 'BlockStatement':
  47. return node.program.blockParams;
  48. default:
  49. return undefined;
  50. }
  51. }
  52. class TransformScope {
  53. constructor(locals) {
  54. this.locals = locals;
  55. this.hasPartial = false;
  56. this.usedLocals = {};
  57. for (const local of locals) {
  58. this.usedLocals[local] = false;
  59. }
  60. }
  61. child(node) {
  62. let locals = getLocals(node);
  63. return locals ? new ChildTransformScope(locals, this) : this;
  64. }
  65. usePartial() {
  66. this.hasPartial = true;
  67. }
  68. }
  69. exports.TransformScope = TransformScope;
  70. class RootTransformScope extends TransformScope {
  71. constructor(node) {
  72. var _a;
  73. let locals = (_a = getLocals(node)) !== null && _a !== void 0 ? _a : [];
  74. super(locals);
  75. }
  76. useLocal(node) {
  77. let name = getLocalName(node);
  78. if (name && name in this.usedLocals) {
  79. this.usedLocals[name] = true;
  80. }
  81. }
  82. isLocal(name) {
  83. return this.locals.indexOf(name) !== -1;
  84. }
  85. currentUnusedLocals() {
  86. if (!this.hasPartial && this.locals.length > 0) {
  87. return this.locals.filter(local => !this.usedLocals[local]);
  88. }
  89. return false;
  90. }
  91. }
  92. exports.default = RootTransformScope;
  93. class ChildTransformScope extends TransformScope {
  94. constructor(locals, parent) {
  95. super(locals);
  96. this.parent = parent;
  97. }
  98. useLocal(node) {
  99. let name = getLocalName(node);
  100. if (name && name in this.usedLocals) {
  101. this.usedLocals[name] = true;
  102. } else {
  103. this.parent.useLocal(node);
  104. }
  105. }
  106. isLocal(name) {
  107. return this.locals.indexOf(name) !== -1 || this.parent.isLocal(name);
  108. }
  109. currentUnusedLocals() {
  110. if (!this.hasPartial && this.locals.length > 0) {
  111. // We only care about the last local, because if it is used then it implies
  112. // usage of the others (specifically when in a child block, |foo bar|)
  113. if (!this.usedLocals[this.locals[this.locals.length - 1]]) {
  114. return [this.locals[this.locals.length - 1]];
  115. }
  116. }
  117. return false;
  118. }
  119. }
  120. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdHJhdmVyc2FsL3Njb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFFQSxTQUFBLFlBQUEsQ0FBQSxJQUFBLEVBQXNDO0FBQ3BDLFVBQVEsSUFBSSxDQUFaLElBQUE7QUFDRSxTQUFBLGFBQUE7QUFDRTtBQUNBO0FBQ0EsYUFBTyxJQUFJLENBQUosR0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEVBQVAsQ0FBTyxDQUFQOztBQUVGLFNBQUEsZUFBQTtBQUNBLFNBQUEsbUJBQUE7QUFDQSxTQUFBLGdCQUFBO0FBQ0UsYUFBTyxZQUFZLENBQUMsSUFBSSxDQUF4QixJQUFtQixDQUFuQjs7QUFFRixTQUFBLGtCQUFBO0FBQ0EsU0FBQSxhQUFBO0FBQ0EsU0FBQSxnQkFBQTtBQUNBLFNBQUEsZUFBQTtBQUNBLFNBQUEsZUFBQTtBQUNBLFNBQUEsVUFBQTtBQUNBLFNBQUEsVUFBQTtBQUNBLFNBQUEsT0FBQTtBQUNBLFNBQUEsa0JBQUE7QUFDQSxTQUFBLDBCQUFBO0FBQ0EsU0FBQSxrQkFBQTtBQUNBLFNBQUEsMEJBQUE7QUFDQSxTQUFBLFVBQUE7QUFDQSxTQUFBLGlCQUFBO0FBQ0EsU0FBQSxTQUFBO0FBQ0EsU0FBQSxNQUFBO0FBQ0EsU0FBQSxVQUFBO0FBQ0UsYUFBQSxTQUFBOztBQUNGLFNBQUEsZ0JBQUE7QUFDQTtBQUNFLGFBQU8sSUFBSSxDQUFKLEtBQUEsQ0FBQSxNQUFBLEdBQW9CLElBQUksQ0FBSixLQUFBLENBQXBCLENBQW9CLENBQXBCLEdBQVAsU0FBQTtBQS9CSjtBQWlDRDs7QUFFRCxTQUFBLFNBQUEsQ0FBQSxJQUFBLEVBQW1DO0FBQ2pDLFVBQVEsSUFBSSxDQUFaLElBQUE7QUFDRSxTQUFBLGFBQUE7QUFDQSxTQUFBLFNBQUE7QUFDQSxTQUFBLE9BQUE7QUFDQSxTQUFBLFVBQUE7QUFDRSxhQUFPLElBQUksQ0FBWCxXQUFBOztBQUVGLFNB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QUEsQ0FBWSxLQUFBLE1BQUEsQ0FBQSxNQUFBLEdBQWpDLENBQXFCLENBQWhCLENBQUwsRUFBMkQ7QUFDekQsZUFBTyxDQUFDLEtBQUEsTUFBQSxDQUFZLEtBQUEsTUFBQSxDQUFBLE1BQUEsR0FBcEIsQ0FBUSxDQUFELENBQVA7QUFDRDtBQUNGOztBQUVELFdBQUEsS0FBQTtBQUNEOztBQTdCNkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuLi92MS9hcGknO1xuXG5mdW5jdGlvbiBnZXRMb2NhbE5hbWUobm9kZTogQVNUdjEuTm9kZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgY2FzZSAnRWxlbWVudE5vZGUnOlxuICAgICAgLy8gdW5mb3J0dW5hdGVseSB0aGUgRWxlbWVudE5vZGUgc3RvcmVzIGB0YWdgIGFzIGEgc3RyaW5nXG4gICAgICAvLyBpZiB0aGF0IGNoYW5nZXMgaW4gZ2xpbW1lci12bSB0aGlzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgICByZXR1cm4gbm9kZS50YWcuc3BsaXQoJy4nKVswXTtcblxuICAgIGNhc2UgJ1N1YkV4cHJlc3Npb24nOlxuICAgIGNhc2UgJ011c3RhY2hlU3RhdGVtZW50JzpcbiAgICBjYXNlICdCbG9ja1N0YXRlbWVudCc6XG4gICAgICByZXR1cm4gZ2V0TG9jYWxOYW1lKG5vZGUucGF0aCk7XG5cbiAgICBjYXNlICdVbmRlZmluZWRMaXRlcmFsJzpcbiAgICBjYXNlICdOdWxsTGl0ZXJhbCc6XG4gICAgY2FzZSAnQm9vbGVhbkxpdGVyYWwnOlxuICAgIGNhc2UgJ1N0cmluZ0xpdGVyYWwnOlxuICAgIGNhc2UgJ051bWJlckxpdGVyYWwnOlxuICAgIGNhc2UgJ1RleHROb2RlJzpcbiAgICBjYXNlICdUZW1wbGF0ZSc6XG4gICAgY2FzZSAnQmxvY2snOlxuICAgIGNhc2UgJ0NvbW1lbnRTdGF0ZW1lbnQnOlxuICAgIGNhc2UgJ011c3RhY2hlQ29tbWVudFN0YXRlbWVudCc6XG4gICAgY2FzZSAnUGFydGlhbFN0YXRlbWVudCc6XG4gICAgY2FzZSAnRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50JzpcbiAgICBjYXNlICdBdHRyTm9kZSc6XG4gICAgY2FzZSAnQ29uY2F0U3RhdGVtZW50JzpcbiAgICBjYXNlICdQcm9ncmFtJzpcbiAgICBjYXNlICdIYXNoJzpcbiAgICBjYXNlICdIYXNoUGFpcic6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNhc2UgJ1BhdGhFeHByZXNzaW9uJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5vZGUucGFydHMubGVuZ3RoID8gbm9kZS5wYXJ0c1swXSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMb2NhbHMobm9kZTogQVNUdjEuTm9kZSk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgY2FzZSAnUHJvZ3JhbSc6XG4gICAgY2FzZSAnQmxvY2snOlxuICAgIGNhc2UgJ1RlbXBsYXRlJzpcbiAgICAgIHJldHVybiBub2RlLmJsb2NrUGFyYW1zO1xuXG4gICAgY2FzZSAnQmxvY2tTdGF0ZW1lbnQnOlxuICAgICAgcmV0dXJuIG5vZGUucHJvZ3JhbS5ibG9ja1BhcmFtcztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBUcmFuc2Zvcm1TY29wZSB7XG4gIGhhc1BhcnRpYWwgPSBmYWxzZTtcbiAgdXNlZExvY2FsczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbG9jYWxzOiBzdHJpbmdbXSkge1xuICAgIGZvciAoY29uc3QgbG9jYWwgb2YgbG9jYWxzKSB7XG4gICAgICB0aGlzLnVzZWRMb2NhbHNbbG9jYWxdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY2hpbGQobm9kZTogQVNUdjEuTm9kZSk6IFRyYW5zZm9ybVNjb3BlIHtcbiAgICBsZXQgbG9jYWxzID0gZ2V0TG9jYWxzKG5vZGUpO1xuXG4gICAgcmV0dXJuIGxvY2FscyA/IG5ldyBDaGlsZFRyYW5zZm9ybVNjb3BlKGxvY2FscywgdGhpcykgOiB0aGlzO1xuICB9XG5cbiAgdXNlUGFydGlhbCgpOiB2b2lkIHtcbiAgICB0aGlzLmhhc1BhcnRpYWwgPSB0cnVlO1xuICB9XG5cbiAgYWJzdHJhY3QgaXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xuICBhYnN0cmFjdCB1c2VMb2NhbChub2RlOiBBU1R2MS5Ob2RlKTogdm9pZDtcbiAgYWJzdHJhY3QgY3VycmVudFVudXNlZExvY2FscygpOiBzdHJpbmdbXSB8IGZhbHNlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb290VHJhbnNmb3JtU2NvcGUgZXh0ZW5kcyBUcmFuc2Zvcm1TY29wZSB7XG4gIGNvbnN0cnVjdG9yKG5vZGU6IEFTVHYxLk5vZGUpIHtcbiAgICBsZXQgbG9jYWxzID0gZ2V0TG9jYWxzKG5vZGUpID8/IFtdO1xuXG4gICAgc3VwZXIobG9jYWxzKTtcbiAgfVxuXG4gIHVzZUxvY2FsKG5vZGU6IEFTVHYxLk5vZGUpOiB2b2lkIHtcbiAgICBsZXQgbmFtZSA9IGdldExvY2FsTmFtZShub2RlKTtcblxuICAgIGlmIChuYW1lICYmIG5hbWUgaW4gdGhpcy51c2VkTG9jYWxzKSB7XG4gICAgICB0aGlzLnVzZWRMb2NhbHNbbmFtZV0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxzLmluZGV4T2YobmFtZSkgIT09IC0xO1xuICB9XG5cbiAgY3VycmVudFVudXNlZExvY2FscygpOiBzdHJpbmdbXSB8IGZhbHNlIHtcbiAgICBpZiAoIXRoaXMuaGFzUGFydGlhbCAmJiB0aGlzLmxvY2Fscy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5sb2NhbHMuZmlsdGVyKChsb2NhbCkgPT4gIXRoaXMudXNlZExvY2Fsc1tsb2NhbF0pO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jbGFzcyBDaGlsZFRyYW5zZm9ybVNjb3BlIGV4dGVuZHMgVHJhbnNmb3JtU2NvcGUge1xuICBjb25zdHJ1Y3Rvcihsb2NhbHM6IHN0cmluZ1tdLCBwcml2YXRlIHBhcmVudDogVHJhbnNmb3JtU2NvcGUpIHtcbiAgICBzdXBlcihsb2NhbHMpO1xuICB9XG5cbiAgdXNlTG9jYWwobm9kZTogQVNUdjEuTm9kZSk6IHZvaWQge1xuICAgIGxldCBuYW1lID0gZ2V0TG9jYWxOYW1lKG5vZGUpO1xuXG4gICAgaWYgKG5hbWUgJiYgbmFtZSBpbiB0aGlzLnVzZWRMb2NhbHMpIHtcbiAgICAgIHRoaXMudXNlZExvY2Fsc1tuYW1lXSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50LnVzZUxvY2FsKG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIGlzTG9jYWwobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxzLmluZGV4T2YobmFtZSkgIT09IC0xIHx8IHRoaXMucGFyZW50LmlzTG9jYWwobmFtZSk7XG4gIH1cblxuICBjdXJyZW50VW51c2VkTG9jYWxzKCk6IHN0cmluZ1tdIHwgZmFsc2Uge1xuICAgIGlmICghdGhpcy5oYXNQYXJ0aWFsICYmIHRoaXMubG9jYWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFdlIG9ubHkgY2FyZSBhYm91dCB0aGUgbGFzdCBsb2NhbCwgYmVjYXVzZSBpZiBpdCBpcyB1c2VkIHRoZW4gaXQgaW1wbGllc1xuICAgICAgLy8gdXNhZ2Ugb2YgdGhlIG90aGVycyAoc3BlY2lmaWNhbGx5IHdoZW4gaW4gYSBjaGlsZCBibG9jaywgfGZvbyBiYXJ8KVxuICAgICAgaWYgKCF0aGlzLnVzZWRMb2NhbHNbdGhpcy5sb2NhbHNbdGhpcy5sb2NhbHMubGVuZ3RoIC0gMV1dKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5sb2NhbHNbdGhpcy5sb2NhbHMubGVuZ3RoIC0gMV1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==