scope.js 11 KB

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