From e849c62144b26ed2f73f9d00c608128f4345ce7b Mon Sep 17 00:00:00 2001 From: Henry Zhu Date: Wed, 30 Dec 2015 13:09:01 -0500 Subject: [PATCH] `babylon`: throw parse error if class properties do not have a semicolon (fixes T6873) --- src/parser/statement.js | 6 ++++-- .../semicolons-required-with-value/actual.js | 3 +++ .../semicolons-required-with-value/options.json | 4 ++++ .../semicolons-required-without-value/actual.js | 3 +++ .../semicolons-required-without-value/options.json | 4 ++++ 5 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/experimental/class-properties/semicolons-required-with-value/actual.js create mode 100644 test/fixtures/experimental/class-properties/semicolons-required-with-value/options.json create mode 100644 test/fixtures/experimental/class-properties/semicolons-required-without-value/actual.js create mode 100644 test/fixtures/experimental/class-properties/semicolons-required-without-value/options.json diff --git a/src/parser/statement.js b/src/parser/statement.js index f58e661e83..6861b47bca 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -594,7 +594,7 @@ pp.parseClass = function (node, isStatement, optionalId) { }; pp.isClassProperty = function () { - return this.match(tt.eq) || this.isLineTerminator(); + return this.match(tt.eq) || this.match(tt.semi) || this.canInsertSemicolon(); }; pp.parseClassBody = function (node) { @@ -746,7 +746,9 @@ pp.parseClassProperty = function (node) { } else { node.value = null; } - this.semicolon(); + if (!this.eat(tt.semi)) { + this.raise(this.state.start, "A semicolon is required after a class property"); + } return this.finishNode(node, "ClassProperty"); }; diff --git a/test/fixtures/experimental/class-properties/semicolons-required-with-value/actual.js b/test/fixtures/experimental/class-properties/semicolons-required-with-value/actual.js new file mode 100644 index 0000000000..51ecdbb104 --- /dev/null +++ b/test/fixtures/experimental/class-properties/semicolons-required-with-value/actual.js @@ -0,0 +1,3 @@ +class A { + asdf = 1 +} diff --git a/test/fixtures/experimental/class-properties/semicolons-required-with-value/options.json b/test/fixtures/experimental/class-properties/semicolons-required-with-value/options.json new file mode 100644 index 0000000000..4bf955cfec --- /dev/null +++ b/test/fixtures/experimental/class-properties/semicolons-required-with-value/options.json @@ -0,0 +1,4 @@ +{ + "throws": "A semicolon is required after a class property (3:0)", + "plugins": ["classProperties"] +} diff --git a/test/fixtures/experimental/class-properties/semicolons-required-without-value/actual.js b/test/fixtures/experimental/class-properties/semicolons-required-without-value/actual.js new file mode 100644 index 0000000000..caa1ecf226 --- /dev/null +++ b/test/fixtures/experimental/class-properties/semicolons-required-without-value/actual.js @@ -0,0 +1,3 @@ +class A { + asdf +} diff --git a/test/fixtures/experimental/class-properties/semicolons-required-without-value/options.json b/test/fixtures/experimental/class-properties/semicolons-required-without-value/options.json new file mode 100644 index 0000000000..4bf955cfec --- /dev/null +++ b/test/fixtures/experimental/class-properties/semicolons-required-without-value/options.json @@ -0,0 +1,4 @@ +{ + "throws": "A semicolon is required after a class property (3:0)", + "plugins": ["classProperties"] +}