diff --git a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js index ce480f5516..42d20bf368 100644 --- a/packages/babel-plugin-transform-es2015-classes/src/vanilla.js +++ b/packages/babel-plugin-transform-es2015-classes/src/vanilla.js @@ -23,17 +23,16 @@ const noMethodVisitor = { }; const verifyConstructorVisitor = visitors.merge([noMethodVisitor, { - Super(path) { - if ( - this.isDerived && !this.hasBareSuper && - !path.parentPath.isCallExpression({ callee: path.node }) - ) { - const hasArrowFunctionParent = path.findParent((p) => p.isArrowFunctionExpression()); - - if (!hasArrowFunctionParent) { - throw path.buildCodeFrameError("'super.*' is not allowed before super()"); + MemberExpression: { + exit(path) { + const objectPath = path.get("object"); + if (this.isDerived && !this.hasBareSuper && objectPath.isSuper()) { + const hasArrowFunctionParent = path.findParent((p) => p.isArrowFunctionExpression()); + if (!hasArrowFunctionParent) { + throw objectPath.buildCodeFrameError("'super.*' is not allowed before super()"); + } } - } + }, }, CallExpression: { diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/actual.js new file mode 100644 index 0000000000..7948cf6477 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/actual.js @@ -0,0 +1,5 @@ +class Foo extends Bar { + constructor() { + super.foo(super()); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json new file mode 100644 index 0000000000..fbca946296 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-before-bare-super-inline/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'super.*' is not allowed before super()" +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/actual.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/actual.js new file mode 100644 index 0000000000..199fa5c8b7 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/actual.js @@ -0,0 +1,5 @@ +class Foo extends Bar { + constructor() { + super[super().method](); + } +} diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/exec.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/exec.js new file mode 100644 index 0000000000..78a3b1ea51 --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/exec.js @@ -0,0 +1,20 @@ +let called = false; + +class A { + method() { + called = true; + } + + get methodName() { + return "method"; + } +} + +class B extends A { + constructor() { + super[super().methodName]() + } +} + +new B(); +assert.equal(called, true); diff --git a/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js new file mode 100644 index 0000000000..4b304a2a6e --- /dev/null +++ b/packages/babel-plugin-transform-es2015-classes/test/fixtures/spec/super-reference-in-prop-exression/expected.js @@ -0,0 +1,14 @@ +var Foo = function (_Bar) { + babelHelpers.inherits(Foo, _Bar); + + function Foo() { + var _this; + + babelHelpers.classCallCheck(this, Foo); + + babelHelpers.get(Foo.prototype.__proto__ || Object.getPrototypeOf(Foo.prototype), (_this = babelHelpers.possibleConstructorReturn(this, (Foo.__proto__ || Object.getPrototypeOf(Foo)).call(this)), _this).method, _this).call(_this); + return _this; + } + + return Foo; +}(Bar); \ No newline at end of file