loose-resolution.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import * as ASTv2 from './api';
  2. export function SexpSyntaxContext(node) {
  3. if (isSimpleCallee(node)) {
  4. return ASTv2.LooseModeResolution.namespaced("Helper"
  5. /* Helper */
  6. );
  7. } else {
  8. return null;
  9. }
  10. }
  11. export function ModifierSyntaxContext(node) {
  12. if (isSimpleCallee(node)) {
  13. return ASTv2.LooseModeResolution.namespaced("Modifier"
  14. /* Modifier */
  15. );
  16. } else {
  17. return null;
  18. }
  19. }
  20. export function BlockSyntaxContext(node) {
  21. if (isSimpleCallee(node)) {
  22. return ASTv2.LooseModeResolution.namespaced("Component"
  23. /* Component */
  24. );
  25. } else {
  26. return ASTv2.LooseModeResolution.fallback();
  27. }
  28. }
  29. export function ComponentSyntaxContext(node) {
  30. if (isSimplePath(node)) {
  31. return ASTv2.LooseModeResolution.namespaced("Component"
  32. /* Component */
  33. , true);
  34. } else {
  35. return null;
  36. }
  37. }
  38. /**
  39. * This corresponds to append positions (text curlies or attribute
  40. * curlies). In strict mode, this also corresponds to arg curlies.
  41. */
  42. export function AttrValueSyntaxContext(node) {
  43. var isSimple = isSimpleCallee(node);
  44. var isInvoke = isInvokeNode(node);
  45. if (isSimple) {
  46. return isInvoke ? ASTv2.LooseModeResolution.namespaced("Helper"
  47. /* Helper */
  48. ) : ASTv2.LooseModeResolution.attr();
  49. } else {
  50. return isInvoke ? ASTv2.STRICT_RESOLUTION : ASTv2.LooseModeResolution.fallback();
  51. }
  52. }
  53. /**
  54. * This corresponds to append positions (text curlies or attribute
  55. * curlies). In strict mode, this also corresponds to arg curlies.
  56. */
  57. export function AppendSyntaxContext(node) {
  58. var isSimple = isSimpleCallee(node);
  59. var isInvoke = isInvokeNode(node);
  60. var trusting = node.trusting;
  61. if (isSimple) {
  62. return trusting ? ASTv2.LooseModeResolution.trustingAppend({
  63. invoke: isInvoke
  64. }) : ASTv2.LooseModeResolution.append({
  65. invoke: isInvoke
  66. });
  67. } else {
  68. return ASTv2.LooseModeResolution.fallback();
  69. }
  70. } // UTILITIES
  71. /**
  72. * A call node has a simple callee if its head is:
  73. *
  74. * - a `PathExpression`
  75. * - the `PathExpression`'s head is a `VarHead`
  76. * - it has no tail
  77. *
  78. * Simple heads:
  79. *
  80. * ```
  81. * {{x}}
  82. * {{x y}}
  83. * ```
  84. *
  85. * Not simple heads:
  86. *
  87. * ```
  88. * {{x.y}}
  89. * {{x.y z}}
  90. * {{@x}}
  91. * {{@x a}}
  92. * {{this}}
  93. * {{this a}}
  94. * ```
  95. */
  96. function isSimpleCallee(node) {
  97. var path = node.path;
  98. return isSimplePath(path);
  99. }
  100. function isSimplePath(node) {
  101. if (node.type === 'PathExpression' && node.head.type === 'VarHead') {
  102. return node.tail.length === 0;
  103. } else {
  104. return false;
  105. }
  106. }
  107. /**
  108. * The call expression has at least one argument.
  109. */
  110. function isInvokeNode(node) {
  111. return node.params.length > 0 || node.hash.pairs.length > 0;
  112. }
  113. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9sb29zZS1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBUCxLQUFBLE1BQUEsT0FBQTtBQVlBLE9BQU0sU0FBQSxpQkFBQSxDQUFBLElBQUEsRUFBcUQ7QUFDekQsTUFBSSxjQUFjLENBQWxCLElBQWtCLENBQWxCLEVBQTBCO0FBQ3hCLFdBQU8sS0FBSyxDQUFMLG1CQUFBLENBQUEsVUFBQSxDQUFvQztBQUFBO0FBQXBDLEtBQVA7QUFERixHQUFBLE1BRU87QUFDTCxXQUFBLElBQUE7QUFDRDtBQUNGO0FBRUQsT0FBTSxTQUFBLHFCQUFBLENBQUEsSUFBQSxFQUNnQztBQUVwQyxNQUFJLGNBQWMsQ0FBbEIsSUFBa0IsQ0FBbEIsRUFBMEI7QUFDeEIsV0FBTyxLQUFLLENBQUwsbUJBQUEsQ0FBQSxVQUFBLENBQW9DO0FBQUE7QUFBcEMsS0FBUDtBQURGLEdBQUEsTUFFTztBQUNMLFdBQUEsSUFBQTtBQUNEO0FBQ0Y7QUFFRCxPQUFNLFNBQUEsa0JBQUEsQ0FBQSxJQUFBLEVBQXVEO0FBQzNELE1BQUksY0FBYyxDQUFsQixJQUFrQixDQUFsQixFQUEwQjtBQUN4QixXQUFPLEtBQUssQ0FBTCxtQkFBQSxDQUFBLFVBQUEsQ0FBb0M7QUFBQTtBQUFwQyxLQUFQO0FBREYsR0FBQSxNQUVPO0FBQ0wsV0FBTyxLQUFLLENBQUwsbUJBQUEsQ0FBUCxRQUFPLEVBQVA7QUFDRDtBQUNGO0FBRUQsT0FBTSxTQUFBLHNCQUFBLENBQUEsSUFBQSxFQUEyRDtBQUMvRCxNQUFJLFlBQVksQ0FBaEIsSUFBZ0IsQ0FBaEIsRUFBd0I7QUFDdEIsV0FBTyxLQUFLLENBQUwsbUJBQUEsQ0FBQSxVQUFBLENBQW9DO0FBQUE7QUFBcEMsTUFBUCxJQUFPLENBQVA7QUFERixHQUFBLE1BRU87QUFDTCxXQUFBLElBQUE7QUFDRDtBQUNGO0FBRUQ7Ozs7O0FBSUEsT0FBTSxTQUFBLHNCQUFBLENBQUEsSUFBQSxFQUE4RDtBQUNsRSxNQUFJLFFBQVEsR0FBRyxjQUFjLENBQTdCLElBQTZCLENBQTdCO0FBQ0EsTUFBSSxRQUFRLEdBQUcsWUFBWSxDQUEzQixJQUEyQixDQUEzQjs7QUFFQSxNQUFBLFFBQUEsRUFBYztBQUNaLFdBQU8sUUFBUSxHQUNYLEtBQUssQ0FBTCxtQkFBQSxDQUFBLFVBQUEsQ0FBb0M7QUFBQTtBQUFwQyxLQURXLEdBRVgsS0FBSyxDQUFMLG1CQUFBLENBRkosSUFFSSxFQUZKO0FBREYsR0FBQSxNQUlPO0FBQ0wsV0FBTyxRQUFRLEdBQUcsS0FBSyxDQUFSLGlCQUFBLEdBQTZCLEtBQUssQ0FBTCxtQkFBQSxDQUE1QyxRQUE0QyxFQUE1QztBQUNEO0FBQ0Y7QUFFRDs7Ozs7QUFJQSxPQUFNLFNBQUEsbUJBQUEsQ0FBQSxJQUFBLEVBQTJEO0FBQy9ELE1BQUksUUFBUSxHQUFHLGNBQWMsQ0FBN0IsSUFBNkIsQ0FBN0I7QUFDQSxNQUFJLFFBQVEsR0FBRyxZQUFZLENBQTNCLElBQTJCLENBQTNCO0FBQ0EsTUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFuQixRQUFBOztBQUVBLE1BQUEsUUFBQSxFQUFjO0FBQ1osV0FBTyxRQUFRLEdBQ1gsS0FBSyxDQUFMLG1CQUFBLENBQUEsY0FBQSxDQUF5QztBQUFFLE1BQUEsTUFBTSxFQUFFO0FBQVYsS0FBekMsQ0FEVyxHQUVYLEtBQUssQ0FBTCxtQkFBQSxDQUFBLE1BQUEsQ0FBaUM7QUFBRSxNQUFBLE1BQU0sRUFBRTtBQUFWLEtBQWpDLENBRko7QUFERixHQUFBLE1BSU87QUFDTCxXQUFPLEtBQUssQ0FBTCxtQkFBQSxDQUFQLFFBQU8sRUFBUDtBQUNEO0VBT0g7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBLFNBQUEsY0FBQSxDQUFBLElBQUEsRUFBMEM7QUFDeEMsTUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFmLElBQUE7QUFFQSxTQUFPLFlBQVksQ0FBbkIsSUFBbUIsQ0FBbkI7QUFDRDs7QUFFRCxTQUFBLFlBQUEsQ0FBQSxJQUFBLEVBQTRDO0FBQzFDLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBQSxnQkFBQSxJQUFrQyxJQUFJLENBQUosSUFBQSxDQUFBLElBQUEsS0FBdEMsU0FBQSxFQUFvRTtBQUNsRSxXQUFPLElBQUksQ0FBSixJQUFBLENBQUEsTUFBQSxLQUFQLENBQUE7QUFERixHQUFBLE1BRU87QUFDTCxXQUFBLEtBQUE7QUFDRDtBQUNGO0FBRUQ7Ozs7O0FBR0EsU0FBQSxZQUFBLENBQUEsSUFBQSxFQUF3QztBQUN0QyxTQUFPLElBQUksQ0FBSixNQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBMEIsSUFBSSxDQUFKLElBQUEsQ0FBQSxLQUFBLENBQUEsTUFBQSxHQUFqQyxDQUFBO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuLi92MS9hcGknO1xuaW1wb3J0ICogYXMgQVNUdjIgZnJvbSAnLi9hcGknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFzdENhbGxQYXJ0cyB7XG4gIHBhdGg6IEFTVHYxLkV4cHJlc3Npb247XG4gIHBhcmFtczogQVNUdjEuRXhwcmVzc2lvbltdO1xuICBoYXNoOiBBU1R2MS5IYXNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhclBhdGggZXh0ZW5kcyBBU1R2MS5QYXRoRXhwcmVzc2lvbiB7XG4gIGhlYWQ6IEFTVHYxLlZhckhlYWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBTZXhwU3ludGF4Q29udGV4dChub2RlOiBBU1R2MS5TdWJFeHByZXNzaW9uKTogQVNUdjIuRnJlZVZhclJlc29sdXRpb24gfCBudWxsIHtcbiAgaWYgKGlzU2ltcGxlQ2FsbGVlKG5vZGUpKSB7XG4gICAgcmV0dXJuIEFTVHYyLkxvb3NlTW9kZVJlc29sdXRpb24ubmFtZXNwYWNlZChBU1R2Mi5GcmVlVmFyTmFtZXNwYWNlLkhlbHBlcik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGlmaWVyU3ludGF4Q29udGV4dChcbiAgbm9kZTogQVNUdjEuRWxlbWVudE1vZGlmaWVyU3RhdGVtZW50XG4pOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbiB8IG51bGwge1xuICBpZiAoaXNTaW1wbGVDYWxsZWUobm9kZSkpIHtcbiAgICByZXR1cm4gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5uYW1lc3BhY2VkKEFTVHYyLkZyZWVWYXJOYW1lc3BhY2UuTW9kaWZpZXIpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBCbG9ja1N5bnRheENvbnRleHQobm9kZTogQVNUdjEuQmxvY2tTdGF0ZW1lbnQpOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbiB8IG51bGwge1xuICBpZiAoaXNTaW1wbGVDYWxsZWUobm9kZSkpIHtcbiAgICByZXR1cm4gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5uYW1lc3BhY2VkKEFTVHYyLkZyZWVWYXJOYW1lc3BhY2UuQ29tcG9uZW50KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5mYWxsYmFjaygpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDb21wb25lbnRTeW50YXhDb250ZXh0KG5vZGU6IEFTVHYxLlBhdGhFeHByZXNzaW9uKTogQVNUdjIuRnJlZVZhclJlc29sdXRpb24gfCBudWxsIHtcbiAgaWYgKGlzU2ltcGxlUGF0aChub2RlKSkge1xuICAgIHJldHVybiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLm5hbWVzcGFjZWQoQVNUdjIuRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQsIHRydWUpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjb3JyZXNwb25kcyB0byBhcHBlbmQgcG9zaXRpb25zICh0ZXh0IGN1cmxpZXMgb3IgYXR0cmlidXRlXG4gKiBjdXJsaWVzKS4gSW4gc3RyaWN0IG1vZGUsIHRoaXMgYWxzbyBjb3JyZXNwb25kcyB0byBhcmcgY3VybGllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEF0dHJWYWx1ZVN5bnRheENvbnRleHQobm9kZTogQVNUdjEuTXVzdGFjaGVTdGF0ZW1lbnQpOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbiB7XG4gIGxldCBpc1NpbXBsZSA9IGlzU2ltcGxlQ2FsbGVlKG5vZGUpO1xuICBsZXQgaXNJbnZva2UgPSBpc0ludm9rZU5vZGUobm9kZSk7XG5cbiAgaWYgKGlzU2ltcGxlKSB7XG4gICAgcmV0dXJuIGlzSW52b2tlXG4gICAgICA/IEFTVHYyLkxvb3NlTW9kZVJlc29sdXRpb24ubmFtZXNwYWNlZChBU1R2Mi5GcmVlVmFyTmFtZXNwYWNlLkhlbHBlcilcbiAgICAgIDogQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5hdHRyKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlzSW52b2tlID8gQVNUdjIuU1RSSUNUX1JFU09MVVRJT04gOiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLmZhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNvcnJlc3BvbmRzIHRvIGFwcGVuZCBwb3NpdGlvbnMgKHRleHQgY3VybGllcyBvciBhdHRyaWJ1dGVcbiAqIGN1cmxpZXMpLiBJbiBzdHJpY3QgbW9kZSwgdGhpcyBhbHNvIGNvcnJlc3BvbmRzIHRvIGFyZyBjdXJsaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBwZW5kU3ludGF4Q29udGV4dChub2RlOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCk6IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uIHtcbiAgbGV0IGlzU2ltcGxlID0gaXNTaW1wbGVDYWxsZWUobm9kZSk7XG4gIGxldCBpc0ludm9rZSA9IGlzSW52b2tlTm9kZShub2RlKTtcbiAgbGV0IHRydXN0aW5nID0gbm9kZS50cnVzdGluZztcblxuICBpZiAoaXNTaW1wbGUpIHtcbiAgICByZXR1cm4gdHJ1c3RpbmdcbiAgICAgID8gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi50cnVzdGluZ0FwcGVuZCh7IGludm9rZTogaXNJbnZva2UgfSlcbiAgICAgIDogQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5hcHBlbmQoeyBpbnZva2U6IGlzSW52b2tlIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLmZhbGxiYWNrKCk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVzb2x1dGlvbjxQIGV4dGVuZHMgQXN0Q2FsbFBhcnRzIHwgQVNUdjEuUGF0aEV4cHJlc3Npb24+ID0gKFxuICBjYWxsOiBQXG4pID0+IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uIHwgbnVsbDtcblxuLy8gVVRJTElUSUVTXG5cbi8qKlxuICogQSBjYWxsIG5vZGUgaGFzIGEgc2ltcGxlIGNhbGxlZSBpZiBpdHMgaGVhZCBpczpcbiAqXG4gKiAtIGEgYFBhdGhFeHByZXNzaW9uYFxuICogLSB0aGUgYFBhdGhFeHByZXNzaW9uYCdzIGhlYWQgaXMgYSBgVmFySGVhZGBcbiAqIC0gaXQgaGFzIG5vIHRhaWxcbiAqXG4gKiBTaW1wbGUgaGVhZHM6XG4gKlxuICogYGBgXG4gKiB7e3h9fVxuICoge3t4IHl9fVxuICogYGBgXG4gKlxuICogTm90IHNpbXBsZSBoZWFkczpcbiAqXG4gKiBgYGBcbiAqIHt7eC55fX1cbiAqIHt7eC55IHp9fVxuICoge3tAeH19XG4gKiB7e0B4IGF9fVxuICoge3t0aGlzfX1cbiAqIHt7dGhpcyBhfX1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiBpc1NpbXBsZUNhbGxlZShub2RlOiBBc3RDYWxsUGFydHMpOiBib29sZWFuIHtcbiAgbGV0IHBhdGggPSBub2RlLnBhdGg7XG5cbiAgcmV0dXJuIGlzU2ltcGxlUGF0aChwYXRoKTtcbn1cblxuZnVuY3Rpb24gaXNTaW1wbGVQYXRoKG5vZGU6IEFTVHYxLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJyAmJiBub2RlLmhlYWQudHlwZSA9PT0gJ1ZhckhlYWQnKSB7XG4gICAgcmV0dXJuIG5vZGUudGFpbC5sZW5ndGggPT09IDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGNhbGwgZXhwcmVzc2lvbiBoYXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LlxuICovXG5mdW5jdGlvbiBpc0ludm9rZU5vZGUobm9kZTogQXN0Q2FsbFBhcnRzKTogYm9vbGVhbiB7XG4gIHJldHVybiBub2RlLnBhcmFtcy5sZW5ndGggPiAwIHx8IG5vZGUuaGFzaC5wYWlycy5sZW5ndGggPiAwO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==