From 0e4bb5ee3f32292563ed3fbfed863820748d91d0 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Sat, 4 Jul 2015 21:38:22 +0200 Subject: [PATCH] clean up verifyConstructor classes visitor and disallow super.* before super() in derived class constructors - fixes #1921 --- .../transformers/es6/classes/vanilla.js | 36 ++++++++----------- .../actual.js | 6 ++++ .../options.json | 3 ++ 3 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js create mode 100644 test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json diff --git a/src/babel/transformation/transformers/es6/classes/vanilla.js b/src/babel/transformation/transformers/es6/classes/vanilla.js index 29aba1938a..c358dfeba9 100644 --- a/src/babel/transformation/transformers/es6/classes/vanilla.js +++ b/src/babel/transformation/transformers/es6/classes/vanilla.js @@ -25,16 +25,12 @@ var collectPropertyReferencesVisitor = { }; var verifyConstructorVisitor = { - MethodDefinition: { - enter() { - this.skip(); - } + MethodDefinition() { + this.skip(); }, - Property: { - enter(node) { - if (node.method) this.skip(); - } + Property(node) { + if (node.method) this.skip(); }, CallExpression: { @@ -50,23 +46,19 @@ var verifyConstructorVisitor = { } }, - FunctionDeclaration: { - enter() { - this.skip(); + "FunctionDeclaration|FunctionExpression"() { + this.skip(); + }, + + ThisExpression(node, parent, scope, state) { + if (state.isDerived && !state.hasBareSuper) { + throw this.errorWithNode("'this' is not allowed before super()"); } }, - FunctionExpression: { - enter() { - this.skip(); - } - }, - - ThisExpression: { - enter(node, parent, scope, state) { - if (state.isDerived && !state.hasBareSuper) { - throw this.errorWithNode("'this' is not allowed before super()"); - } + Super(node, parent, scope, state) { + if (state.isDerived && !state.hasBareSuper && !this.parentPath.isCallExpression({ callee: node })) { + throw this.errorWithNode("'super.*' is not allowed before super()"); } } }; diff --git a/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js b/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js new file mode 100644 index 0000000000..5f16da11d7 --- /dev/null +++ b/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/actual.js @@ -0,0 +1,6 @@ +class Foo extends Bar { + constructor() { + super.foo(); + super(); + } +} diff --git a/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json b/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json new file mode 100644 index 0000000000..fbca946296 --- /dev/null +++ b/test/core/fixtures/transformation/es6.classes/super-reference-before-bare-super/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'super.*' is not allowed before super()" +}