Skip to content

Commit

Permalink
[parser] Disallow static fields named constructor (#10461)
Browse files Browse the repository at this point in the history
* Disallow static fields named `constructor` in a class

    - Disallowed static fields named `constructor` in a class (previously only non-static were disallowed)
    - Updated the text for the error for one consolidated warning, for both static and non-static fields
    - Added a test
    - Updated an existing test in the `flow` test suite of the parser to reflect the parse error.
  Strangely, the test used to pass and started failing when inlining the `isNonstaticConstructor` method, without any changes.
  In that test, `constructor` was a field, so in theory it should never have passed.
  Would appreciate some feedback on this, as I'm not 100% sure if this is somehow related to Flow

* Update test262 whitelist

* Add comment and fix && operator
  • Loading branch information
guywaldman authored and nicolo-ribaudo committed Sep 17, 2019
1 parent 87dc201 commit 9c1ad0a
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 182 deletions.
11 changes: 8 additions & 3 deletions packages/babel-parser/src/parser/statement.js
Expand Up @@ -1498,13 +1498,18 @@ export default class StatementParser extends ExpressionParser {
}

pushClassProperty(classBody: N.ClassBody, prop: N.ClassProperty) {
// This only affects properties, not methods.
if (this.isNonstaticConstructor(prop)) {
if (
!prop.computed &&
(prop.key.name === "constructor" || prop.key.value === "constructor")
) {
// Non-computed field, which is either an identifier named "constructor"
// or a string literal named "constructor"
this.raise(
prop.key.start,
"Classes may not have a non-static field named 'constructor'",
"Classes may not have a field named 'constructor'",
);
}

classBody.body.push(this.parseClassProperty(prop));
}

Expand Down
@@ -1,4 +1,4 @@
{
"throws": "Classes may not have a non-static field named 'constructor' (2:2)",
"throws": "Classes may not have a field named 'constructor' (2:2)",
"plugins": ["classProperties"]
}
@@ -1,4 +1,4 @@
{
"throws": "Classes may not have a non-static field named 'constructor' (2:2)",
"throws": "Classes may not have a field named 'constructor' (2:2)",
"plugins": ["classProperties"]
}
@@ -0,0 +1,3 @@
class Foo {
static constructor;
}
@@ -0,0 +1,4 @@
{
"throws": "Classes may not have a field named 'constructor' (2:11)",
"plugins": ["classProperties"]
}
@@ -1,3 +1,4 @@
{
"throws": "Classes may not have a field named 'constructor' (2:2)",
"plugins": ["jsx", "flow", "classProperties"]
}

This file was deleted.

8 changes: 0 additions & 8 deletions scripts/tests/test262/test262_whitelist.txt
Expand Up @@ -12,10 +12,6 @@ language/expressions/async-arrow-function/early-errors-arrow-await-in-formals.js
language/expressions/async-arrow-function/early-errors-arrow-await-in-formals.js(strict mode)
language/expressions/class/elements/fields-duplicate-privatenames.js(default)
language/expressions/class/elements/fields-duplicate-privatenames.js(strict mode)
language/expressions/class/elements/fields-literal-name-static-propname-constructor.js(default)
language/expressions/class/elements/fields-literal-name-static-propname-constructor.js(strict mode)
language/expressions/class/elements/fields-string-name-static-propname-constructor.js(default)
language/expressions/class/elements/fields-string-name-static-propname-constructor.js(strict mode)
language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js(default)
language/expressions/class/elements/private-methods/prod-private-method-initialize-order.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(default)
Expand Down Expand Up @@ -188,10 +184,6 @@ language/module-code/top-level-await/syntax/try-await-expr.js(default)
language/module-code/top-level-await/syntax/try-await-expr.js(strict mode)
language/statements/class/elements/fields-duplicate-privatenames.js(default)
language/statements/class/elements/fields-duplicate-privatenames.js(strict mode)
language/statements/class/elements/fields-literal-name-static-propname-constructor.js(default)
language/statements/class/elements/fields-literal-name-static-propname-constructor.js(strict mode)
language/statements/class/elements/fields-string-name-static-propname-constructor.js(default)
language/statements/class/elements/fields-string-name-static-propname-constructor.js(strict mode)
language/statements/class/elements/private-field-is-visible-in-computed-properties.js(default)
language/statements/class/elements/private-field-is-visible-in-computed-properties.js(strict mode)
language/statements/class/elements/private-field-with-initialized-id-is-visible-in-computed-properties.js(default)
Expand Down

0 comments on commit 9c1ad0a

Please sign in to comment.