From 9a270a3d0a9a0dd90af26b9d323189707e038045 Mon Sep 17 00:00:00 2001 From: phantom10111 Date: Wed, 25 Nov 2015 21:59:23 +0100 Subject: [PATCH] Fix return super(); in class constructor - fixes T2997 --- .../test/fixtures/general/derived/expected.js | 4 ++-- .../src/vanilla.js | 10 +++++++++- .../test/fixtures/regression/T2997/actual.js | 7 +++++++ .../fixtures/regression/T2997/expected.js | 20 +++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js diff --git a/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js b/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js index 09a524f94c..7bf3a94664 100644 --- a/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js +++ b/packages/babel-plugin-transform-class-properties/test/fixtures/general/derived/expected.js @@ -2,10 +2,10 @@ var Foo = (function (_Bar) { babelHelpers.inherits(Foo, _Bar); function Foo(...args) { - var _temp, _this; + var _temp, _this, _ret; babelHelpers.classCallCheck(this, Foo); - return babelHelpers.possibleConstructorReturn(_this, (_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, ...args)), _this), _this.bar = "foo", _temp)); + return _ret = (_temp = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(Foo).call(this, ...args)), _this), _this.bar = "foo", _temp), babelHelpers.possibleConstructorReturn(_this, _ret); } return Foo; diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index 749ebd91c1..3c2befb7a5 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -433,7 +433,15 @@ export default class ClassTransformer { } for (let returnPath of this.superReturns) { - returnPath.get("argument").replaceWith(wrapReturn(returnPath.node.argument)); + if (returnPath.node.argument) { + let ref = returnPath.scope.generateDeclaredUidIdentifier("ret"); + returnPath.get("argument").replaceWithMultiple([ + t.assignmentExpression("=", ref, returnPath.node.argument), + wrapReturn(ref) + ]); + } else { + returnPath.get("argument").replaceWith(wrapReturn()) + } } } diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/actual.js new file mode 100644 index 0000000000..a7f87b0fad --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/actual.js @@ -0,0 +1,7 @@ +class A {} + +class B extends A { + constructor() { + return super(); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js new file mode 100644 index 0000000000..92e540a4a2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/T2997/expected.js @@ -0,0 +1,20 @@ +"use strict"; + +var A = function A() { + babelHelpers.classCallCheck(this, A); +}; + +var B = (function (_A) { + babelHelpers.inherits(B, _A); + + function B() { + var _this, _ret; + + babelHelpers.classCallCheck(this, B); + + return _ret = (_this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(B).call(this)), _this), babelHelpers.possibleConstructorReturn(_this, _ret); + } + + return B; +})(A); +