index.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _helperEnvironmentVisitor = require("@babel/helper-environment-visitor");
  7. var _helperMemberExpressionToFunctions = require("@babel/helper-member-expression-to-functions");
  8. var _helperOptimiseCallExpression = require("@babel/helper-optimise-call-expression");
  9. var _template = require("@babel/template");
  10. var _traverse = require("@babel/traverse");
  11. var _t = require("@babel/types");
  12. const {
  13. assignmentExpression,
  14. booleanLiteral,
  15. callExpression,
  16. cloneNode,
  17. identifier,
  18. memberExpression,
  19. sequenceExpression,
  20. stringLiteral,
  21. thisExpression
  22. } = _t;
  23. {
  24. {
  25. {
  26. const ns = require("@babel/helper-environment-visitor");
  27. exports.environmentVisitor = ns.default;
  28. exports.skipAllButComputedKey = ns.skipAllButComputedKey;
  29. }
  30. }
  31. }
  32. function getPrototypeOfExpression(objectRef, isStatic, file, isPrivateMethod) {
  33. objectRef = cloneNode(objectRef);
  34. const targetRef = isStatic || isPrivateMethod ? objectRef : memberExpression(objectRef, identifier("prototype"));
  35. return callExpression(file.addHelper("getPrototypeOf"), [targetRef]);
  36. }
  37. const visitor = _traverse.default.visitors.merge([_helperEnvironmentVisitor.default, {
  38. Super(path, state) {
  39. const {
  40. node,
  41. parentPath
  42. } = path;
  43. if (!parentPath.isMemberExpression({
  44. object: node
  45. })) return;
  46. state.handle(parentPath);
  47. }
  48. }]);
  49. const unshadowSuperBindingVisitor = _traverse.default.visitors.merge([_helperEnvironmentVisitor.default, {
  50. Scopable(path, {
  51. refName
  52. }) {
  53. const binding = path.scope.getOwnBinding(refName);
  54. if (binding && binding.identifier.name === refName) {
  55. path.scope.rename(refName);
  56. }
  57. }
  58. }]);
  59. const specHandlers = {
  60. memoise(superMember, count) {
  61. const {
  62. scope,
  63. node
  64. } = superMember;
  65. const {
  66. computed,
  67. property
  68. } = node;
  69. if (!computed) {
  70. return;
  71. }
  72. const memo = scope.maybeGenerateMemoised(property);
  73. if (!memo) {
  74. return;
  75. }
  76. this.memoiser.set(property, memo, count);
  77. },
  78. prop(superMember) {
  79. const {
  80. computed,
  81. property
  82. } = superMember.node;
  83. if (this.memoiser.has(property)) {
  84. return cloneNode(this.memoiser.get(property));
  85. }
  86. if (computed) {
  87. return cloneNode(property);
  88. }
  89. return stringLiteral(property.name);
  90. },
  91. get(superMember) {
  92. return this._get(superMember, this._getThisRefs());
  93. },
  94. _get(superMember, thisRefs) {
  95. const proto = getPrototypeOfExpression(this.getObjectRef(), this.isStatic, this.file, this.isPrivateMethod);
  96. return callExpression(this.file.addHelper("get"), [thisRefs.memo ? sequenceExpression([thisRefs.memo, proto]) : proto, this.prop(superMember), thisRefs.this]);
  97. },
  98. _getThisRefs() {
  99. if (!this.isDerivedConstructor) {
  100. return {
  101. this: thisExpression()
  102. };
  103. }
  104. const thisRef = this.scope.generateDeclaredUidIdentifier("thisSuper");
  105. return {
  106. memo: assignmentExpression("=", thisRef, thisExpression()),
  107. this: cloneNode(thisRef)
  108. };
  109. },
  110. set(superMember, value) {
  111. const thisRefs = this._getThisRefs();
  112. const proto = getPrototypeOfExpression(this.getObjectRef(), this.isStatic, this.file, this.isPrivateMethod);
  113. return callExpression(this.file.addHelper("set"), [thisRefs.memo ? sequenceExpression([thisRefs.memo, proto]) : proto, this.prop(superMember), value, thisRefs.this, booleanLiteral(superMember.isInStrictMode())]);
  114. },
  115. destructureSet(superMember) {
  116. throw superMember.buildCodeFrameError(`Destructuring to a super field is not supported yet.`);
  117. },
  118. call(superMember, args) {
  119. const thisRefs = this._getThisRefs();
  120. return (0, _helperOptimiseCallExpression.default)(this._get(superMember, thisRefs), cloneNode(thisRefs.this), args, false);
  121. },
  122. optionalCall(superMember, args) {
  123. const thisRefs = this._getThisRefs();
  124. return (0, _helperOptimiseCallExpression.default)(this._get(superMember, thisRefs), cloneNode(thisRefs.this), args, true);
  125. },
  126. delete(superMember) {
  127. if (superMember.node.computed) {
  128. return sequenceExpression([callExpression(this.file.addHelper("toPropertyKey"), [cloneNode(superMember.node.property)]), _template.default.expression.ast`
  129. function () { throw new ReferenceError("'delete super[expr]' is invalid"); }()
  130. `]);
  131. } else {
  132. return _template.default.expression.ast`
  133. function () { throw new ReferenceError("'delete super.prop' is invalid"); }()
  134. `;
  135. }
  136. }
  137. };
  138. const looseHandlers = Object.assign({}, specHandlers, {
  139. prop(superMember) {
  140. const {
  141. property
  142. } = superMember.node;
  143. if (this.memoiser.has(property)) {
  144. return cloneNode(this.memoiser.get(property));
  145. }
  146. return cloneNode(property);
  147. },
  148. get(superMember) {
  149. const {
  150. isStatic,
  151. getSuperRef
  152. } = this;
  153. const {
  154. computed
  155. } = superMember.node;
  156. const prop = this.prop(superMember);
  157. let object;
  158. if (isStatic) {
  159. var _getSuperRef;
  160. object = (_getSuperRef = getSuperRef()) != null ? _getSuperRef : memberExpression(identifier("Function"), identifier("prototype"));
  161. } else {
  162. var _getSuperRef2;
  163. object = memberExpression((_getSuperRef2 = getSuperRef()) != null ? _getSuperRef2 : identifier("Object"), identifier("prototype"));
  164. }
  165. return memberExpression(object, prop, computed);
  166. },
  167. set(superMember, value) {
  168. const {
  169. computed
  170. } = superMember.node;
  171. const prop = this.prop(superMember);
  172. return assignmentExpression("=", memberExpression(thisExpression(), prop, computed), value);
  173. },
  174. destructureSet(superMember) {
  175. const {
  176. computed
  177. } = superMember.node;
  178. const prop = this.prop(superMember);
  179. return memberExpression(thisExpression(), prop, computed);
  180. },
  181. call(superMember, args) {
  182. return (0, _helperOptimiseCallExpression.default)(this.get(superMember), thisExpression(), args, false);
  183. },
  184. optionalCall(superMember, args) {
  185. return (0, _helperOptimiseCallExpression.default)(this.get(superMember), thisExpression(), args, true);
  186. }
  187. });
  188. class ReplaceSupers {
  189. constructor(opts) {
  190. var _opts$constantSuper;
  191. const path = opts.methodPath;
  192. this.methodPath = path;
  193. this.isDerivedConstructor = path.isClassMethod({
  194. kind: "constructor"
  195. }) && !!opts.superRef;
  196. this.isStatic = path.isObjectMethod() || path.node.static || (path.isStaticBlock == null ? void 0 : path.isStaticBlock());
  197. this.isPrivateMethod = path.isPrivate() && path.isMethod();
  198. this.file = opts.file;
  199. this.constantSuper = (_opts$constantSuper = opts.constantSuper) != null ? _opts$constantSuper : opts.isLoose;
  200. this.opts = opts;
  201. }
  202. getObjectRef() {
  203. return cloneNode(this.opts.objectRef || this.opts.getObjectRef());
  204. }
  205. getSuperRef() {
  206. if (this.opts.superRef) return cloneNode(this.opts.superRef);
  207. if (this.opts.getSuperRef) {
  208. return cloneNode(this.opts.getSuperRef());
  209. }
  210. }
  211. replace() {
  212. if (this.opts.refToPreserve) {
  213. this.methodPath.traverse(unshadowSuperBindingVisitor, {
  214. refName: this.opts.refToPreserve.name
  215. });
  216. }
  217. const handler = this.constantSuper ? looseHandlers : specHandlers;
  218. (0, _helperMemberExpressionToFunctions.default)(this.methodPath, visitor, Object.assign({
  219. file: this.file,
  220. scope: this.methodPath.scope,
  221. isDerivedConstructor: this.isDerivedConstructor,
  222. isStatic: this.isStatic,
  223. isPrivateMethod: this.isPrivateMethod,
  224. getObjectRef: this.getObjectRef.bind(this),
  225. getSuperRef: this.getSuperRef.bind(this),
  226. boundGet: handler.get
  227. }, handler));
  228. }
  229. }
  230. exports.default = ReplaceSupers;
  231. //# sourceMappingURL=index.js.map