From 4c4f7ac0aded28be7a357ba36417de1dc11bd198 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 11:47:33 +0530 Subject: [PATCH 1/7] :rocket: added check to disallow super.private variable access and test case added --- packages/babel-parser/src/parser/expression.js | 13 ++++++++++++- .../super-private-member-access/input.js | 7 +++++++ .../super-private-member-access/options.json | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 5fd5c402efc9..c287dc54bae8 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -655,6 +655,15 @@ export default class ExpressionParser extends LValParser { node.object = base; node.property = this.parseMaybePrivateName(); node.computed = false; + if ( + node.property.type === "PrivateName" && + node.object.type === "Super" + ) { + this.raise( + startPos, + "super is not allowed to be called on a private identifier of a class", + ); + } if (state.optionalChainMember) { node.optional = false; return this.finishNode(node, "OptionalMemberExpression"); @@ -1170,7 +1179,9 @@ export default class ExpressionParser extends LValParser { if (node.property.name !== propertyName || containsEsc) { this.raise( node.property.start, - `The only valid meta property for ${meta.name} is ${meta.name}.${propertyName}`, + `The only valid meta property for ${meta.name} is ${ + meta.name + }.${propertyName}`, ); } diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/input.js new file mode 100644 index 000000000000..5cd2ffd252f7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/input.js @@ -0,0 +1,7 @@ +class A extends B { + #x; + + method() { + super.#x; + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json new file mode 100644 index 000000000000..996670b34fc8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "classPrivateProperties" + ], + "throws": "super is not allowed to be called on a private identifier of a class (5:4)" +} \ No newline at end of file From 23097382e2b17c5246c3467ad6b82aab02f95920 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 11:53:40 +0530 Subject: [PATCH 2/7] :recycle: change the other linting change back to how it was --- packages/babel-parser/src/parser/expression.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index c287dc54bae8..e56190f5790d 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1179,9 +1179,8 @@ export default class ExpressionParser extends LValParser { if (node.property.name !== propertyName || containsEsc) { this.raise( node.property.start, - `The only valid meta property for ${meta.name} is ${ - meta.name - }.${propertyName}`, + `The only valid meta property for ${meta.name} is + ${meta.name}.${propertyName}`, ); } From 5df46b6eb23c54b08d81a5b937723f14560f1801 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 11:56:17 +0530 Subject: [PATCH 3/7] :recycle: change the other linting change back to how it was --- packages/babel-parser/src/parser/expression.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index e56190f5790d..c287dc54bae8 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1179,8 +1179,9 @@ export default class ExpressionParser extends LValParser { if (node.property.name !== propertyName || containsEsc) { this.raise( node.property.start, - `The only valid meta property for ${meta.name} is - ${meta.name}.${propertyName}`, + `The only valid meta property for ${meta.name} is ${ + meta.name + }.${propertyName}`, ); } From a40173c42e2c27fe759d49e721666ad49f79587e Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 11:58:30 +0530 Subject: [PATCH 4/7] :recycle: added newline at the end test output.json file --- .../super-private-member-access/options.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json index 996670b34fc8..24cd86301063 100644 --- a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json @@ -3,4 +3,4 @@ "classPrivateProperties" ], "throws": "super is not allowed to be called on a private identifier of a class (5:4)" -} \ No newline at end of file +} From 762e92b95419f5afff9b9a2fe0774d9078857ed1 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 12:35:59 +0530 Subject: [PATCH 5/7] :recycle: changed the linting style to the way it was --- packages/babel-parser/src/parser/expression.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index c287dc54bae8..6d5e1bba2644 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1179,9 +1179,7 @@ export default class ExpressionParser extends LValParser { if (node.property.name !== propertyName || containsEsc) { this.raise( node.property.start, - `The only valid meta property for ${meta.name} is ${ - meta.name - }.${propertyName}`, + `The only valid meta property for ${meta.name} is ${meta.name}.${propertyName}`, ); } From 4cd44faf0cdd28bcf6290a6deb093ad02a06d7d7 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 16:23:01 +0530 Subject: [PATCH 6/7] :recycle: updated error message, removed super private member access test cases from whitelist of flow and test 262 suite --- packages/babel-parser/src/parser/expression.js | 5 +---- .../super-private-member-access/options.json | 4 ++-- scripts/tests/flow/flow_tests_whitelist.txt | 1 - scripts/tests/test262/test262_whitelist.txt | 4 ---- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 6d5e1bba2644..f7e75bfe5ea3 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -659,10 +659,7 @@ export default class ExpressionParser extends LValParser { node.property.type === "PrivateName" && node.object.type === "Super" ) { - this.raise( - startPos, - "super is not allowed to be called on a private identifier of a class", - ); + this.raise(startPos, "Private fields can't be accessed on super"); } if (state.optionalChainMember) { node.optional = false; diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json index 24cd86301063..5ab3d6a91e6b 100644 --- a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json @@ -2,5 +2,5 @@ "plugins": [ "classPrivateProperties" ], - "throws": "super is not allowed to be called on a private identifier of a class (5:4)" -} + "throws": "Private fields can't be accessed on super (5:4)" +} \ No newline at end of file diff --git a/scripts/tests/flow/flow_tests_whitelist.txt b/scripts/tests/flow/flow_tests_whitelist.txt index 43f45ad565ad..f3704b19d867 100644 --- a/scripts/tests/flow/flow_tests_whitelist.txt +++ b/scripts/tests/flow/flow_tests_whitelist.txt @@ -19,7 +19,6 @@ class_properties/migrated_0021.js class_properties/migrated_0026.js decorators/migrated_0003.js private_class_properties/multiple.js -private_class_properties/super.js private_class_properties/getter_and_field.js private_class_properties/getter_duplicate.js private_class_properties/setter_and_field.js diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index 01c45f11a59d..851b2ddb9f5e 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -98,8 +98,6 @@ language/expressions/class/elements/syntax/early-errors/invalid-names/method-out language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(strict mode) language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(default) language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(strict mode) -language/expressions/class/elements/syntax/early-errors/super-private-access-invalid.js(default) -language/expressions/class/elements/syntax/early-errors/super-private-access-invalid.js(strict mode) language/expressions/object/method-definition/private-name-early-error-async-gen-inside-class.js(default) language/expressions/object/method-definition/private-name-early-error-async-gen-inside-class.js(strict mode) language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(default) @@ -282,8 +280,6 @@ language/statements/class/elements/syntax/early-errors/invalid-names/method-outt language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(strict mode) language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(default) language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-this.js(strict mode) -language/statements/class/elements/syntax/early-errors/super-private-access-invalid.js(default) -language/statements/class/elements/syntax/early-errors/super-private-access-invalid.js(strict mode) language/statements/for-in/dstr/array-rest-before-elision.js(default) language/statements/for-in/dstr/array-rest-before-elision.js(strict mode) language/statements/for-in/dstr/array-rest-elision-invalid.js(default) From 65f596a87aa92630d2383c325ad017075a188622 Mon Sep 17 00:00:00 2001 From: Vivek Nayyar Date: Fri, 20 Sep 2019 16:25:08 +0530 Subject: [PATCH 7/7] :recycle: added newline in output.json --- .../super-private-member-access/options.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json index 5ab3d6a91e6b..162c282e64a2 100644 --- a/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/super-private-member-access/options.json @@ -3,4 +3,4 @@ "classPrivateProperties" ], "throws": "Private fields can't be accessed on super (5:4)" -} \ No newline at end of file +}