From a86d14de6179fe9a0faf23a87277899c117cfe3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 12 Apr 2018 21:58:34 +0200 Subject: [PATCH] Disallow super() in class properties --- packages/babylon/src/parser/statement.js | 6 ++++++ .../class-private-properties/super-call/input.js | 7 +++++++ .../class-private-properties/super-call/options.json | 4 ++++ .../experimental/class-properties/super-call/input.js | 7 +++++++ .../experimental/class-properties/super-call/options.json | 4 ++++ 5 files changed, 28 insertions(+) create mode 100644 packages/babylon/test/fixtures/experimental/class-private-properties/super-call/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-private-properties/super-call/options.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/super-call/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/super-call/options.json diff --git a/packages/babylon/src/parser/statement.js b/packages/babylon/src/parser/statement.js index ce4722a437..68f9cd0d75 100644 --- a/packages/babylon/src/parser/statement.js +++ b/packages/babylon/src/parser/statement.js @@ -1294,10 +1294,13 @@ export default class StatementParser extends ExpressionParser { parseClassPrivateProperty( node: N.ClassPrivateProperty, ): N.ClassPrivateProperty { + const oldInMethod = this.state.inMethod; + this.state.inMethod = false; this.state.inClassProperty = true; node.value = this.eat(tt.eq) ? this.parseMaybeAssign() : null; this.semicolon(); this.state.inClassProperty = false; + this.state.inMethod = oldInMethod; return this.finishNode(node, "ClassPrivateProperty"); } @@ -1306,6 +1309,8 @@ export default class StatementParser extends ExpressionParser { this.expectPlugin("classProperties"); } + const oldInMethod = this.state.inMethod; + this.state.inMethod = false; this.state.inClassProperty = true; if (this.match(tt.eq)) { @@ -1317,6 +1322,7 @@ export default class StatementParser extends ExpressionParser { } this.semicolon(); this.state.inClassProperty = false; + this.state.inMethod = oldInMethod; return this.finishNode(node, "ClassProperty"); } diff --git a/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/input.js b/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/input.js new file mode 100644 index 0000000000..3087bc1f35 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/input.js @@ -0,0 +1,7 @@ +class A extends B { + constructor() { + class C extends D { + #foo = super(); + } + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/options.json b/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/options.json new file mode 100644 index 0000000000..e20043c3fa --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-private-properties/super-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classPrivateProperties"], + "throws": "super() is only valid inside a class constructor. Make sure the method name is spelled exactly as 'constructor'. (4:13)" +} diff --git a/packages/babylon/test/fixtures/experimental/class-properties/super-call/input.js b/packages/babylon/test/fixtures/experimental/class-properties/super-call/input.js new file mode 100644 index 0000000000..f4d90f19b2 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/super-call/input.js @@ -0,0 +1,7 @@ +class A extends B { + constructor() { + class C extends D { + foo = super(); + } + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/super-call/options.json b/packages/babylon/test/fixtures/experimental/class-properties/super-call/options.json new file mode 100644 index 0000000000..3f06e4fecf --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/super-call/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classProperties"], + "throws": "super() is only valid inside a class constructor. Make sure the method name is spelled exactly as 'constructor'. (4:12)" +}