From b84f8e9234df47903e6bd90334e047d9ea32358f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 14 Aug 2017 17:11:05 +0200 Subject: [PATCH] Don't use _possibleConstructorReturn inside arrow functions (#6103) Arrow functions can't be entrly skipped while traversing because this references inside of them needs to be transformed, so I added a check which prevents return statements inside arrow functions from being saved for the transformation. Fixes #5817 (regression) --- .../babel-helper-replace-supers/src/index.js | 4 +++- .../test/fixtures/regression/5817/actual.js | 8 +++++++ .../test/fixtures/regression/5817/exec.js | 16 +++++++++++++ .../test/fixtures/regression/5817/expected.js | 24 +++++++++++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/exec.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/expected.js diff --git a/packages/babel-helper-replace-supers/src/index.js b/packages/babel-helper-replace-supers/src/index.js index 6af12830dc..dff7328e68 100644 --- a/packages/babel-helper-replace-supers/src/index.js +++ b/packages/babel-helper-replace-supers/src/index.js @@ -53,7 +53,9 @@ const visitor = { }, ReturnStatement(path, state) { - state.returns.push(path); + if (!path.getFunctionParent().isArrowFunctionExpression()) { + state.returns.push(path); + } }, ThisExpression(path, state) { diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/actual.js new file mode 100644 index 0000000000..b4ffadfbba --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/actual.js @@ -0,0 +1,8 @@ +class A extends B { + constructor() { + super(); + + this.arrow1 = (x) => { return x; }; + this.arrow2 = (x) => x; + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/exec.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/exec.js new file mode 100644 index 0000000000..16c12bc3c2 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/exec.js @@ -0,0 +1,16 @@ +// https://github.com/babel/babel/issues/5817 + +class Parent {} + +class Table extends Parent { + constructor() { + super(); + this.returnParam = (param) => { + return param; + } + } +} + +const table = new Table(); + +assert(table.returnParam(false) === false); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/expected.js new file mode 100644 index 0000000000..15d9c7f2a5 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/regression/5817/expected.js @@ -0,0 +1,24 @@ +"use strict"; + +var A = function (_B) { + babelHelpers.inherits(A, _B); + + function A() { + var _this; + + babelHelpers.classCallCheck(this, A); + _this = babelHelpers.possibleConstructorReturn(this, (A.__proto__ || Object.getPrototypeOf(A)).call(this)); + + _this.arrow1 = function (x) { + return x; + }; + + _this.arrow2 = function (x) { + return x; + }; + + return _this; + } + + return A; +}(B);