[parser] Disallow duplicate and undeclared private names (#10456)

* [parser] Add private names tracking to Scope

- Disallow duplicate private names
- Disallow undeclared private names

* Update tests

* Test all possible duplications

* Test undeclared private names

* Better error message for top-level private names

* Fix flow

* Update test262 whitelist

* Update fixtures

* Update flow whitelist

* Remove old output.json

* Move ClassScopeHandler to a separate class

* Make the code readable
This commit is contained in:
Nicolò Ribaudo
2020-01-10 02:22:05 +01:00
committed by GitHub
parent 9f148a1603
commit 771c730fda
223 changed files with 16948 additions and 259 deletions

View File

@@ -14,10 +14,4 @@ export_import_reserved_words/migrated_0003.js
export_statements/export_trailing_comma.js
nullish_coalescing/precedence_and.js
nullish_coalescing/precedence_or.js
private_class_properties/getter_and_field.js
private_class_properties/getter_duplicate.js
private_class_properties/multiple.js
private_class_properties/multiple.js
private_class_properties/setter_and_field.js
private_class_properties/setter_duplicate.js
types/member/reserved_words.js

View File

@@ -1,194 +1,16 @@
language/expressions/class/elements/fields-duplicate-privatenames.js(default)
language/expressions/class/elements/fields-duplicate-privatenames.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(strict mode)
language/expressions/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(default)
language/expressions/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(default)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(strict mode)
language/expressions/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(default)
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/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-async-gen.js(default)
language/expressions/object/method-definition/private-name-early-error-async-gen.js(strict mode)
language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(default)
language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(strict mode)
language/expressions/object/method-definition/private-name-early-error-gen.js(default)
language/expressions/object/method-definition/private-name-early-error-gen.js(strict mode)
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(default)
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode)
language/module-code/privatename-not-valid-earlyerr-module-1.js(default)
language/module-code/privatename-not-valid-earlyerr-module-1.js(strict mode)
language/module-code/privatename-not-valid-earlyerr-module-2.js(default)
language/module-code/privatename-not-valid-earlyerr-module-2.js(strict mode)
language/module-code/privatename-not-valid-earlyerr-module-3.js(default)
language/module-code/privatename-not-valid-earlyerr-module-3.js(strict mode)
language/module-code/privatename-not-valid-earlyerr-module-4.js(default)
language/module-code/privatename-not-valid-earlyerr-module-4.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/privatename-not-valid-earlyerr-script-1.js(default)
language/statements/class/elements/privatename-not-valid-earlyerr-script-1.js(strict mode)
language/statements/class/elements/privatename-not-valid-earlyerr-script-2.js(default)
language/statements/class/elements/privatename-not-valid-earlyerr-script-2.js(strict mode)
language/statements/class/elements/privatename-not-valid-earlyerr-script-3.js(default)
language/statements/class/elements/privatename-not-valid-earlyerr-script-3.js(strict mode)
language/statements/class/elements/privatename-not-valid-earlyerr-script-4.js(default)
language/statements/class/elements/privatename-not-valid-earlyerr-script-4.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(default)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-chained-usage.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(default)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage-recursive.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(default)
language/statements/class/elements/syntax/early-errors/grammar-private-environment-on-class-heritage.js(strict mode)
language/expressions/object/method-definition/private-name-early-error-method.js(default)
language/expressions/object/method-definition/private-name-early-error-method.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(default)
language/statements/class/elements/syntax/early-errors/grammar-private-field-on-object-destructuring.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async-gen.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-async.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-gen.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-field.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-get-get.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-field.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-get.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-meth.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-set.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticfield.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-meth-staticmeth.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-field.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatemeth-duplicate-set-set.js(strict mode)
language/statements/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(default)
language/statements/class/elements/syntax/early-errors/grammar-privatename-in-computed-property-missing.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-fn-member-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/field-init-member-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-fn-member-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-heritage-member-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-member-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-bad-reference.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(default)
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-call-expression-this.js(strict mode)
language/statements/class/elements/syntax/early-errors/invalid-names/method-outter-member-expression-bad-reference.js(default)
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)