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. let isSimple = isSimpleCallee(node);
  44. let 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. let isSimple = isSimpleCallee(node);
  59. let isInvoke = isInvokeNode(node);
  60. let 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. let 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdjItYS9sb29zZS1yZXNvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxLQUFaLE1BQXVCLE9BQXZCO0FBWUEsT0FBTSxTQUFVLGlCQUFWLENBQTRCLElBQTVCLEVBQXFEO0FBQ3pELE1BQUksY0FBYyxDQUFDLElBQUQsQ0FBbEIsRUFBMEI7QUFDeEIsV0FBTyxLQUFLLENBQUMsbUJBQU4sQ0FBMEIsVUFBMUIsQ0FBb0M7QUFBQTtBQUFwQyxLQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBTyxJQUFQO0FBQ0Q7QUFDRjtBQUVELE9BQU0sU0FBVSxxQkFBVixDQUNKLElBREksRUFDZ0M7QUFFcEMsTUFBSSxjQUFjLENBQUMsSUFBRCxDQUFsQixFQUEwQjtBQUN4QixXQUFPLEtBQUssQ0FBQyxtQkFBTixDQUEwQixVQUExQixDQUFvQztBQUFBO0FBQXBDLEtBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxXQUFPLElBQVA7QUFDRDtBQUNGO0FBRUQsT0FBTSxTQUFVLGtCQUFWLENBQTZCLElBQTdCLEVBQXVEO0FBQzNELE1BQUksY0FBYyxDQUFDLElBQUQsQ0FBbEIsRUFBMEI7QUFDeEIsV0FBTyxLQUFLLENBQUMsbUJBQU4sQ0FBMEIsVUFBMUIsQ0FBb0M7QUFBQTtBQUFwQyxLQUFQO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBTyxLQUFLLENBQUMsbUJBQU4sQ0FBMEIsUUFBMUIsRUFBUDtBQUNEO0FBQ0Y7QUFFRCxPQUFNLFNBQVUsc0JBQVYsQ0FBaUMsSUFBakMsRUFBMkQ7QUFDL0QsTUFBSSxZQUFZLENBQUMsSUFBRCxDQUFoQixFQUF3QjtBQUN0QixXQUFPLEtBQUssQ0FBQyxtQkFBTixDQUEwQixVQUExQixDQUFvQztBQUFBO0FBQXBDLE1BQXVFLElBQXZFLENBQVA7QUFDRCxHQUZELE1BRU87QUFDTCxXQUFPLElBQVA7QUFDRDtBQUNGO0FBRUQ7Ozs7O0FBSUEsT0FBTSxTQUFVLHNCQUFWLENBQWlDLElBQWpDLEVBQThEO0FBQ2xFLE1BQUksUUFBUSxHQUFHLGNBQWMsQ0FBQyxJQUFELENBQTdCO0FBQ0EsTUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUQsQ0FBM0I7O0FBRUEsTUFBSSxRQUFKLEVBQWM7QUFDWixXQUFPLFFBQVEsR0FDWCxLQUFLLENBQUMsbUJBQU4sQ0FBMEIsVUFBMUIsQ0FBb0M7QUFBQTtBQUFwQyxLQURXLEdBRVgsS0FBSyxDQUFDLG1CQUFOLENBQTBCLElBQTFCLEVBRko7QUFHRCxHQUpELE1BSU87QUFDTCxXQUFPLFFBQVEsR0FBRyxLQUFLLENBQUMsaUJBQVQsR0FBNkIsS0FBSyxDQUFDLG1CQUFOLENBQTBCLFFBQTFCLEVBQTVDO0FBQ0Q7QUFDRjtBQUVEOzs7OztBQUlBLE9BQU0sU0FBVSxtQkFBVixDQUE4QixJQUE5QixFQUEyRDtBQUMvRCxNQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsSUFBRCxDQUE3QjtBQUNBLE1BQUksUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFELENBQTNCO0FBQ0EsTUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQXBCOztBQUVBLE1BQUksUUFBSixFQUFjO0FBQ1osV0FBTyxRQUFRLEdBQ1gsS0FBSyxDQUFDLG1CQUFOLENBQTBCLGNBQTFCLENBQXlDO0FBQUUsTUFBQSxNQUFNLEVBQUU7QUFBVixLQUF6QyxDQURXLEdBRVgsS0FBSyxDQUFDLG1CQUFOLENBQTBCLE1BQTFCLENBQWlDO0FBQUUsTUFBQSxNQUFNLEVBQUU7QUFBVixLQUFqQyxDQUZKO0FBR0QsR0FKRCxNQUlPO0FBQ0wsV0FBTyxLQUFLLENBQUMsbUJBQU4sQ0FBMEIsUUFBMUIsRUFBUDtBQUNEO0FBQ0YsQyxDQU1EOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQSxTQUFTLGNBQVQsQ0FBd0IsSUFBeEIsRUFBMEM7QUFDeEMsTUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQWhCO0FBRUEsU0FBTyxZQUFZLENBQUMsSUFBRCxDQUFuQjtBQUNEOztBQUVELFNBQVMsWUFBVCxDQUFzQixJQUF0QixFQUE0QztBQUMxQyxNQUFJLElBQUksQ0FBQyxJQUFMLEtBQWMsZ0JBQWQsSUFBa0MsSUFBSSxDQUFDLElBQUwsQ0FBVSxJQUFWLEtBQW1CLFNBQXpELEVBQW9FO0FBQ2xFLFdBQU8sSUFBSSxDQUFDLElBQUwsQ0FBVSxNQUFWLEtBQXFCLENBQTVCO0FBQ0QsR0FGRCxNQUVPO0FBQ0wsV0FBTyxLQUFQO0FBQ0Q7QUFDRjtBQUVEOzs7OztBQUdBLFNBQVMsWUFBVCxDQUFzQixJQUF0QixFQUF3QztBQUN0QyxTQUFPLElBQUksQ0FBQyxNQUFMLENBQVksTUFBWixHQUFxQixDQUFyQixJQUEwQixJQUFJLENBQUMsSUFBTCxDQUFVLEtBQVYsQ0FBZ0IsTUFBaEIsR0FBeUIsQ0FBMUQ7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFTVHYxIGZyb20gJy4uL3YxL2FwaSc7XG5pbXBvcnQgKiBhcyBBU1R2MiBmcm9tICcuL2FwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0Q2FsbFBhcnRzIHtcbiAgcGF0aDogQVNUdjEuRXhwcmVzc2lvbjtcbiAgcGFyYW1zOiBBU1R2MS5FeHByZXNzaW9uW107XG4gIGhhc2g6IEFTVHYxLkhhc2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFyUGF0aCBleHRlbmRzIEFTVHYxLlBhdGhFeHByZXNzaW9uIHtcbiAgaGVhZDogQVNUdjEuVmFySGVhZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFNleHBTeW50YXhDb250ZXh0KG5vZGU6IEFTVHYxLlN1YkV4cHJlc3Npb24pOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbiB8IG51bGwge1xuICBpZiAoaXNTaW1wbGVDYWxsZWUobm9kZSkpIHtcbiAgICByZXR1cm4gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5uYW1lc3BhY2VkKEFTVHYyLkZyZWVWYXJOYW1lc3BhY2UuSGVscGVyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTW9kaWZpZXJTeW50YXhDb250ZXh0KFxuICBub2RlOiBBU1R2MS5FbGVtZW50TW9kaWZpZXJTdGF0ZW1lbnRcbik6IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uIHwgbnVsbCB7XG4gIGlmIChpc1NpbXBsZUNhbGxlZShub2RlKSkge1xuICAgIHJldHVybiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLm5hbWVzcGFjZWQoQVNUdjIuRnJlZVZhck5hbWVzcGFjZS5Nb2RpZmllcik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEJsb2NrU3ludGF4Q29udGV4dChub2RlOiBBU1R2MS5CbG9ja1N0YXRlbWVudCk6IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uIHwgbnVsbCB7XG4gIGlmIChpc1NpbXBsZUNhbGxlZShub2RlKSkge1xuICAgIHJldHVybiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLm5hbWVzcGFjZWQoQVNUdjIuRnJlZVZhck5hbWVzcGFjZS5Db21wb25lbnQpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLmZhbGxiYWNrKCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENvbXBvbmVudFN5bnRheENvbnRleHQobm9kZTogQVNUdjEuUGF0aEV4cHJlc3Npb24pOiBBU1R2Mi5GcmVlVmFyUmVzb2x1dGlvbiB8IG51bGwge1xuICBpZiAoaXNTaW1wbGVQYXRoKG5vZGUpKSB7XG4gICAgcmV0dXJuIEFTVHYyLkxvb3NlTW9kZVJlc29sdXRpb24ubmFtZXNwYWNlZChBU1R2Mi5GcmVlVmFyTmFtZXNwYWNlLkNvbXBvbmVudCwgdHJ1ZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGNvcnJlc3BvbmRzIHRvIGFwcGVuZCBwb3NpdGlvbnMgKHRleHQgY3VybGllcyBvciBhdHRyaWJ1dGVcbiAqIGN1cmxpZXMpLiBJbiBzdHJpY3QgbW9kZSwgdGhpcyBhbHNvIGNvcnJlc3BvbmRzIHRvIGFyZyBjdXJsaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXR0clZhbHVlU3ludGF4Q29udGV4dChub2RlOiBBU1R2MS5NdXN0YWNoZVN0YXRlbWVudCk6IEFTVHYyLkZyZWVWYXJSZXNvbHV0aW9uIHtcbiAgbGV0IGlzU2ltcGxlID0gaXNTaW1wbGVDYWxsZWUobm9kZSk7XG4gIGxldCBpc0ludm9rZSA9IGlzSW52b2tlTm9kZShub2RlKTtcblxuICBpZiAoaXNTaW1wbGUpIHtcbiAgICByZXR1cm4gaXNJbnZva2VcbiAgICAgID8gQVNUdjIuTG9vc2VNb2RlUmVzb2x1dGlvbi5uYW1lc3BhY2VkKEFTVHYyLkZyZWVWYXJOYW1lc3BhY2UuSGVscGVyKVxuICAgICAgOiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLmF0dHIoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gaXNJbnZva2UgPyBBU1R2Mi5TVFJJQ1RfUkVTT0xVVElPTiA6IEFTVHYyLkxvb3NlTW9kZVJlc29sdXRpb24uZmFsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgY29ycmVzcG9uZHMgdG8gYXBwZW5kIHBvc2l0aW9ucyAodGV4dCBjdXJsaWVzIG9yIGF0dHJpYnV0ZVxuICogY3VybGllcykuIEluIHN0cmljdCBtb2RlLCB0aGlzIGFsc28gY29ycmVzcG9uZHMgdG8gYXJnIGN1cmxpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcHBlbmRTeW50YXhDb250ZXh0KG5vZGU6IEFTVHYxLk11c3RhY2hlU3RhdGVtZW50KTogQVNUdjIuRnJlZVZhclJlc29sdXRpb24ge1xuICBsZXQgaXNTaW1wbGUgPSBpc1NpbXBsZUNhbGxlZShub2RlKTtcbiAgbGV0IGlzSW52b2tlID0gaXNJbnZva2VOb2RlKG5vZGUpO1xuICBsZXQgdHJ1c3RpbmcgPSBub2RlLnRydXN0aW5nO1xuXG4gIGlmIChpc1NpbXBsZSkge1xuICAgIHJldHVybiB0cnVzdGluZ1xuICAgICAgPyBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLnRydXN0aW5nQXBwZW5kKHsgaW52b2tlOiBpc0ludm9rZSB9KVxuICAgICAgOiBBU1R2Mi5Mb29zZU1vZGVSZXNvbHV0aW9uLmFwcGVuZCh7IGludm9rZTogaXNJbnZva2UgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEFTVHYyLkxvb3NlTW9kZVJlc29sdXRpb24uZmFsbGJhY2soKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBSZXNvbHV0aW9uPFAgZXh0ZW5kcyBBc3RDYWxsUGFydHMgfCBBU1R2MS5QYXRoRXhwcmVzc2lvbj4gPSAoXG4gIGNhbGw6IFBcbikgPT4gQVNUdjIuRnJlZVZhclJlc29sdXRpb24gfCBudWxsO1xuXG4vLyBVVElMSVRJRVNcblxuLyoqXG4gKiBBIGNhbGwgbm9kZSBoYXMgYSBzaW1wbGUgY2FsbGVlIGlmIGl0cyBoZWFkIGlzOlxuICpcbiAqIC0gYSBgUGF0aEV4cHJlc3Npb25gXG4gKiAtIHRoZSBgUGF0aEV4cHJlc3Npb25gJ3MgaGVhZCBpcyBhIGBWYXJIZWFkYFxuICogLSBpdCBoYXMgbm8gdGFpbFxuICpcbiAqIFNpbXBsZSBoZWFkczpcbiAqXG4gKiBgYGBcbiAqIHt7eH19XG4gKiB7e3ggeX19XG4gKiBgYGBcbiAqXG4gKiBOb3Qgc2ltcGxlIGhlYWRzOlxuICpcbiAqIGBgYFxuICoge3t4Lnl9fVxuICoge3t4Lnkgen19XG4gKiB7e0B4fX1cbiAqIHt7QHggYX19XG4gKiB7e3RoaXN9fVxuICoge3t0aGlzIGF9fVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIGlzU2ltcGxlQ2FsbGVlKG5vZGU6IEFzdENhbGxQYXJ0cyk6IGJvb2xlYW4ge1xuICBsZXQgcGF0aCA9IG5vZGUucGF0aDtcblxuICByZXR1cm4gaXNTaW1wbGVQYXRoKHBhdGgpO1xufVxuXG5mdW5jdGlvbiBpc1NpbXBsZVBhdGgobm9kZTogQVNUdjEuRXhwcmVzc2lvbik6IGJvb2xlYW4ge1xuICBpZiAobm9kZS50eXBlID09PSAnUGF0aEV4cHJlc3Npb24nICYmIG5vZGUuaGVhZC50eXBlID09PSAnVmFySGVhZCcpIHtcbiAgICByZXR1cm4gbm9kZS50YWlsLmxlbmd0aCA9PT0gMDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY2FsbCBleHByZXNzaW9uIGhhcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGlzSW52b2tlTm9kZShub2RlOiBBc3RDYWxsUGFydHMpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5vZGUucGFyYW1zLmxlbmd0aCA+IDAgfHwgbm9kZS5oYXNoLnBhaXJzLmxlbmd0aCA+IDA7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9