diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 553da03d61..0f70b8c3a7 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -994,8 +994,16 @@ export default class StatementParser extends ExpressionParser { this.next(); this.takeDecorators(node); this.parseClassId(node, isStatement, optionalId); + + // class bodies and heritages are implicitly strict + const oldStrict = this.state.strict; + this.state.strict = true; + this.parseClassSuper(node); this.parseClassBody(node); + + this.state.strict = oldStrict; + return this.finishNode( node, isStatement ? "ClassDeclaration" : "ClassExpression", @@ -1020,9 +1028,6 @@ export default class StatementParser extends ExpressionParser { } parseClassBody(node: N.Class): void { - // class bodies are implicitly strict - const oldStrict = this.state.strict; - this.state.strict = true; this.state.classLevel++; const state = { hadConstructor: false }; @@ -1087,7 +1092,6 @@ export default class StatementParser extends ExpressionParser { node.body = this.finishNode(classBody, "ClassBody"); this.state.classLevel--; - this.state.strict = oldStrict; } parseClassMember( diff --git a/packages/babel-parser/test/fixtures/es2015/class/extends-strict/input.js b/packages/babel-parser/test/fixtures/es2015/class/extends-strict/input.js new file mode 100644 index 0000000000..2bc6c813e8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/extends-strict/input.js @@ -0,0 +1,4 @@ +class C extends (function B() { + with ({}); + return B; +}()) {} diff --git a/packages/babel-parser/test/fixtures/es2015/class/extends-strict/options.json b/packages/babel-parser/test/fixtures/es2015/class/extends-strict/options.json new file mode 100644 index 0000000000..01d854a2e7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/class/extends-strict/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'with' in strict mode (2:2)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/yield/in-class-heritage/options.json b/packages/babel-parser/test/fixtures/es2015/yield/in-class-heritage/options.json index 7fc68d9650..a2857a14ad 100644 --- a/packages/babel-parser/test/fixtures/es2015/yield/in-class-heritage/options.json +++ b/packages/babel-parser/test/fixtures/es2015/yield/in-class-heritage/options.json @@ -1,3 +1,3 @@ { - "throws": "Unexpected token, expected \"{\" (1:22)" + "throws": "yield is a reserved word in strict mode (1:16)" } diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 9dbaf7fea2..9995fc2484 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -1611,7 +1611,6 @@ language/statements/class/elements/wrapped-in-sc-rs-private-setter-alt.js(defaul language/statements/class/elements/wrapped-in-sc-rs-private-setter-alt.js(strict mode) language/statements/class/elements/wrapped-in-sc-rs-private-setter.js(default) language/statements/class/elements/wrapped-in-sc-rs-private-setter.js(strict mode) -language/statements/class/strict-mode/with.js(default) language/statements/class/syntax/early-errors/class-definition-evaluation-block-duplicate-binding.js(default) language/statements/class/syntax/early-errors/class-definition-evaluation-block-duplicate-binding.js(strict mode) language/statements/class/syntax/early-errors/class-definition-evaluation-scriptbody-duplicate-binding.js(default)