From 819056e94a333affe3aadd482b965abab69c48d7 Mon Sep 17 00:00:00 2001 From: Sven SAULEAU Date: Tue, 7 Mar 2017 20:05:26 +0100 Subject: [PATCH 1/2] fix: remove check for super in arrow function --- .../src/vanilla.js | 9 +++++++-- .../super-reference-before-in-lambda/actual.js | 6 ++++++ .../super-reference-before-in-lambda/expected.js | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index 3315509c4e..e877902385 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -23,15 +23,20 @@ const noMethodVisitor = { }; const verifyConstructorVisitor = visitors.merge([noMethodVisitor, { - Super(path) { + Super(path, state) { if ( this.isDerived && !this.hasBareSuper && - !path.parentPath.isCallExpression({ callee: path.node }) + !path.parentPath.isCallExpression({ callee: path.node }) && + !state.inArrowFunctionExpression ) { throw path.buildCodeFrameError("'super.*' is not allowed before super()"); } }, + ArrowFunctionExpression(path, state) { + state.inArrowFunctionExpression = true; + }, + CallExpression: { exit(path) { if (path.get("callee").isSuper()) { diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/actual.js new file mode 100644 index 0000000000..59fd18c227 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/actual.js @@ -0,0 +1,6 @@ +class Foo extends Bar { + constructor() { + const t = () => super.test() + super(); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js new file mode 100644 index 0000000000..fb5754c8ec --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda/expected.js @@ -0,0 +1,14 @@ +var Foo = function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + var t = () => babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), "test", _this).call(_this); + return _this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)); + } + + return Foo; +}(Bar); From bf9b4347366cc61e00944ac22cf061bff4b17a19 Mon Sep 17 00:00:00 2001 From: Sven SAULEAU Date: Tue, 7 Mar 2017 21:19:06 +0100 Subject: [PATCH 2/2] refactor: search parent instead of using state --- .../src/vanilla.js | 15 +++++++-------- .../super-reference-before-in-lambda-2/actual.js | 7 +++++++ .../options.json | 3 +++ 3 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js create mode 100644 packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index e877902385..ce480f5516 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -23,18 +23,17 @@ const noMethodVisitor = { }; const verifyConstructorVisitor = visitors.merge([noMethodVisitor, { - Super(path, state) { + Super(path) { if ( this.isDerived && !this.hasBareSuper && - !path.parentPath.isCallExpression({ callee: path.node }) && - !state.inArrowFunctionExpression + !path.parentPath.isCallExpression({ callee: path.node }) ) { - throw path.buildCodeFrameError("'super.*' is not allowed before super()"); - } - }, + const hasArrowFunctionParent = path.findParent((p) => p.isArrowFunctionExpression()); - ArrowFunctionExpression(path, state) { - state.inArrowFunctionExpression = true; + if (!hasArrowFunctionParent) { + throw path.buildCodeFrameError("'super.*' is not allowed before super()"); + } + } }, CallExpression: { diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js new file mode 100644 index 0000000000..1d570b180f --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/actual.js @@ -0,0 +1,7 @@ +class Foo extends Bar { + constructor() { + const t = () => super.test() + super.foo(); + super(); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json new file mode 100644 index 0000000000..fbca946296 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-in-lambda-2/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'super.*' is not allowed before super()" +}