From d6816f0e6c233879788bcad8e47763f91e1b8776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Thu, 22 Oct 2020 16:09:19 -0400 Subject: [PATCH] fix: support optionalCall in replace super handler (#12238) --- .../babel-helper-replace-supers/src/index.js | 14 +++++++++++++ .../input.js | 6 ++++++ .../options.json | 10 ++++++++++ .../output.js | 17 ++++++++++++++++ .../input.js | 6 ++++++ .../options.json | 10 ++++++++++ .../output.js | 20 +++++++++++++++++++ 7 files changed, 83 insertions(+) create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/output.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/input.js create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/options.json create mode 100644 packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/output.js diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 32e752de2f..cc0eec0cfe 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -166,6 +166,16 @@ const specHandlers = { false, ); }, + + optionalCall(superMember, args) { + const thisRefs = this._getThisRefs(); + return optimiseCall( + this._get(superMember, thisRefs), + t.cloneNode(thisRefs.this), + args, + true, + ); + }, }; const looseHandlers = { @@ -223,6 +233,10 @@ const looseHandlers = { call(superMember, args) { return optimiseCall(this.get(superMember), t.thisExpression(), args, false); }, + + optionalCall(superMember, args) { + return optimiseCall(this.get(superMember), t.thisExpression(), args, true); + }, }; type ReplaceSupersOptionsBase = {| diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/input.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/input.js new file mode 100644 index 0000000000..e0788b60b3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/input.js @@ -0,0 +1,6 @@ +class Test extends Foo { + constructor() { + super.foo?.bar; + super.foo?.(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/options.json b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/options.json new file mode 100644 index 0000000000..d969db5fb3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + ["proposal-optional-chaining", { "loose": true }], + "transform-function-name", + ["transform-classes", { "loose": true }], + ["transform-spread", { "loose": true }], + "transform-block-scoping" + ] +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/output.js b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/output.js new file mode 100644 index 0000000000..d076ccfc9c --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/loose/accessing-super-property-optional-chain/output.js @@ -0,0 +1,17 @@ +var Test = /*#__PURE__*/function (_Foo) { + "use strict"; + + babelHelpers.inheritsLoose(Test, _Foo); + + function Test() { + var _Foo$prototype$foo, _Foo$prototype$foo2; + + var _this; + + (_Foo$prototype$foo = _Foo.prototype.foo) == null ? void 0 : _Foo$prototype$foo.bar; + (_Foo$prototype$foo2 = _Foo.prototype.foo) == null ? void 0 : _Foo$prototype$foo2.call(babelHelpers.assertThisInitialized(_this)); + return babelHelpers.assertThisInitialized(_this); + } + + return Test; +}(Foo); diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/input.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/input.js new file mode 100644 index 0000000000..e0788b60b3 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/input.js @@ -0,0 +1,6 @@ +class Test extends Foo { + constructor() { + super.foo?.bar; + super.foo?.(); + } +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/options.json b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/options.json new file mode 100644 index 0000000000..1f88132a87 --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + ["external-helpers", { "helperVersion": "7.100.0" }], + "proposal-optional-chaining", + "transform-function-name", + "transform-classes", + "transform-spread", + "transform-block-scoping" + ] +} diff --git a/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/output.js b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/output.js new file mode 100644 index 0000000000..f42692c3ee --- /dev/null +++ b/packages/babel-plugin-transform-classes/test/fixtures/spec/accessing-super-property-optional-chain/output.js @@ -0,0 +1,20 @@ +var Test = /*#__PURE__*/function (_Foo) { + "use strict"; + + babelHelpers.inherits(Test, _Foo); + + var _super = babelHelpers.createSuper(Test); + + function Test() { + var _babelHelpers$get, _babelHelpers$get2; + + var _thisSuper, _thisSuper2, _this; + + babelHelpers.classCallCheck(this, Test); + (_babelHelpers$get = babelHelpers.get((_thisSuper = babelHelpers.assertThisInitialized(_this), babelHelpers.getPrototypeOf(Test.prototype)), "foo", _thisSuper)) === null || _babelHelpers$get === void 0 ? void 0 : _babelHelpers$get.bar; + (_babelHelpers$get2 = babelHelpers.get((_thisSuper2 = babelHelpers.assertThisInitialized(_this), babelHelpers.getPrototypeOf(Test.prototype)), "foo", _thisSuper2)) === null || _babelHelpers$get2 === void 0 ? void 0 : _babelHelpers$get2.call(_thisSuper2); + return babelHelpers.possibleConstructorReturn(_this); + } + + return Test; +}(Foo);