From f222b94f2a87033a54b97d5661ea3ef10ec16aa6 Mon Sep 17 00:00:00 2001 From: Rick Waldron <waldron.rick@gmail.com> Date: Wed, 1 Aug 2018 14:20:57 -0400 Subject: [PATCH] Generate tests --- ...e-covered-member-expression-privatename.js | 2 +- ...elds-after-same-line-gen-computed-names.js | 2 +- ...ter-same-line-gen-computed-symbol-names.js | 2 +- ...ields-after-same-line-gen-literal-names.js | 2 +- ...ields-after-same-line-gen-private-names.js | 14 +-- ...ter-same-line-gen-static-private-fields.js | 66 +++++++++++ ...er-same-line-gen-static-private-methods.js | 72 ++++++++++++ ...fter-same-line-gen-string-literal-names.js | 2 +- ...s-after-same-line-method-computed-names.js | 2 +- ...-same-line-method-computed-symbol-names.js | 2 +- ...ds-after-same-line-method-literal-names.js | 2 +- ...ds-after-same-line-method-private-names.js | 14 +-- ...-same-line-method-static-private-fields.js | 66 +++++++++++ ...same-line-method-static-private-methods.js | 72 ++++++++++++ ...r-same-line-method-string-literal-names.js | 2 +- ...me-line-static-async-gen-computed-names.js | 2 +- ...-static-async-gen-computed-symbol-names.js | 2 +- ...ame-line-static-async-gen-literal-names.js | 2 +- ...ame-line-static-async-gen-private-names.js | 14 +-- ...-static-async-gen-static-private-fields.js | 70 ++++++++++++ ...static-async-gen-static-private-methods.js | 76 ++++++++++++ ...e-static-async-gen-string-literal-names.js | 2 +- ...line-static-async-method-computed-names.js | 2 +- ...atic-async-method-computed-symbol-names.js | 2 +- ...-line-static-async-method-literal-names.js | 2 +- ...-line-static-async-method-private-names.js | 14 +-- ...atic-async-method-static-private-fields.js | 69 +++++++++++ ...tic-async-method-static-private-methods.js | 75 ++++++++++++ ...tatic-async-method-string-literal-names.js | 2 +- ...ter-same-line-static-gen-computed-names.js | 2 +- ...e-line-static-gen-computed-symbol-names.js | 2 +- ...fter-same-line-static-gen-literal-names.js | 2 +- ...fter-same-line-static-gen-private-names.js | 14 +-- ...e-line-static-gen-static-private-fields.js | 66 +++++++++++ ...-line-static-gen-static-private-methods.js | 72 ++++++++++++ ...me-line-static-gen-string-literal-names.js | 2 +- ...-same-line-static-method-computed-names.js | 2 +- ...ine-static-method-computed-symbol-names.js | 2 +- ...r-same-line-static-method-literal-names.js | 2 +- ...r-same-line-static-method-private-names.js | 14 +-- ...ine-static-method-static-private-fields.js | 66 +++++++++++ ...ne-static-method-static-private-methods.js | 72 ++++++++++++ ...line-static-method-string-literal-names.js | 2 +- ...fields-computed-name-toprimitive-symbol.js | 2 +- .../class/fields-computed-name-toprimitive.js | 2 +- ...uted-variable-name-propname-constructor.js | 33 ------ .../fields-ctor-called-after-fields-init.js | 2 +- ...ls-direct-eval-err-contains-supercall-1.js | 3 +- ...ls-direct-eval-err-contains-supercall-2.js | 10 +- ...-cls-direct-eval-err-contains-supercall.js | 3 +- ...irect-eval-err-contains-superproperty-1.js | 5 +- ...irect-eval-err-contains-superproperty-2.js | 20 ++-- ...-indirect-eval-err-contains-supercall-1.js | 3 +- ...-indirect-eval-err-contains-supercall-2.js | 10 +- ...ls-indirect-eval-err-contains-supercall.js | 3 +- ...irect-eval-err-contains-superproperty-1.js | 5 +- ...irect-eval-err-contains-superproperty-2.js | 20 ++-- ...elds-direct-eval-err-contains-newtarget.js | 2 +- ...tion-error-computed-name-referenceerror.js | 2 +- ...ion-error-computed-name-toprimitive-err.js | 2 +- ...ed-name-toprimitive-returns-noncallable.js | 57 +++++++++ ...uted-name-toprimitive-returns-nonobject.js | 56 +++++++++ ...uation-error-computed-name-tostring-err.js | 2 +- ...luation-error-computed-name-valueof-err.js | 2 +- ...ds-indirect-eval-err-contains-newtarget.js | 2 +- .../class/fields-init-err-evaluation.js | 2 +- .../fields-init-value-defined-after-class.js | 2 +- .../class/fields-init-value-incremental.js | 2 +- ...lds-multiple-definitions-computed-names.js | 2 +- ...tiple-definitions-computed-symbol-names.js | 2 +- ...elds-multiple-definitions-literal-names.js | 2 +- ...elds-multiple-definitions-private-names.js | 14 +-- ...tiple-definitions-static-private-fields.js | 102 +++++++++++++++++ ...efinitions-static-private-methods-proxy.js | 40 +++++++ ...iple-definitions-static-private-methods.js | 108 ++++++++++++++++++ ...ltiple-definitions-string-literal-names.js | 2 +- ...iple-stacked-definitions-computed-names.js | 2 +- ...acked-definitions-computed-symbol-names.js | 2 +- ...tiple-stacked-definitions-literal-names.js | 2 +- ...tiple-stacked-definitions-private-names.js | 14 +-- ...acked-definitions-static-private-fields.js | 80 +++++++++++++ ...cked-definitions-static-private-methods.js | 86 ++++++++++++++ ...tacked-definitions-string-literal-names.js | 2 +- ...ds-new-no-sc-line-method-computed-names.js | 2 +- ...no-sc-line-method-computed-symbol-names.js | 2 +- ...lds-new-no-sc-line-method-literal-names.js | 2 +- ...lds-new-no-sc-line-method-private-names.js | 14 +-- ...no-sc-line-method-static-private-fields.js | 67 +++++++++++ ...o-sc-line-method-static-private-methods.js | 73 ++++++++++++ ...-no-sc-line-method-string-literal-names.js | 2 +- .../fields-new-sc-line-gen-computed-names.js | 2 +- ...s-new-sc-line-gen-computed-symbol-names.js | 2 +- .../fields-new-sc-line-gen-literal-names.js | 2 +- .../fields-new-sc-line-gen-private-names.js | 14 +-- ...s-new-sc-line-gen-static-private-fields.js | 67 +++++++++++ ...-new-sc-line-gen-static-private-methods.js | 73 ++++++++++++ ...ds-new-sc-line-gen-string-literal-names.js | 2 +- ...ields-new-sc-line-method-computed-names.js | 2 +- ...ew-sc-line-method-computed-symbol-names.js | 2 +- ...fields-new-sc-line-method-literal-names.js | 2 +- ...fields-new-sc-line-method-private-names.js | 14 +-- ...ew-sc-line-method-static-private-fields.js | 67 +++++++++++ ...w-sc-line-method-static-private-methods.js | 73 ++++++++++++ ...new-sc-line-method-string-literal-names.js | 2 +- ...vate-direct-eval-err-contains-arguments.js | 36 ++++++ ...vate-direct-eval-err-contains-newtarget.js | 34 ++++++ ...te-indirect-eval-err-contains-arguments.js | 36 ++++++ ...te-indirect-eval-err-contains-newtarget.js | 35 ++++++ .../class/fields-redeclaration-symbol.js | 2 +- .../expressions/class/fields-redeclaration.js | 2 +- ...elds-regular-definitions-computed-names.js | 2 +- ...gular-definitions-computed-symbol-names.js | 2 +- ...ields-regular-definitions-literal-names.js | 2 +- ...ields-regular-definitions-private-names.js | 14 +-- ...ular-definitions-static-private-fields.js} | 28 +++-- ...ular-definitions-static-private-methods.js | 61 ++++++++++ ...egular-definitions-string-literal-names.js | 2 +- ...elds-same-line-async-gen-computed-names.js | 2 +- ...me-line-async-gen-computed-symbol-names.js | 2 +- ...ields-same-line-async-gen-literal-names.js | 2 +- ...ields-same-line-async-gen-private-names.js | 14 +-- ...me-line-async-gen-static-private-fields.js | 70 ++++++++++++ ...e-line-async-gen-static-private-methods.js | 76 ++++++++++++ ...ame-line-async-gen-string-literal-names.js | 2 +- ...s-same-line-async-method-computed-names.js | 2 +- ...line-async-method-computed-symbol-names.js | 2 +- ...ds-same-line-async-method-literal-names.js | 2 +- ...ds-same-line-async-method-private-names.js | 14 +-- ...line-async-method-static-private-fields.js | 69 +++++++++++ ...ine-async-method-static-private-methods.js | 75 ++++++++++++ ...-line-async-method-string-literal-names.js | 2 +- .../fields-same-line-gen-computed-names.js | 2 +- ...lds-same-line-gen-computed-symbol-names.js | 2 +- .../fields-same-line-gen-literal-names.js | 2 +- .../fields-same-line-gen-private-names.js | 14 +-- ...lds-same-line-gen-static-private-fields.js | 66 +++++++++++ ...ds-same-line-gen-static-private-methods.js | 72 ++++++++++++ ...elds-same-line-gen-string-literal-names.js | 2 +- .../fields-same-line-method-computed-names.js | 2 +- ...-same-line-method-computed-symbol-names.js | 2 +- .../fields-same-line-method-literal-names.js | 2 +- .../fields-same-line-method-private-names.js | 14 +-- ...-same-line-method-static-private-fields.js | 66 +++++++++++ ...same-line-method-static-private-methods.js | 72 ++++++++++++ ...s-same-line-method-string-literal-names.js | 2 +- ...c-comp-name-init-err-contains-arguments.js | 35 ++++++ ...tatic-comp-name-init-err-contains-super.js | 28 +++++ ...tic-literal-init-err-contains-arguments.js | 34 ++++++ ...-static-literal-init-err-contains-super.js | 27 +++++ ...tic-private-init-err-contains-arguments.js | 34 ++++++ ...-static-private-init-err-contains-super.js | 27 +++++ ...iteral-name-init-err-contains-arguments.js | 34 ++++++ ...ng-literal-name-init-err-contains-super.js | 27 +++++ .../fields-wrapped-in-sc-computed-names.js | 2 +- ...lds-wrapped-in-sc-computed-symbol-names.js | 2 +- .../fields-wrapped-in-sc-literal-names.js | 2 +- .../fields-wrapped-in-sc-private-names.js | 14 +-- ...lds-wrapped-in-sc-static-private-fields.js | 57 +++++++++ ...ds-wrapped-in-sc-static-private-methods.js | 63 ++++++++++ ...elds-wrapped-in-sc-string-literal-names.js | 2 +- ...ate-fields-proxy-default-handler-throws.js | 30 +++++ ...ate-fields-proxy-default-handler-throws.js | 28 +++++ ...te-methods-proxy-default-handler-throws.js | 31 +++++ ...elds-after-same-line-gen-computed-names.js | 2 +- ...ter-same-line-gen-computed-symbol-names.js | 2 +- ...ields-after-same-line-gen-literal-names.js | 2 +- ...ields-after-same-line-gen-private-names.js | 14 +-- ...ter-same-line-gen-static-private-fields.js | 66 +++++++++++ ...er-same-line-gen-static-private-methods.js | 72 ++++++++++++ ...fter-same-line-gen-string-literal-names.js | 2 +- ...s-after-same-line-method-computed-names.js | 2 +- ...-same-line-method-computed-symbol-names.js | 2 +- ...ds-after-same-line-method-literal-names.js | 2 +- ...ds-after-same-line-method-private-names.js | 14 +-- ...-same-line-method-static-private-fields.js | 66 +++++++++++ ...same-line-method-static-private-methods.js | 72 ++++++++++++ ...r-same-line-method-string-literal-names.js | 2 +- ...me-line-static-async-gen-computed-names.js | 2 +- ...-static-async-gen-computed-symbol-names.js | 2 +- ...ame-line-static-async-gen-literal-names.js | 2 +- ...ame-line-static-async-gen-private-names.js | 14 +-- ...-static-async-gen-static-private-fields.js | 70 ++++++++++++ ...static-async-gen-static-private-methods.js | 76 ++++++++++++ ...e-static-async-gen-string-literal-names.js | 2 +- ...line-static-async-method-computed-names.js | 2 +- ...atic-async-method-computed-symbol-names.js | 2 +- ...-line-static-async-method-literal-names.js | 2 +- ...-line-static-async-method-private-names.js | 14 +-- ...atic-async-method-static-private-fields.js | 69 +++++++++++ ...tic-async-method-static-private-methods.js | 75 ++++++++++++ ...tatic-async-method-string-literal-names.js | 2 +- ...ter-same-line-static-gen-computed-names.js | 2 +- ...e-line-static-gen-computed-symbol-names.js | 2 +- ...fter-same-line-static-gen-literal-names.js | 2 +- ...fter-same-line-static-gen-private-names.js | 14 +-- ...e-line-static-gen-static-private-fields.js | 66 +++++++++++ ...-line-static-gen-static-private-methods.js | 72 ++++++++++++ ...me-line-static-gen-string-literal-names.js | 2 +- ...-same-line-static-method-computed-names.js | 2 +- ...ine-static-method-computed-symbol-names.js | 2 +- ...r-same-line-static-method-literal-names.js | 2 +- ...r-same-line-static-method-private-names.js | 14 +-- ...ine-static-method-static-private-fields.js | 66 +++++++++++ ...ne-static-method-static-private-methods.js | 72 ++++++++++++ ...line-static-method-string-literal-names.js | 2 +- ...s-comp-name-init-err-contains-arguments.js | 35 ++++++ ...ields-comp-name-init-err-contains-super.js | 28 +++++ ...fields-computed-name-toprimitive-symbol.js | 2 +- .../class/fields-computed-name-toprimitive.js | 2 +- ...uted-variable-name-propname-constructor.js | 33 ------ .../fields-ctor-called-after-fields-init.js | 2 +- ...ls-direct-eval-err-contains-supercall-1.js | 3 +- ...ls-direct-eval-err-contains-supercall-2.js | 10 +- ...-cls-direct-eval-err-contains-supercall.js | 3 +- ...irect-eval-err-contains-superproperty-1.js | 3 +- ...irect-eval-err-contains-superproperty-2.js | 18 ++- ...-indirect-eval-err-contains-supercall-1.js | 7 +- ...-indirect-eval-err-contains-supercall-2.js | 14 +-- ...ls-indirect-eval-err-contains-supercall.js | 7 +- ...irect-eval-err-contains-superproperty-1.js | 7 +- ...irect-eval-err-contains-superproperty-2.js | 22 ++-- ...elds-direct-eval-err-contains-newtarget.js | 2 +- ...tion-error-computed-name-referenceerror.js | 2 +- ...ion-error-computed-name-toprimitive-err.js | 2 +- ...ed-name-toprimitive-returns-noncallable.js | 57 +++++++++ ...uted-name-toprimitive-returns-nonobject.js | 56 +++++++++ ...uation-error-computed-name-tostring-err.js | 2 +- ...luation-error-computed-name-valueof-err.js | 2 +- ...ds-indirect-eval-err-contains-newtarget.js | 2 +- .../class/fields-init-err-evaluation.js | 2 +- .../fields-init-value-defined-after-class.js | 2 +- .../class/fields-init-value-incremental.js | 2 +- ...lds-multiple-definitions-computed-names.js | 2 +- ...tiple-definitions-computed-symbol-names.js | 2 +- ...elds-multiple-definitions-literal-names.js | 2 +- ...elds-multiple-definitions-private-names.js | 14 +-- ...tiple-definitions-static-private-fields.js | 102 +++++++++++++++++ ...iple-definitions-static-private-methods.js | 108 ++++++++++++++++++ ...ltiple-definitions-string-literal-names.js | 2 +- ...iple-stacked-definitions-computed-names.js | 2 +- ...acked-definitions-computed-symbol-names.js | 2 +- ...tiple-stacked-definitions-literal-names.js | 2 +- ...tiple-stacked-definitions-private-names.js | 14 +-- ...acked-definitions-static-private-fields.js | 80 +++++++++++++ ...cked-definitions-static-private-methods.js | 86 ++++++++++++++ ...tacked-definitions-string-literal-names.js | 2 +- ...ds-new-no-sc-line-method-computed-names.js | 2 +- ...no-sc-line-method-computed-symbol-names.js | 2 +- ...lds-new-no-sc-line-method-literal-names.js | 2 +- ...lds-new-no-sc-line-method-private-names.js | 14 +-- ...no-sc-line-method-static-private-fields.js | 67 +++++++++++ ...o-sc-line-method-static-private-methods.js | 73 ++++++++++++ ...-no-sc-line-method-string-literal-names.js | 2 +- .../fields-new-sc-line-gen-computed-names.js | 2 +- ...s-new-sc-line-gen-computed-symbol-names.js | 2 +- .../fields-new-sc-line-gen-literal-names.js | 2 +- .../fields-new-sc-line-gen-private-names.js | 14 +-- ...s-new-sc-line-gen-static-private-fields.js | 67 +++++++++++ ...-new-sc-line-gen-static-private-methods.js | 73 ++++++++++++ ...ds-new-sc-line-gen-string-literal-names.js | 2 +- ...ields-new-sc-line-method-computed-names.js | 2 +- ...ew-sc-line-method-computed-symbol-names.js | 2 +- ...fields-new-sc-line-method-literal-names.js | 2 +- ...fields-new-sc-line-method-private-names.js | 14 +-- ...ew-sc-line-method-static-private-fields.js | 67 +++++++++++ ...w-sc-line-method-static-private-methods.js | 73 ++++++++++++ ...new-sc-line-method-string-literal-names.js | 2 +- ...vate-direct-eval-err-contains-arguments.js | 36 ++++++ ...vate-direct-eval-err-contains-newtarget.js | 34 ++++++ ...te-indirect-eval-err-contains-arguments.js | 36 ++++++ ...te-indirect-eval-err-contains-newtarget.js | 35 ++++++ .../class/fields-redeclaration-symbol.js | 2 +- .../statements/class/fields-redeclaration.js | 2 +- ...elds-regular-definitions-computed-names.js | 2 +- ...gular-definitions-computed-symbol-names.js | 2 +- ...ields-regular-definitions-literal-names.js | 2 +- ...ields-regular-definitions-private-names.js | 14 +-- ...ular-definitions-static-private-fields.js} | 24 ++-- ...ular-definitions-static-private-methods.js | 61 ++++++++++ ...egular-definitions-string-literal-names.js | 2 +- ...elds-same-line-async-gen-computed-names.js | 2 +- ...me-line-async-gen-computed-symbol-names.js | 2 +- ...ields-same-line-async-gen-literal-names.js | 2 +- ...ields-same-line-async-gen-private-names.js | 14 +-- ...me-line-async-gen-static-private-fields.js | 70 ++++++++++++ ...e-line-async-gen-static-private-methods.js | 76 ++++++++++++ ...ame-line-async-gen-string-literal-names.js | 2 +- ...s-same-line-async-method-computed-names.js | 2 +- ...line-async-method-computed-symbol-names.js | 2 +- ...ds-same-line-async-method-literal-names.js | 2 +- ...ds-same-line-async-method-private-names.js | 14 +-- ...line-async-method-static-private-fields.js | 69 +++++++++++ ...ine-async-method-static-private-methods.js | 75 ++++++++++++ ...-line-async-method-string-literal-names.js | 2 +- .../fields-same-line-gen-computed-names.js | 2 +- ...lds-same-line-gen-computed-symbol-names.js | 2 +- .../fields-same-line-gen-literal-names.js | 2 +- .../fields-same-line-gen-private-names.js | 14 +-- ...lds-same-line-gen-static-private-fields.js | 66 +++++++++++ ...ds-same-line-gen-static-private-methods.js | 72 ++++++++++++ ...elds-same-line-gen-string-literal-names.js | 2 +- .../fields-same-line-method-computed-names.js | 2 +- ...-same-line-method-computed-symbol-names.js | 2 +- .../fields-same-line-method-literal-names.js | 2 +- .../fields-same-line-method-private-names.js | 14 +-- ...-same-line-method-static-private-fields.js | 66 +++++++++++ ...same-line-method-static-private-methods.js | 72 ++++++++++++ ...s-same-line-method-string-literal-names.js | 2 +- ...c-comp-name-init-err-contains-arguments.js | 2 +- ...tatic-comp-name-init-err-contains-super.js | 2 +- ...tic-literal-init-err-contains-arguments.js | 2 +- ...-static-literal-init-err-contains-super.js | 2 +- ...tic-private-init-err-contains-arguments.js | 2 +- ...-static-private-init-err-contains-super.js | 2 +- ...iteral-name-init-err-contains-arguments.js | 2 +- ...ng-literal-name-init-err-contains-super.js | 2 +- .../fields-wrapped-in-sc-computed-names.js | 2 +- ...lds-wrapped-in-sc-computed-symbol-names.js | 2 +- .../fields-wrapped-in-sc-literal-names.js | 2 +- .../fields-wrapped-in-sc-private-names.js | 14 +-- ...ds-wrapped-in-sc-static-private-fields.js} | 30 +++-- ...ds-wrapped-in-sc-static-private-methods.js | 63 ++++++++++ ...elds-wrapped-in-sc-string-literal-names.js | 2 +- ...privatename-not-valid-earlyerr-script-7.js | 2 +- ...privatename-not-valid-earlyerr-script-8.js | 2 +- 325 files changed, 6187 insertions(+), 622 deletions(-) create mode 100644 test/language/expressions/class/fields-after-same-line-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-after-same-line-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-async-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-async-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-after-same-line-static-method-static-private-methods.js delete mode 100644 test/language/expressions/class/fields-computed-variable-name-propname-constructor.js create mode 100644 test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js create mode 100644 test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js create mode 100644 test/language/expressions/class/fields-multiple-definitions-static-private-fields.js create mode 100644 test/language/expressions/class/fields-multiple-definitions-static-private-methods-proxy.js create mode 100644 test/language/expressions/class/fields-multiple-definitions-static-private-methods.js create mode 100644 test/language/expressions/class/fields-multiple-stacked-definitions-static-private-fields.js create mode 100644 test/language/expressions/class/fields-multiple-stacked-definitions-static-private-methods.js create mode 100644 test/language/expressions/class/fields-new-no-sc-line-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-new-no-sc-line-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-new-sc-line-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-new-sc-line-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-new-sc-line-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-new-sc-line-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-private-direct-eval-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-private-direct-eval-err-contains-newtarget.js create mode 100644 test/language/expressions/class/fields-private-indirect-eval-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-private-indirect-eval-err-contains-newtarget.js rename test/language/{statements/class/fields-static-private-names.js => expressions/class/fields-regular-definitions-static-private-fields.js} (71%) create mode 100644 test/language/expressions/class/fields-regular-definitions-static-private-methods.js create mode 100644 test/language/expressions/class/fields-same-line-async-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-same-line-async-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-same-line-async-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-same-line-async-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-same-line-gen-static-private-fields.js create mode 100644 test/language/expressions/class/fields-same-line-gen-static-private-methods.js create mode 100644 test/language/expressions/class/fields-same-line-method-static-private-fields.js create mode 100644 test/language/expressions/class/fields-same-line-method-static-private-methods.js create mode 100644 test/language/expressions/class/fields-static-comp-name-init-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-static-comp-name-init-err-contains-super.js create mode 100644 test/language/expressions/class/fields-static-literal-init-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-static-literal-init-err-contains-super.js create mode 100644 test/language/expressions/class/fields-static-private-init-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-static-private-init-err-contains-super.js create mode 100644 test/language/expressions/class/fields-static-string-literal-name-init-err-contains-arguments.js create mode 100644 test/language/expressions/class/fields-static-string-literal-name-init-err-contains-super.js create mode 100644 test/language/expressions/class/fields-wrapped-in-sc-static-private-fields.js create mode 100644 test/language/expressions/class/fields-wrapped-in-sc-static-private-methods.js create mode 100644 test/language/expressions/class/private-fields-proxy-default-handler-throws.js create mode 100644 test/language/expressions/class/static-private-fields-proxy-default-handler-throws.js create mode 100644 test/language/expressions/class/static-private-methods-proxy-default-handler-throws.js create mode 100644 test/language/statements/class/fields-after-same-line-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-after-same-line-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-after-same-line-static-async-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-static-async-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-after-same-line-static-async-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-static-async-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-after-same-line-static-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-static-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-after-same-line-static-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-after-same-line-static-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-comp-name-init-err-contains-arguments.js create mode 100644 test/language/statements/class/fields-comp-name-init-err-contains-super.js delete mode 100644 test/language/statements/class/fields-computed-variable-name-propname-constructor.js create mode 100644 test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js create mode 100644 test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js create mode 100644 test/language/statements/class/fields-multiple-definitions-static-private-fields.js create mode 100644 test/language/statements/class/fields-multiple-definitions-static-private-methods.js create mode 100644 test/language/statements/class/fields-multiple-stacked-definitions-static-private-fields.js create mode 100644 test/language/statements/class/fields-multiple-stacked-definitions-static-private-methods.js create mode 100644 test/language/statements/class/fields-new-no-sc-line-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-new-no-sc-line-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-new-sc-line-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-new-sc-line-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-new-sc-line-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-new-sc-line-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-private-direct-eval-err-contains-arguments.js create mode 100644 test/language/statements/class/fields-private-direct-eval-err-contains-newtarget.js create mode 100644 test/language/statements/class/fields-private-indirect-eval-err-contains-arguments.js create mode 100644 test/language/statements/class/fields-private-indirect-eval-err-contains-newtarget.js rename test/language/statements/class/{fields-static-private-fields.js => fields-regular-definitions-static-private-fields.js} (75%) create mode 100644 test/language/statements/class/fields-regular-definitions-static-private-methods.js create mode 100644 test/language/statements/class/fields-same-line-async-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-same-line-async-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-same-line-async-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-same-line-async-method-static-private-methods.js create mode 100644 test/language/statements/class/fields-same-line-gen-static-private-fields.js create mode 100644 test/language/statements/class/fields-same-line-gen-static-private-methods.js create mode 100644 test/language/statements/class/fields-same-line-method-static-private-fields.js create mode 100644 test/language/statements/class/fields-same-line-method-static-private-methods.js rename test/language/statements/class/{fields-static-private-methods.js => fields-wrapped-in-sc-static-private-fields.js} (69%) create mode 100644 test/language/statements/class/fields-wrapped-in-sc-static-private-methods.js diff --git a/test/language/expressions/class/err-field-delete-covered-member-expression-privatename.js b/test/language/expressions/class/err-field-delete-covered-member-expression-privatename.js index d77e55b4e1..4903bbe3bc 100644 --- a/test/language/expressions/class/err-field-delete-covered-member-expression-privatename.js +++ b/test/language/expressions/class/err-field-delete-covered-member-expression-privatename.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if you call delete on member expressions . privatename (in field, covered) esid: sec-class-definitions-static-semantics-early-errors -features: [class-fields-private, class] +features: [class-fields-private, class, class-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/expressions/class/fields-after-same-line-gen-computed-names.js b/test/language/expressions/class/fields-after-same-line-gen-computed-names.js index 874f2cdfcb..81276cc9a9 100644 --- a/test/language/expressions/class/fields-after-same-line-gen-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-gen-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-gen-computed-symbol-names.js index ca449cf303..5b1638c4ab 100644 --- a/test/language/expressions/class/fields-after-same-line-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-gen-literal-names.js b/test/language/expressions/class/fields-after-same-line-gen-literal-names.js index cf16227496..a895a065c7 100644 --- a/test/language/expressions/class/fields-after-same-line-gen-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-gen-private-names.js b/test/language/expressions/class/fields-after-same-line-gen-private-names.js index e730657f11..456c88bca9 100644 --- a/test/language/expressions/class/fields-after-same-line-gen-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-gen.template /*--- -description: static literal private names (field definitions after a generator in the same line) +description: private names (field definitions after a generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, generators, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-gen-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-gen-static-private-fields.js new file mode 100644 index 0000000000..2812237a8e --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-gen.template +/*--- +description: static private fields (field definitions after a generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-gen-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-gen-static-private-methods.js new file mode 100644 index 0000000000..a7b69d61cc --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-gen.template +/*--- +description: static private methods (field definitions after a generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-gen-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-gen-string-literal-names.js index fbec943402..2b1e596888 100644 --- a/test/language/expressions/class/fields-after-same-line-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-method-computed-names.js b/test/language/expressions/class/fields-after-same-line-method-computed-names.js index 21da891022..5a5da9ea56 100644 --- a/test/language/expressions/class/fields-after-same-line-method-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-method-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-method-computed-symbol-names.js index 81e5ca2a23..e21e2a8a7d 100644 --- a/test/language/expressions/class/fields-after-same-line-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-method-literal-names.js b/test/language/expressions/class/fields-after-same-line-method-literal-names.js index 542488ff92..fb0a1cb92c 100644 --- a/test/language/expressions/class/fields-after-same-line-method-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-method-private-names.js b/test/language/expressions/class/fields-after-same-line-method-private-names.js index 145f1398d3..7c65b26ac2 100644 --- a/test/language/expressions/class/fields-after-same-line-method-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-method.template /*--- -description: static literal private names (field definitions after a method in the same line) +description: private names (field definitions after a method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-method-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-method-static-private-fields.js new file mode 100644 index 0000000000..5f8209be7d --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-method.template +/*--- +description: static private fields (field definitions after a method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-method-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-method-static-private-methods.js new file mode 100644 index 0000000000..a45087347c --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-method.template +/*--- +description: static private methods (field definitions after a method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-method-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-method-string-literal-names.js index bc534cb4b9..a1d0ef3ad2 100644 --- a/test/language/expressions/class/fields-after-same-line-method-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-names.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-names.js index 2a66b8ee76..4f92e5bc9f 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { static async *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-symbol-names.js index 2ea39e9b6b..80d36a6128 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { static async *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-literal-names.js index e4ebb76d4b..b298c5f633 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-gen-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { static async *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-private-names.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-private-names.js index 167504e93f..8a73040702 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-gen-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-static-async-gen.template /*--- -description: static literal private names (field definitions after a static async generator in the same line) +description: private names (field definitions after a static async generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-iteration] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { static async *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-fields.js new file mode 100644 index 0000000000..8f27dd8736 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-fields.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-static-async-gen.template +/*--- +description: static private fields (field definitions after a static async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static async *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +C.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-methods.js new file mode 100644 index 0000000000..d8e030b0d5 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-static-private-methods.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-static-async-gen.template +/*--- +description: static private methods (field definitions after a static async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static async *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +C.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-gen-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-async-gen-string-literal-names.js index 464838a511..95e1a46432 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { static async *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-computed-names.js b/test/language/expressions/class/fields-after-same-line-static-async-method-computed-names.js index e39f9c059d..b32ed9b83f 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-method-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { static async m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-static-async-method-computed-symbol-names.js index dd0650e0e8..392fb7b0a6 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { static async m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-async-method-literal-names.js index 1e1af3d4dc..14f723d1dd 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-method-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { static async m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-private-names.js b/test/language/expressions/class/fields-after-same-line-static-async-method-private-names.js index df6dd1aeb7..2dfe19655f 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-method-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-static-async-method.template /*--- -description: static literal private names (field definitions after a static async method in the same line) +description: private names (field definitions after a static async method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-functions] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { static async m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-fields.js new file mode 100644 index 0000000000..21a43260e1 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-fields.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-static-async-method.template +/*--- +description: static private fields (field definitions after a static async method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static async m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +C.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-methods.js new file mode 100644 index 0000000000..3a61adf3ff --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-static-private-methods.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-static-async-method.template +/*--- +description: static private methods (field definitions after a static async method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static async m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +C.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-after-same-line-static-async-method-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-async-method-string-literal-names.js index 25ce5be1f2..9d0422cbdc 100644 --- a/test/language/expressions/class/fields-after-same-line-static-async-method-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-async-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { static async m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-computed-names.js b/test/language/expressions/class/fields-after-same-line-static-gen-computed-names.js index 4f3cf3e534..6012cc4503 100644 --- a/test/language/expressions/class/fields-after-same-line-static-gen-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { static *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-static-gen-computed-symbol-names.js index 6aec78a03d..2ebffeedb6 100644 --- a/test/language/expressions/class/fields-after-same-line-static-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { static *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-gen-literal-names.js index 2ba95a6f14..a89c5d2db9 100644 --- a/test/language/expressions/class/fields-after-same-line-static-gen-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { static *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-private-names.js b/test/language/expressions/class/fields-after-same-line-static-gen-private-names.js index 5883a5abc0..c1a73d77f4 100644 --- a/test/language/expressions/class/fields-after-same-line-static-gen-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-static-gen.template /*--- -description: static literal private names (field definitions after a static generator in the same line) +description: private names (field definitions after a static generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, generators, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { static *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-static-gen-static-private-fields.js new file mode 100644 index 0000000000..4e8ea78049 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-static-gen.template +/*--- +description: static private fields (field definitions after a static generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(C.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-static-gen-static-private-methods.js new file mode 100644 index 0000000000..b7e9ca1ae2 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-static-gen.template +/*--- +description: static private methods (field definitions after a static generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(C.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-static-gen-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-gen-string-literal-names.js index 1b83642272..caa4ce8271 100644 --- a/test/language/expressions/class/fields-after-same-line-static-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { static *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-computed-names.js b/test/language/expressions/class/fields-after-same-line-static-method-computed-names.js index 66eb3d0989..7b67ffd5a6 100644 --- a/test/language/expressions/class/fields-after-same-line-static-method-computed-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { static m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js b/test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js index 82f3a4eaed..3d1d410d26 100644 --- a/test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { static m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-method-literal-names.js index 59a4c9c354..0e79cf5cd4 100644 --- a/test/language/expressions/class/fields-after-same-line-static-method-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { static m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-private-names.js b/test/language/expressions/class/fields-after-same-line-static-method-private-names.js index 48fe0208dd..3ab534569e 100644 --- a/test/language/expressions/class/fields-after-same-line-static-method-private-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-static-method.template /*--- -description: static literal private names (field definitions after a static method in the same line) +description: private names (field definitions after a static method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { static m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-after-same-line-static-method-static-private-fields.js b/test/language/expressions/class/fields-after-same-line-static-method-static-private-fields.js new file mode 100644 index 0000000000..852fa7ce83 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-static-method.template +/*--- +description: static private fields (field definitions after a static method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(C.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-static-private-methods.js b/test/language/expressions/class/fields-after-same-line-static-method-static-private-methods.js new file mode 100644 index 0000000000..8cb2832729 --- /dev/null +++ b/test/language/expressions/class/fields-after-same-line-static-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-static-method.template +/*--- +description: static private methods (field definitions after a static method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(C.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-after-same-line-static-method-string-literal-names.js b/test/language/expressions/class/fields-after-same-line-static-method-string-literal-names.js index d4d1e093b1..d8d96aa6fa 100644 --- a/test/language/expressions/class/fields-after-same-line-static-method-string-literal-names.js +++ b/test/language/expressions/class/fields-after-same-line-static-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { static m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-computed-name-toprimitive-symbol.js b/test/language/expressions/class/fields-computed-name-toprimitive-symbol.js index c9437b784d..5177e0ca3f 100644 --- a/test/language/expressions/class/fields-computed-name-toprimitive-symbol.js +++ b/test/language/expressions/class/fields-computed-name-toprimitive-symbol.js @@ -4,7 +4,7 @@ /*--- description: ToPrimitive evaluation in the ComputedPropertyName (field definitions in a class expression) esid: prod-FieldDefinition -features: [computed-property-names, Symbol.toPrimitive, Symbol, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, Symbol, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/expressions/class/fields-computed-name-toprimitive.js b/test/language/expressions/class/fields-computed-name-toprimitive.js index 7329aa9b8f..cf1349be07 100644 --- a/test/language/expressions/class/fields-computed-name-toprimitive.js +++ b/test/language/expressions/class/fields-computed-name-toprimitive.js @@ -4,7 +4,7 @@ /*--- description: ToPrimitive evaluation in the ComputedPropertyName (field definitions in a class expression) esid: prod-FieldDefinition -features: [computed-property-names, Symbol.toPrimitive, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/expressions/class/fields-computed-variable-name-propname-constructor.js b/test/language/expressions/class/fields-computed-variable-name-propname-constructor.js deleted file mode 100644 index bceceabf9e..0000000000 --- a/test/language/expressions/class/fields-computed-variable-name-propname-constructor.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-fields/propname-constructor.case -// - src/class-fields/propname-error/cls-expr-variable-name.template -/*--- -description: class fields forbid PropName 'constructor' (no early error -- PropName of ComputedPropertyName not forbidden value) -esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] -flags: [generated] -info: | - Static Semantics: PropName - ... - ComputedPropertyName : [ AssignmentExpression ] - Return empty. - - - // This test file tests the following early error: - Static Semantics: Early Errors - - ClassElement : FieldDefinition; - It is a Syntax Error if PropName of FieldDefinition is "constructor". - ----*/ - - -var constructor = 'foo'; -var C = class { - [constructor]; -}; - -var c = new C(); -assert.sameValue(c.hasOwnProperty("foo"), true); - -assert.sameValue(C.hasOwnProperty("foo"), false); diff --git a/test/language/expressions/class/fields-ctor-called-after-fields-init.js b/test/language/expressions/class/fields-ctor-called-after-fields-init.js index 1ea88de76c..86745235bc 100644 --- a/test/language/expressions/class/fields-ctor-called-after-fields-init.js +++ b/test/language/expressions/class/fields-ctor-called-after-fields-init.js @@ -4,7 +4,7 @@ /*--- description: The constructor method is called after the fields are initalized (field definitions in a class expression) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] info: | [[Construct]] ( argumentsList, newTarget) diff --git a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js index b80496c694..dd380aacfe 100644 --- a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js +++ b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js @@ -23,9 +23,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = eval('executed = true; super()["x"];'); } diff --git a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js index e09d0a2b17..e7a2fde569 100644 --- a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js +++ b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js @@ -7,13 +7,6 @@ esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - Additional Early Error Rules for Eval Outside Constructor Methods These static semantics are applied by PerformEval when a direct eval call occurs outside of the constructor method of a ClassDeclaration or ClassExpression. ScriptBody:StatementList @@ -23,9 +16,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = eval('executed = true; super().x;'); } diff --git a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall.js b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall.js index 4b4a50c00f..e518d46538 100644 --- a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall.js +++ b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-supercall.js @@ -23,9 +23,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = eval('executed = true; super();'); } diff --git a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js index 72049e20d9..c7954bc69c 100644 --- a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js +++ b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js @@ -23,12 +23,11 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = eval('executed = true; super.x;'); -} +}; new C(); diff --git a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js index 2c0c1c52a5..01a9d1f632 100644 --- a/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js +++ b/test/language/expressions/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js @@ -2,33 +2,29 @@ // - src/class-fields/eval-err-contains-superproperty-2.case // - src/class-fields/initializer-eval-super-property/cls-expr-fields-eval.template /*--- -description: error if `super['x']` in StatementList of eval (direct eval) +description: error if super['x'] in StatementList of eval (direct eval) esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody:StatementList + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList It is a Syntax Error if StatementList Contains SuperProperty. ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = eval('executed = true; super["x"];'); -} +}; new C(); diff --git a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js index 325a0d040c..a9c97fe8cd 100644 --- a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js +++ b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js @@ -23,9 +23,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = (0, eval)('executed = true; super()["x"];'); } diff --git a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js index ea36cd9ed1..c983e887ce 100644 --- a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js +++ b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js @@ -7,13 +7,6 @@ esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - Additional Early Error Rules for Eval Outside Constructor Methods These static semantics are applied by PerformEval when a direct eval call occurs outside of the constructor method of a ClassDeclaration or ClassExpression. ScriptBody:StatementList @@ -23,9 +16,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = (0, eval)('executed = true; super().x;'); } diff --git a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall.js b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall.js index 2bb1d7f2ab..44bb95f62f 100644 --- a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall.js +++ b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-supercall.js @@ -23,9 +23,8 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = (0, eval)('executed = true; super();'); } diff --git a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js index 36bf98e3e9..9878a14a92 100644 --- a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js +++ b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js @@ -23,12 +23,11 @@ info: | ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = (0, eval)('executed = true; super.x;'); -} +}; assert.throws(SyntaxError, function() { new C(); diff --git a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js index e636dc056b..9ea13833b2 100644 --- a/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js +++ b/test/language/expressions/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js @@ -2,33 +2,29 @@ // - src/class-fields/eval-err-contains-superproperty-2.case // - src/class-fields/initializer-eval-super-property/cls-expr-fields-indirect-eval.template /*--- -description: error if `super['x']` in StatementList of eval (indirect eval) +description: error if super['x'] in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody:StatementList + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList It is a Syntax Error if StatementList Contains SuperProperty. ---*/ -var A = class {} - var executed = false; +var A = class {} var C = class extends A { x = (0, eval)('executed = true; super["x"];'); -} +}; assert.throws(SyntaxError, function() { new C(); diff --git a/test/language/expressions/class/fields-direct-eval-err-contains-newtarget.js b/test/language/expressions/class/fields-direct-eval-err-contains-newtarget.js index 94cb63a9ea..9422ebd006 100644 --- a/test/language/expressions/class/fields-direct-eval-err-contains-newtarget.js +++ b/test/language/expressions/class/fields-direct-eval-err-contains-newtarget.js @@ -4,7 +4,7 @@ /*--- description: error if `new.target` in StatementList of eval (direct eval) esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, new.target] +features: [class, new.target, class-fields-public] flags: [generated] info: | Additional Early Error Rules for Eval Inside Initializer diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-referenceerror.js b/test/language/expressions/class/fields-evaluation-error-computed-name-referenceerror.js index 66a6c14326..ead74882c3 100644 --- a/test/language/expressions/class/fields-evaluation-error-computed-name-referenceerror.js +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-referenceerror.js @@ -4,7 +4,7 @@ /*--- description: ReferenceError evaluating a computed property name (field definitions in a class expression) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-err.js b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-err.js index 0522c25592..79dbe2d852 100644 --- a/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-err.js +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class expression) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, Symbol.toPrimitive, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js new file mode 100644 index 0000000000..ccd69779f0 --- /dev/null +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/computed-name-toprimitive-returns-noncallable.case +// - src/class-fields/class-evaluation-error/cls-expr.template +/*--- +description: Custom error evaluating a computed property name (field definitions in a class expression) +esid: sec-runtime-semantics-classdefinitionevaluation +features: [computed-property-names, Symbol.toPrimitive, class] +flags: [generated] +info: | + Runtime Semantics: ClassDefinitionEvaluation + + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of me is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + ... + + Runtime Semantics: ClassElementEvaluation + + ClassElement: FieldDefinition; + Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter false and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + ... + + Runtime Semantics: Evaluation + ComputedPropertyName: [ AssignmentExpression ] + + 1. Let exprValue be the result of evaluating AssignmentExpression. + 2. Let propName be ? GetValue(exprValue). + 3. Return ? ToPropertyKey(propName). + +---*/ +var obj = { + [Symbol.toPrimitive]: {} +}; + + + +function evaluate() { + var C = class { + [obj] = refErrorIfEvaluated; + }; +} + +assert.throws(TypeError +, evaluate); diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js new file mode 100644 index 0000000000..3c56ba8a5e --- /dev/null +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/computed-name-toprimitive-returns-nonobject.case +// - src/class-fields/class-evaluation-error/cls-expr.template +/*--- +description: Custom error evaluating a computed property name (field definitions in a class expression) +esid: sec-runtime-semantics-classdefinitionevaluation +features: [computed-property-names, Symbol.toPrimitive, class] +flags: [generated] +info: | + Runtime Semantics: ClassDefinitionEvaluation + + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of me is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + ... + + Runtime Semantics: ClassElementEvaluation + + ClassElement: FieldDefinition; + Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter false and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + ... + + Runtime Semantics: Evaluation + ComputedPropertyName: [ AssignmentExpression ] + + 1. Let exprValue be the result of evaluating AssignmentExpression. + 2. Let propName be ? GetValue(exprValue). + 3. Return ? ToPropertyKey(propName). + +---*/ +var obj = { + [Symbol.toPrimitive]: 42 +}; + + + +function evaluate() { + var C = class { + [obj] = refErrorIfEvaluated; + }; +} + +assert.throws(TypeError, evaluate); diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-tostring-err.js b/test/language/expressions/class/fields-evaluation-error-computed-name-tostring-err.js index cecb9de938..7324732650 100644 --- a/test/language/expressions/class/fields-evaluation-error-computed-name-tostring-err.js +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-tostring-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class expression) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/expressions/class/fields-evaluation-error-computed-name-valueof-err.js b/test/language/expressions/class/fields-evaluation-error-computed-name-valueof-err.js index f709947c11..20f3fe4558 100644 --- a/test/language/expressions/class/fields-evaluation-error-computed-name-valueof-err.js +++ b/test/language/expressions/class/fields-evaluation-error-computed-name-valueof-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class expression) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/expressions/class/fields-indirect-eval-err-contains-newtarget.js b/test/language/expressions/class/fields-indirect-eval-err-contains-newtarget.js index 84a0c29d70..e008008671 100644 --- a/test/language/expressions/class/fields-indirect-eval-err-contains-newtarget.js +++ b/test/language/expressions/class/fields-indirect-eval-err-contains-newtarget.js @@ -4,7 +4,7 @@ /*--- description: error if `new.target` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, new.target] +features: [class, new.target, class-fields-public] flags: [generated] info: | Additional Early Error Rules for Eval Inside Initializer diff --git a/test/language/expressions/class/fields-init-err-evaluation.js b/test/language/expressions/class/fields-init-err-evaluation.js index dd81e90753..baf937e731 100644 --- a/test/language/expressions/class/fields-init-err-evaluation.js +++ b/test/language/expressions/class/fields-init-err-evaluation.js @@ -4,7 +4,7 @@ /*--- description: Return abrupt completion evaluating the field initializer (field definitions in a class expression) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] info: | [[Construct]] ( argumentsList, newTarget) diff --git a/test/language/expressions/class/fields-init-value-defined-after-class.js b/test/language/expressions/class/fields-init-value-defined-after-class.js index 0a2f10d1eb..52e4047a62 100644 --- a/test/language/expressions/class/fields-init-value-defined-after-class.js +++ b/test/language/expressions/class/fields-init-value-defined-after-class.js @@ -4,7 +4,7 @@ /*--- description: The initializer value is defined after the class evaluation (field definitions in a class expression) esid: prod-FieldDefinition -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/expressions/class/fields-init-value-incremental.js b/test/language/expressions/class/fields-init-value-incremental.js index b2b87b9924..b8b62d937b 100644 --- a/test/language/expressions/class/fields-init-value-incremental.js +++ b/test/language/expressions/class/fields-init-value-incremental.js @@ -4,7 +4,7 @@ /*--- description: The initializer value is defined during the class instatiation (field definitions in a class expression) esid: prod-FieldDefinition -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/expressions/class/fields-multiple-definitions-computed-names.js b/test/language/expressions/class/fields-multiple-definitions-computed-names.js index a2ee0a53a3..3017265522 100644 --- a/test/language/expressions/class/fields-multiple-definitions-computed-names.js +++ b/test/language/expressions/class/fields-multiple-definitions-computed-names.js @@ -29,7 +29,7 @@ var C = class { [x] = 42; [10] = "meep"; ["not initialized"] m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-definitions-computed-symbol-names.js b/test/language/expressions/class/fields-multiple-definitions-computed-symbol-names.js index 4de6b2039a..f95fd4a73b 100644 --- a/test/language/expressions/class/fields-multiple-definitions-computed-symbol-names.js +++ b/test/language/expressions/class/fields-multiple-definitions-computed-symbol-names.js @@ -30,7 +30,7 @@ var C = class { [x]; [y] = 42 m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-definitions-literal-names.js b/test/language/expressions/class/fields-multiple-definitions-literal-names.js index c6036f8514..66de23bea5 100644 --- a/test/language/expressions/class/fields-multiple-definitions-literal-names.js +++ b/test/language/expressions/class/fields-multiple-definitions-literal-names.js @@ -30,7 +30,7 @@ var C = class { c = fn m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-definitions-private-names.js b/test/language/expressions/class/fields-multiple-definitions-private-names.js index 716b43beaf..ceef5621fb 100644 --- a/test/language/expressions/class/fields-multiple-definitions-private-names.js +++ b/test/language/expressions/class/fields-multiple-definitions-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-multiple-definitions.template /*--- -description: static literal private names (multiple fields definitions) +description: private names (multiple fields definitions) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -30,7 +30,7 @@ var C = class { #x; #y m2() { return 39 } bar = "barbaz"; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-multiple-definitions-static-private-fields.js b/test/language/expressions/class/fields-multiple-definitions-static-private-fields.js new file mode 100644 index 0000000000..8898f73090 --- /dev/null +++ b/test/language/expressions/class/fields-multiple-definitions-static-private-fields.js @@ -0,0 +1,102 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-multiple-definitions.template +/*--- +description: static private fields (multiple fields definitions) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + foo = "foobar"; + m() { return 42 } + static #x; static #y + m2() { return 39 } + bar = "barbaz"; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.m2(), 39); +assert.sameValue(Object.hasOwnProperty.call(c, "m2"), false); +assert.sameValue(c.m2, C.prototype.m2); + +verifyProperty(C.prototype, "m2", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-multiple-definitions-static-private-methods-proxy.js b/test/language/expressions/class/fields-multiple-definitions-static-private-methods-proxy.js new file mode 100644 index 0000000000..5a46f0832c --- /dev/null +++ b/test/language/expressions/class/fields-multiple-definitions-static-private-methods-proxy.js @@ -0,0 +1,40 @@ +// Copyright (C) 2018 Rick Waldron. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Static private methods not accessible via default Proxy handler +esid: prod-FieldDefinition +features: [class, class-static-methods-private] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x(value) { + return 1; + } + static x() { + return this.#x(); + } +} + +var P = new Proxy(C, {}); + +assert.sameValue(C.x(), 1); +assert.throws(TypeError, function() { + P.x(); +}); diff --git a/test/language/expressions/class/fields-multiple-definitions-static-private-methods.js b/test/language/expressions/class/fields-multiple-definitions-static-private-methods.js new file mode 100644 index 0000000000..dec012b261 --- /dev/null +++ b/test/language/expressions/class/fields-multiple-definitions-static-private-methods.js @@ -0,0 +1,108 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-multiple-definitions.template +/*--- +description: static private methods (multiple fields definitions) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + foo = "foobar"; + m() { return 42 } + static #xVal; static #yVal + m2() { return 39 } + bar = "barbaz"; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.m2(), 39); +assert.sameValue(Object.hasOwnProperty.call(c, "m2"), false); +assert.sameValue(c.m2, C.prototype.m2); + +verifyProperty(C.prototype, "m2", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-multiple-definitions-string-literal-names.js b/test/language/expressions/class/fields-multiple-definitions-string-literal-names.js index e2957ad149..a2815cd54f 100644 --- a/test/language/expressions/class/fields-multiple-definitions-string-literal-names.js +++ b/test/language/expressions/class/fields-multiple-definitions-string-literal-names.js @@ -28,7 +28,7 @@ var C = class { "d" = 42 m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-computed-names.js b/test/language/expressions/class/fields-multiple-stacked-definitions-computed-names.js index fb384b1376..0174e24669 100644 --- a/test/language/expressions/class/fields-multiple-stacked-definitions-computed-names.js +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-computed-names.js @@ -27,7 +27,7 @@ var C = class { [x] = 42; [10] = "meep"; ["not initialized"] foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-computed-symbol-names.js b/test/language/expressions/class/fields-multiple-stacked-definitions-computed-symbol-names.js index d92d329622..97ac2d4f73 100644 --- a/test/language/expressions/class/fields-multiple-stacked-definitions-computed-symbol-names.js +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-computed-symbol-names.js @@ -28,7 +28,7 @@ var C = class { [x]; [y] = 42 foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-literal-names.js b/test/language/expressions/class/fields-multiple-stacked-definitions-literal-names.js index f0a676b327..2ca220c61c 100644 --- a/test/language/expressions/class/fields-multiple-stacked-definitions-literal-names.js +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-literal-names.js @@ -28,7 +28,7 @@ var C = class { c = fn foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-private-names.js b/test/language/expressions/class/fields-multiple-stacked-definitions-private-names.js index 6dc6095542..3bf30d3655 100644 --- a/test/language/expressions/class/fields-multiple-stacked-definitions-private-names.js +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-multiple-stacked-definitions.template /*--- -description: static literal private names (multiple stacked fields definitions through ASI) +description: private names (multiple stacked fields definitions through ASI) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -28,7 +28,7 @@ var C = class { #x; #y foo = "foobar" bar = "barbaz"; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-fields.js b/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-fields.js new file mode 100644 index 0000000000..b92b29eb46 --- /dev/null +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-fields.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-multiple-stacked-definitions.template +/*--- +description: static private fields (multiple stacked fields definitions through ASI) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y + foo = "foobar" + bar = "barbaz"; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-methods.js b/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-methods.js new file mode 100644 index 0000000000..85791c2060 --- /dev/null +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-static-private-methods.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-multiple-stacked-definitions.template +/*--- +description: static private methods (multiple stacked fields definitions through ASI) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal + foo = "foobar" + bar = "barbaz"; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-multiple-stacked-definitions-string-literal-names.js b/test/language/expressions/class/fields-multiple-stacked-definitions-string-literal-names.js index 90c6b7cd1b..1de4a11c09 100644 --- a/test/language/expressions/class/fields-multiple-stacked-definitions-string-literal-names.js +++ b/test/language/expressions/class/fields-multiple-stacked-definitions-string-literal-names.js @@ -26,7 +26,7 @@ var C = class { "d" = 42 foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-computed-names.js b/test/language/expressions/class/fields-new-no-sc-line-method-computed-names.js index 50538a5dea..0c10e823dc 100644 --- a/test/language/expressions/class/fields-new-no-sc-line-method-computed-names.js +++ b/test/language/expressions/class/fields-new-no-sc-line-method-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"] m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-computed-symbol-names.js b/test/language/expressions/class/fields-new-no-sc-line-method-computed-symbol-names.js index 3139836e1c..5ec1f72a6e 100644 --- a/test/language/expressions/class/fields-new-no-sc-line-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-new-no-sc-line-method-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42 m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-literal-names.js b/test/language/expressions/class/fields-new-no-sc-line-method-literal-names.js index 477b4b21fd..20aaeeac10 100644 --- a/test/language/expressions/class/fields-new-no-sc-line-method-literal-names.js +++ b/test/language/expressions/class/fields-new-no-sc-line-method-literal-names.js @@ -27,7 +27,7 @@ var C = class { a; b = 42; c = fn m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-private-names.js b/test/language/expressions/class/fields-new-no-sc-line-method-private-names.js index 76048e7e03..32828b7303 100644 --- a/test/language/expressions/class/fields-new-no-sc-line-method-private-names.js +++ b/test/language/expressions/class/fields-new-no-sc-line-method-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-new-no-sc-line-method.template /*--- -description: static literal private names (field definitions followed by a method in a new line without a semicolon) +description: private names (field definitions followed by a method in a new line without a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | var C = class { #x; #y m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-static-private-fields.js b/test/language/expressions/class/fields-new-no-sc-line-method-static-private-fields.js new file mode 100644 index 0000000000..be9b34dd24 --- /dev/null +++ b/test/language/expressions/class/fields-new-no-sc-line-method-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-new-no-sc-line-method.template +/*--- +description: static private fields (field definitions followed by a method in a new line without a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y + m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-static-private-methods.js b/test/language/expressions/class/fields-new-no-sc-line-method-static-private-methods.js new file mode 100644 index 0000000000..5c41cadc9a --- /dev/null +++ b/test/language/expressions/class/fields-new-no-sc-line-method-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-new-no-sc-line-method.template +/*--- +description: static private methods (field definitions followed by a method in a new line without a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal + m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-no-sc-line-method-string-literal-names.js b/test/language/expressions/class/fields-new-no-sc-line-method-string-literal-names.js index 3183a04453..5466a60bca 100644 --- a/test/language/expressions/class/fields-new-no-sc-line-method-string-literal-names.js +++ b/test/language/expressions/class/fields-new-no-sc-line-method-string-literal-names.js @@ -25,7 +25,7 @@ var C = class { 'a'; "b"; 'c' = 39; "d" = 42 m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-computed-names.js b/test/language/expressions/class/fields-new-sc-line-gen-computed-names.js index 5d1e910a38..ecea272f92 100644 --- a/test/language/expressions/class/fields-new-sc-line-gen-computed-names.js +++ b/test/language/expressions/class/fields-new-sc-line-gen-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"]; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-computed-symbol-names.js b/test/language/expressions/class/fields-new-sc-line-gen-computed-symbol-names.js index 2e3e813a50..fdfbb093dd 100644 --- a/test/language/expressions/class/fields-new-sc-line-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-new-sc-line-gen-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-literal-names.js b/test/language/expressions/class/fields-new-sc-line-gen-literal-names.js index 2551403195..102b482453 100644 --- a/test/language/expressions/class/fields-new-sc-line-gen-literal-names.js +++ b/test/language/expressions/class/fields-new-sc-line-gen-literal-names.js @@ -27,7 +27,7 @@ var C = class { a; b = 42; c = fn; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-private-names.js b/test/language/expressions/class/fields-new-sc-line-gen-private-names.js index e72c8e6748..399bf822c9 100644 --- a/test/language/expressions/class/fields-new-sc-line-gen-private-names.js +++ b/test/language/expressions/class/fields-new-sc-line-gen-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-new-sc-line-generator.template /*--- -description: static literal private names (field definitions followed by a method in a new line with a semicolon) +description: private names (field definitions followed by a method in a new line with a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, generators] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | var C = class { #x; #y; *m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-new-sc-line-gen-static-private-fields.js b/test/language/expressions/class/fields-new-sc-line-gen-static-private-fields.js new file mode 100644 index 0000000000..1595aca16c --- /dev/null +++ b/test/language/expressions/class/fields-new-sc-line-gen-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-new-sc-line-generator.template +/*--- +description: static private fields (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y; + *m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-static-private-methods.js b/test/language/expressions/class/fields-new-sc-line-gen-static-private-methods.js new file mode 100644 index 0000000000..525cb72141 --- /dev/null +++ b/test/language/expressions/class/fields-new-sc-line-gen-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-new-sc-line-generator.template +/*--- +description: static private methods (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal; + *m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-sc-line-gen-string-literal-names.js b/test/language/expressions/class/fields-new-sc-line-gen-string-literal-names.js index 751a5016a5..ecc41b6ee3 100644 --- a/test/language/expressions/class/fields-new-sc-line-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-new-sc-line-gen-string-literal-names.js @@ -25,7 +25,7 @@ var C = class { 'a'; "b"; 'c' = 39; "d" = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-method-computed-names.js b/test/language/expressions/class/fields-new-sc-line-method-computed-names.js index 37a17dee8f..feee67ec7e 100644 --- a/test/language/expressions/class/fields-new-sc-line-method-computed-names.js +++ b/test/language/expressions/class/fields-new-sc-line-method-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"]; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-method-computed-symbol-names.js b/test/language/expressions/class/fields-new-sc-line-method-computed-symbol-names.js index fdf9cf0f75..93bbdd4a1c 100644 --- a/test/language/expressions/class/fields-new-sc-line-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-new-sc-line-method-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-method-literal-names.js b/test/language/expressions/class/fields-new-sc-line-method-literal-names.js index 0f771745d3..239c4b5aa2 100644 --- a/test/language/expressions/class/fields-new-sc-line-method-literal-names.js +++ b/test/language/expressions/class/fields-new-sc-line-method-literal-names.js @@ -27,7 +27,7 @@ var C = class { a; b = 42; c = fn; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-new-sc-line-method-private-names.js b/test/language/expressions/class/fields-new-sc-line-method-private-names.js index 959a5874e4..79bc6a00f4 100644 --- a/test/language/expressions/class/fields-new-sc-line-method-private-names.js +++ b/test/language/expressions/class/fields-new-sc-line-method-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-new-sc-line-method.template /*--- -description: static literal private names (field definitions followed by a method in a new line with a semicolon) +description: private names (field definitions followed by a method in a new line with a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | var C = class { #x; #y; m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-new-sc-line-method-static-private-fields.js b/test/language/expressions/class/fields-new-sc-line-method-static-private-fields.js new file mode 100644 index 0000000000..babe419336 --- /dev/null +++ b/test/language/expressions/class/fields-new-sc-line-method-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-new-sc-line-method.template +/*--- +description: static private fields (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y; + m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-sc-line-method-static-private-methods.js b/test/language/expressions/class/fields-new-sc-line-method-static-private-methods.js new file mode 100644 index 0000000000..4074913bf3 --- /dev/null +++ b/test/language/expressions/class/fields-new-sc-line-method-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-new-sc-line-method.template +/*--- +description: static private methods (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal; + m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-new-sc-line-method-string-literal-names.js b/test/language/expressions/class/fields-new-sc-line-method-string-literal-names.js index da01227204..5a8c955e35 100644 --- a/test/language/expressions/class/fields-new-sc-line-method-string-literal-names.js +++ b/test/language/expressions/class/fields-new-sc-line-method-string-literal-names.js @@ -25,7 +25,7 @@ var C = class { 'a'; "b"; 'c' = 39; "d" = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-private-direct-eval-err-contains-arguments.js b/test/language/expressions/class/fields-private-direct-eval-err-contains-arguments.js new file mode 100644 index 0000000000..1c0c822c55 --- /dev/null +++ b/test/language/expressions/class/fields-private-direct-eval-err-contains-arguments.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-arguments.case +// - src/class-fields/initializer-eval-arguments/cls-expr-private-fields-eval.template +/*--- +description: error if `arguments` in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + It is a Syntax Error if ContainsArguments of StatementList is true. + ... + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +var executed = false; +var C = class { + #x = eval('executed = true; arguments;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/test/language/expressions/class/fields-private-direct-eval-err-contains-newtarget.js b/test/language/expressions/class/fields-private-direct-eval-err-contains-newtarget.js new file mode 100644 index 0000000000..2273bc4dfd --- /dev/null +++ b/test/language/expressions/class/fields-private-direct-eval-err-contains-newtarget.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-newtarget.case +// - src/class-fields/initializer-eval-newtarget/cls-expr-private-fields-eval.template +/*--- +description: error if `new.target` in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, new.target, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Functions + These static semantics are applied by PerformEval when a direct eval call occurs outside of any function. + ScriptBody:StatementList + + It is a Syntax Error if StatementList Contains NewTarget. + +---*/ + + +var executed = false; +var C = class { + #x = eval('executed = true; new.target;'); +} + +var c = new C(); + +assert.sameValue(executed, true); +assert.sameValue(c.x, undefined); diff --git a/test/language/expressions/class/fields-private-indirect-eval-err-contains-arguments.js b/test/language/expressions/class/fields-private-indirect-eval-err-contains-arguments.js new file mode 100644 index 0000000000..15fc715f65 --- /dev/null +++ b/test/language/expressions/class/fields-private-indirect-eval-err-contains-arguments.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-arguments.case +// - src/class-fields/initializer-eval-arguments/cls-expr-private-fields-indirect-eval.template +/*--- +description: error if `arguments` in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + It is a Syntax Error if ContainsArguments of StatementList is true. + ... + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +var executed = false; +var C = class { + #x = (0, eval)('executed = true; arguments;'); +} + +assert.throws(ReferenceError, function() { + new C(); +}); + +assert.sameValue(executed, true); diff --git a/test/language/expressions/class/fields-private-indirect-eval-err-contains-newtarget.js b/test/language/expressions/class/fields-private-indirect-eval-err-contains-newtarget.js new file mode 100644 index 0000000000..42e0f30ecf --- /dev/null +++ b/test/language/expressions/class/fields-private-indirect-eval-err-contains-newtarget.js @@ -0,0 +1,35 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-newtarget.case +// - src/class-fields/initializer-eval-newtarget/cls-expr-private-fields-indirect-eval.template +/*--- +description: error if `new.target` in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, new.target, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Functions + These static semantics are applied by PerformEval when a direct eval call occurs outside of any function. + ScriptBody:StatementList + + It is a Syntax Error if StatementList Contains NewTarget. + +---*/ + + +var executed = false; +var C = class { + #x = (0, eval)('executed = true; new.target;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/test/language/expressions/class/fields-redeclaration-symbol.js b/test/language/expressions/class/fields-redeclaration-symbol.js index 4e42bf38d6..f1c1a4dec7 100644 --- a/test/language/expressions/class/fields-redeclaration-symbol.js +++ b/test/language/expressions/class/fields-redeclaration-symbol.js @@ -4,7 +4,7 @@ /*--- description: Redeclaration of public fields with the same name (field definitions in a class expression) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] includes: [propertyHelper.js, compareArray.js] info: | diff --git a/test/language/expressions/class/fields-redeclaration.js b/test/language/expressions/class/fields-redeclaration.js index 24234ce21b..d8762afee1 100644 --- a/test/language/expressions/class/fields-redeclaration.js +++ b/test/language/expressions/class/fields-redeclaration.js @@ -4,7 +4,7 @@ /*--- description: Redeclaration of public fields with the same name (field definitions in a class expression) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] includes: [propertyHelper.js, compareArray.js] info: | diff --git a/test/language/expressions/class/fields-regular-definitions-computed-names.js b/test/language/expressions/class/fields-regular-definitions-computed-names.js index fc724d59d0..fb8da12d2e 100644 --- a/test/language/expressions/class/fields-regular-definitions-computed-names.js +++ b/test/language/expressions/class/fields-regular-definitions-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"] - + } var c = new C(); diff --git a/test/language/expressions/class/fields-regular-definitions-computed-symbol-names.js b/test/language/expressions/class/fields-regular-definitions-computed-symbol-names.js index 3347897180..87700b4fc9 100644 --- a/test/language/expressions/class/fields-regular-definitions-computed-symbol-names.js +++ b/test/language/expressions/class/fields-regular-definitions-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42 - + } var c = new C(); diff --git a/test/language/expressions/class/fields-regular-definitions-literal-names.js b/test/language/expressions/class/fields-regular-definitions-literal-names.js index 6bcbfd9de5..2a7f25dd50 100644 --- a/test/language/expressions/class/fields-regular-definitions-literal-names.js +++ b/test/language/expressions/class/fields-regular-definitions-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { a; b = 42; c = fn - + } var c = new C(); diff --git a/test/language/expressions/class/fields-regular-definitions-private-names.js b/test/language/expressions/class/fields-regular-definitions-private-names.js index 86a26026a4..5e84f59b16 100644 --- a/test/language/expressions/class/fields-regular-definitions-private-names.js +++ b/test/language/expressions/class/fields-regular-definitions-private-names.js @@ -2,30 +2,30 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-regular-definitions.template /*--- -description: static literal private names (regular fields defintion) +description: private names (regular fields defintion) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { #x; #y -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-static-private-names.js b/test/language/expressions/class/fields-regular-definitions-static-private-fields.js similarity index 71% rename from test/language/statements/class/fields-static-private-names.js rename to test/language/expressions/class/fields-regular-definitions-static-private-fields.js index 4192939646..ba9d0f026f 100644 --- a/test/language/statements/class/fields-static-private-names.js +++ b/test/language/expressions/class/fields-regular-definitions-static-private-fields.js @@ -1,32 +1,42 @@ // This file was procedurally generated from the following sources: -// - src/class-fields/static-private-names.case -// - src/class-fields/default/cls-decl.template +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-regular-definitions.template /*--- -description: literal private names (field definitions in a class declaration) +description: static private fields (regular fields defintion) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class-static-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... static FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: + PrivateName : # IdentifierName ---*/ -class C { +var C = class { static #x; static #y + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } } +var c = new C(); + // Test the private fields do not appear as properties before set to value assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); diff --git a/test/language/expressions/class/fields-regular-definitions-static-private-methods.js b/test/language/expressions/class/fields-regular-definitions-static-private-methods.js new file mode 100644 index 0000000000..e1ef400f13 --- /dev/null +++ b/test/language/expressions/class/fields-regular-definitions-static-private-methods.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-regular-definitions.template +/*--- +description: static private methods (regular fields defintion) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-regular-definitions-string-literal-names.js b/test/language/expressions/class/fields-regular-definitions-string-literal-names.js index d0afcaa36d..5e316ec03f 100644 --- a/test/language/expressions/class/fields-regular-definitions-string-literal-names.js +++ b/test/language/expressions/class/fields-regular-definitions-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { 'a'; "b"; 'c' = 39; "d" = 42 - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-gen-computed-names.js b/test/language/expressions/class/fields-same-line-async-gen-computed-names.js index d312f9c70d..7f8d920fec 100644 --- a/test/language/expressions/class/fields-same-line-async-gen-computed-names.js +++ b/test/language/expressions/class/fields-same-line-async-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { async *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-gen-computed-symbol-names.js b/test/language/expressions/class/fields-same-line-async-gen-computed-symbol-names.js index 294259667e..a8d955ec20 100644 --- a/test/language/expressions/class/fields-same-line-async-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-same-line-async-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { async *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-gen-literal-names.js b/test/language/expressions/class/fields-same-line-async-gen-literal-names.js index 0796a955c9..861efccce1 100644 --- a/test/language/expressions/class/fields-same-line-async-gen-literal-names.js +++ b/test/language/expressions/class/fields-same-line-async-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { async *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-gen-private-names.js b/test/language/expressions/class/fields-same-line-async-gen-private-names.js index db0ed84992..05ddab3fe4 100644 --- a/test/language/expressions/class/fields-same-line-async-gen-private-names.js +++ b/test/language/expressions/class/fields-same-line-async-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-async-gen.template /*--- -description: static literal private names (field definitions after an async generator in the same line) +description: private names (field definitions after an async generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-iteration] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { async *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-same-line-async-gen-static-private-fields.js b/test/language/expressions/class/fields-same-line-async-gen-static-private-fields.js new file mode 100644 index 0000000000..40d189e4db --- /dev/null +++ b/test/language/expressions/class/fields-same-line-async-gen-static-private-fields.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-async-gen.template +/*--- +description: static private fields (field definitions after an async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + async *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +c.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-same-line-async-gen-static-private-methods.js b/test/language/expressions/class/fields-same-line-async-gen-static-private-methods.js new file mode 100644 index 0000000000..2bbac54e1b --- /dev/null +++ b/test/language/expressions/class/fields-same-line-async-gen-static-private-methods.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-async-gen.template +/*--- +description: static private methods (field definitions after an async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + async *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +c.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-same-line-async-gen-string-literal-names.js b/test/language/expressions/class/fields-same-line-async-gen-string-literal-names.js index b72f2c2454..108d2cf8f1 100644 --- a/test/language/expressions/class/fields-same-line-async-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-same-line-async-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { async *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-method-computed-names.js b/test/language/expressions/class/fields-same-line-async-method-computed-names.js index 82031be527..c358d94b9b 100644 --- a/test/language/expressions/class/fields-same-line-async-method-computed-names.js +++ b/test/language/expressions/class/fields-same-line-async-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { async m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-method-computed-symbol-names.js b/test/language/expressions/class/fields-same-line-async-method-computed-symbol-names.js index 1519d8d04f..b211484c3b 100644 --- a/test/language/expressions/class/fields-same-line-async-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-same-line-async-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { async m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-method-literal-names.js b/test/language/expressions/class/fields-same-line-async-method-literal-names.js index 11b3ff42a1..b4dbeb9bc4 100644 --- a/test/language/expressions/class/fields-same-line-async-method-literal-names.js +++ b/test/language/expressions/class/fields-same-line-async-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { async m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-async-method-private-names.js b/test/language/expressions/class/fields-same-line-async-method-private-names.js index c357bc6637..dab4667908 100644 --- a/test/language/expressions/class/fields-same-line-async-method-private-names.js +++ b/test/language/expressions/class/fields-same-line-async-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-after-same-line-async-method.template /*--- -description: static literal private names (field definitions after an async method in the same line) +description: private names (field definitions after an async method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-functions] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { async m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-same-line-async-method-static-private-fields.js b/test/language/expressions/class/fields-same-line-async-method-static-private-fields.js new file mode 100644 index 0000000000..2370de7b56 --- /dev/null +++ b/test/language/expressions/class/fields-same-line-async-method-static-private-fields.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-after-same-line-async-method.template +/*--- +description: static private fields (field definitions after an async method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + async m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +c.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-same-line-async-method-static-private-methods.js b/test/language/expressions/class/fields-same-line-async-method-static-private-methods.js new file mode 100644 index 0000000000..fadd09677c --- /dev/null +++ b/test/language/expressions/class/fields-same-line-async-method-static-private-methods.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-after-same-line-async-method.template +/*--- +description: static private methods (field definitions after an async method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + async m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +c.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/expressions/class/fields-same-line-async-method-string-literal-names.js b/test/language/expressions/class/fields-same-line-async-method-string-literal-names.js index 9bc2eac679..a311fd7c94 100644 --- a/test/language/expressions/class/fields-same-line-async-method-string-literal-names.js +++ b/test/language/expressions/class/fields-same-line-async-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { async m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-gen-computed-names.js b/test/language/expressions/class/fields-same-line-gen-computed-names.js index 3f9e73ae98..9beb411697 100644 --- a/test/language/expressions/class/fields-same-line-gen-computed-names.js +++ b/test/language/expressions/class/fields-same-line-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"]; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-gen-computed-symbol-names.js b/test/language/expressions/class/fields-same-line-gen-computed-symbol-names.js index 8f038bfb12..77726bee19 100644 --- a/test/language/expressions/class/fields-same-line-gen-computed-symbol-names.js +++ b/test/language/expressions/class/fields-same-line-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-gen-literal-names.js b/test/language/expressions/class/fields-same-line-gen-literal-names.js index d59e9e2b89..e3283b6a4b 100644 --- a/test/language/expressions/class/fields-same-line-gen-literal-names.js +++ b/test/language/expressions/class/fields-same-line-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { a; b = 42; c = fn; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-gen-private-names.js b/test/language/expressions/class/fields-same-line-gen-private-names.js index dad18ab09c..91f1b7eefa 100644 --- a/test/language/expressions/class/fields-same-line-gen-private-names.js +++ b/test/language/expressions/class/fields-same-line-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-same-line-generator.template /*--- -description: static literal private names (field definitions followed by a generator method in the same line) +description: private names (field definitions followed by a generator method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, generators] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { #x; #y; *m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-same-line-gen-static-private-fields.js b/test/language/expressions/class/fields-same-line-gen-static-private-fields.js new file mode 100644 index 0000000000..5f1fdd0487 --- /dev/null +++ b/test/language/expressions/class/fields-same-line-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-same-line-generator.template +/*--- +description: static private fields (field definitions followed by a generator method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y; *m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-same-line-gen-static-private-methods.js b/test/language/expressions/class/fields-same-line-gen-static-private-methods.js new file mode 100644 index 0000000000..d659b01a94 --- /dev/null +++ b/test/language/expressions/class/fields-same-line-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-same-line-generator.template +/*--- +description: static private methods (field definitions followed by a generator method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal; *m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-same-line-gen-string-literal-names.js b/test/language/expressions/class/fields-same-line-gen-string-literal-names.js index 1765683b65..c566da04d7 100644 --- a/test/language/expressions/class/fields-same-line-gen-string-literal-names.js +++ b/test/language/expressions/class/fields-same-line-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { 'a'; "b"; 'c' = 39; "d" = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-method-computed-names.js b/test/language/expressions/class/fields-same-line-method-computed-names.js index eb626db479..4958c0ffb5 100644 --- a/test/language/expressions/class/fields-same-line-method-computed-names.js +++ b/test/language/expressions/class/fields-same-line-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; var C = class { [x] = 42; [10] = "meep"; ["not initialized"]; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-method-computed-symbol-names.js b/test/language/expressions/class/fields-same-line-method-computed-symbol-names.js index e063a1ab9b..bbed59a05b 100644 --- a/test/language/expressions/class/fields-same-line-method-computed-symbol-names.js +++ b/test/language/expressions/class/fields-same-line-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); var C = class { [x]; [y] = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-method-literal-names.js b/test/language/expressions/class/fields-same-line-method-literal-names.js index 70c7af3f8d..c448686a73 100644 --- a/test/language/expressions/class/fields-same-line-method-literal-names.js +++ b/test/language/expressions/class/fields-same-line-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} var C = class { a; b = 42; c = fn; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-same-line-method-private-names.js b/test/language/expressions/class/fields-same-line-method-private-names.js index 354f77ec47..d041a3e61e 100644 --- a/test/language/expressions/class/fields-same-line-method-private-names.js +++ b/test/language/expressions/class/fields-same-line-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-same-line-method.template /*--- -description: static literal private names (field definitions followed by a method in the same line) +description: private names (field definitions followed by a method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ var C = class { #x; #y; m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-same-line-method-static-private-fields.js b/test/language/expressions/class/fields-same-line-method-static-private-fields.js new file mode 100644 index 0000000000..bffbb73d9f --- /dev/null +++ b/test/language/expressions/class/fields-same-line-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-same-line-method.template +/*--- +description: static private fields (field definitions followed by a method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #x; static #y; m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-same-line-method-static-private-methods.js b/test/language/expressions/class/fields-same-line-method-static-private-methods.js new file mode 100644 index 0000000000..a1c0c40cd5 --- /dev/null +++ b/test/language/expressions/class/fields-same-line-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-same-line-method.template +/*--- +description: static private methods (field definitions followed by a method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + static #xVal; static #yVal; m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-same-line-method-string-literal-names.js b/test/language/expressions/class/fields-same-line-method-string-literal-names.js index e0823a9cd1..a9ae3ec04a 100644 --- a/test/language/expressions/class/fields-same-line-method-string-literal-names.js +++ b/test/language/expressions/class/fields-same-line-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | var C = class { 'a'; "b"; 'c' = 39; "d" = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/expressions/class/fields-static-comp-name-init-err-contains-arguments.js b/test/language/expressions/class/fields-static-comp-name-init-err-contains-arguments.js new file mode 100644 index 0000000000..71a013ef75 --- /dev/null +++ b/test/language/expressions/class/fields-static-comp-name-init-err-contains-arguments.js @@ -0,0 +1,35 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-arguments.case +// - src/class-fields/initializer-error/cls-expr-fields-static-comp-name.template +/*--- +description: Syntax error if `arguments` used in class field (static computed ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if ContainsArguments of Initializer is true. + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var x = "string"; +var C = class { + static [x] = arguments; +} diff --git a/test/language/expressions/class/fields-static-comp-name-init-err-contains-super.js b/test/language/expressions/class/fields-static-comp-name-init-err-contains-super.js new file mode 100644 index 0000000000..49605fef46 --- /dev/null +++ b/test/language/expressions/class/fields-static-comp-name-init-err-contains-super.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-super.case +// - src/class-fields/initializer-error/cls-expr-fields-static-comp-name.template +/*--- +description: Syntax error if `super()` used in class field (static computed ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if Initializer is present and Initializer Contains SuperCall is true. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var x = "string"; +var C = class { + static [x] = super(); +} diff --git a/test/language/expressions/class/fields-static-literal-init-err-contains-arguments.js b/test/language/expressions/class/fields-static-literal-init-err-contains-arguments.js new file mode 100644 index 0000000000..a5223c3f1d --- /dev/null +++ b/test/language/expressions/class/fields-static-literal-init-err-contains-arguments.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-arguments.case +// - src/class-fields/initializer-error/cls-expr-fields-static-literal-name.template +/*--- +description: Syntax error if `arguments` used in class field (static literal ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if ContainsArguments of Initializer is true. + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static x = arguments; +} diff --git a/test/language/expressions/class/fields-static-literal-init-err-contains-super.js b/test/language/expressions/class/fields-static-literal-init-err-contains-super.js new file mode 100644 index 0000000000..ac49312a9c --- /dev/null +++ b/test/language/expressions/class/fields-static-literal-init-err-contains-super.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-super.case +// - src/class-fields/initializer-error/cls-expr-fields-static-literal-name.template +/*--- +description: Syntax error if `super()` used in class field (static literal ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if Initializer is present and Initializer Contains SuperCall is true. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static x = super(); +} diff --git a/test/language/expressions/class/fields-static-private-init-err-contains-arguments.js b/test/language/expressions/class/fields-static-private-init-err-contains-arguments.js new file mode 100644 index 0000000000..bcc2a49cd3 --- /dev/null +++ b/test/language/expressions/class/fields-static-private-init-err-contains-arguments.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-arguments.case +// - src/class-fields/initializer-error/cls-expr-fields-static-private-name.template +/*--- +description: Syntax error if `arguments` used in class field (static PrivateName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-private] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if ContainsArguments of Initializer is true. + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static #x = arguments; +} diff --git a/test/language/expressions/class/fields-static-private-init-err-contains-super.js b/test/language/expressions/class/fields-static-private-init-err-contains-super.js new file mode 100644 index 0000000000..feaf029a14 --- /dev/null +++ b/test/language/expressions/class/fields-static-private-init-err-contains-super.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-super.case +// - src/class-fields/initializer-error/cls-expr-fields-static-private-name.template +/*--- +description: Syntax error if `super()` used in class field (static PrivateName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-private] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if Initializer is present and Initializer Contains SuperCall is true. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static #x = super(); +} diff --git a/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-arguments.js b/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-arguments.js new file mode 100644 index 0000000000..787a945674 --- /dev/null +++ b/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-arguments.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-arguments.case +// - src/class-fields/initializer-error/cls-expr-fields-static-string-literal-name.template +/*--- +description: Syntax error if `arguments` used in class field (static string literal ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if ContainsArguments of Initializer is true. + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static 'x' = arguments; +} diff --git a/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-super.js b/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-super.js new file mode 100644 index 0000000000..5a5474dce9 --- /dev/null +++ b/test/language/expressions/class/fields-static-string-literal-name-init-err-contains-super.js @@ -0,0 +1,27 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-super.case +// - src/class-fields/initializer-error/cls-expr-fields-static-string-literal-name.template +/*--- +description: Syntax error if `super()` used in class field (static string literal ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public, class-static-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if Initializer is present and Initializer Contains SuperCall is true. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var C = class { + static 'x' = super(); +} diff --git a/test/language/expressions/class/fields-wrapped-in-sc-computed-names.js b/test/language/expressions/class/fields-wrapped-in-sc-computed-names.js index 607437f8f7..34b6bb0f90 100644 --- a/test/language/expressions/class/fields-wrapped-in-sc-computed-names.js +++ b/test/language/expressions/class/fields-wrapped-in-sc-computed-names.js @@ -27,7 +27,7 @@ var C = class { ;;;; ;;;;;;[x] = 42; [10] = "meep"; ["not initialized"];;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-wrapped-in-sc-computed-symbol-names.js b/test/language/expressions/class/fields-wrapped-in-sc-computed-symbol-names.js index ff4fc8ae92..2ac06208b5 100644 --- a/test/language/expressions/class/fields-wrapped-in-sc-computed-symbol-names.js +++ b/test/language/expressions/class/fields-wrapped-in-sc-computed-symbol-names.js @@ -28,7 +28,7 @@ var C = class { ;;;; ;;;;;;[x]; [y] = 42;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-wrapped-in-sc-literal-names.js b/test/language/expressions/class/fields-wrapped-in-sc-literal-names.js index a12d79c9c4..01bd09b25b 100644 --- a/test/language/expressions/class/fields-wrapped-in-sc-literal-names.js +++ b/test/language/expressions/class/fields-wrapped-in-sc-literal-names.js @@ -28,7 +28,7 @@ var C = class { ;;;;;;a; b = 42; c = fn;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/expressions/class/fields-wrapped-in-sc-private-names.js b/test/language/expressions/class/fields-wrapped-in-sc-private-names.js index cb551e4c88..6bdf637ffb 100644 --- a/test/language/expressions/class/fields-wrapped-in-sc-private-names.js +++ b/test/language/expressions/class/fields-wrapped-in-sc-private-names.js @@ -2,23 +2,23 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-expr-wrapped-in-sc.template /*--- -description: static literal private names (fields definition wrapped in semicolons) +description: private names (fields definition wrapped in semicolons) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ var C = class { ;;;; ;;;;;;#x; #y;;;;;;; ;;;; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/expressions/class/fields-wrapped-in-sc-static-private-fields.js b/test/language/expressions/class/fields-wrapped-in-sc-static-private-fields.js new file mode 100644 index 0000000000..f501112962 --- /dev/null +++ b/test/language/expressions/class/fields-wrapped-in-sc-static-private-fields.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-expr-wrapped-in-sc.template +/*--- +description: static private fields (fields definition wrapped in semicolons) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + ;;;; + ;;;;;;static #x; static #y;;;;;;; + ;;;; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/expressions/class/fields-wrapped-in-sc-static-private-methods.js b/test/language/expressions/class/fields-wrapped-in-sc-static-private-methods.js new file mode 100644 index 0000000000..32636c420d --- /dev/null +++ b/test/language/expressions/class/fields-wrapped-in-sc-static-private-methods.js @@ -0,0 +1,63 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-expr-wrapped-in-sc.template +/*--- +description: static private methods (fields definition wrapped in semicolons) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +var C = class { + ;;;; + ;;;;;;static #xVal; static #yVal;;;;;;; + ;;;; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/expressions/class/fields-wrapped-in-sc-string-literal-names.js b/test/language/expressions/class/fields-wrapped-in-sc-string-literal-names.js index 1260883fe3..c2f2540647 100644 --- a/test/language/expressions/class/fields-wrapped-in-sc-string-literal-names.js +++ b/test/language/expressions/class/fields-wrapped-in-sc-string-literal-names.js @@ -26,7 +26,7 @@ var C = class { ;;;;;;'a'; "b"; 'c' = 39; "d" = 42;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/expressions/class/private-fields-proxy-default-handler-throws.js b/test/language/expressions/class/private-fields-proxy-default-handler-throws.js new file mode 100644 index 0000000000..d2a26a993e --- /dev/null +++ b/test/language/expressions/class/private-fields-proxy-default-handler-throws.js @@ -0,0 +1,30 @@ +// Copyright (C) 2018 Rick Waldron. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-privatefieldget +description: Private fields not accessible via default Proxy handler +info: | + 1. Assert: P is a Private Name value. + 2. If O is not an object, throw a TypeError exception. + 3. Let entry be PrivateFieldFind(P, O). + 4. If entry is empty, throw a TypeError exception. + +features: [class, class-fields-private] +---*/ + + +var C = class { + #x = 1; + x() { + return this.#x; + } +} + +var c = new C(); +var p = new Proxy(c, {}); + +assert.sameValue(c.x(), 1); +assert.throws(TypeError, function() { + p.x(); +}); diff --git a/test/language/expressions/class/static-private-fields-proxy-default-handler-throws.js b/test/language/expressions/class/static-private-fields-proxy-default-handler-throws.js new file mode 100644 index 0000000000..9649b5406a --- /dev/null +++ b/test/language/expressions/class/static-private-fields-proxy-default-handler-throws.js @@ -0,0 +1,28 @@ +// Copyright (C) 2018 Rick Waldron. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-privatefieldget +description: Static private fields not accessible via default Proxy handler +info: | + 1. Assert: P is a Private Name value. + 2. If O is not an object, throw a TypeError exception. + 3. Let entry be PrivateFieldFind(P, O). + 4. If entry is empty, throw a TypeError exception. + +features: [class, class-static-fields-private] +---*/ + +var C = class { + static #x = 1; + static x() { + return this.#x; + } +} + +var P = new Proxy(C, {}); + +assert.sameValue(C.x, 1); +assert.throws(TypeError, function() { + P.x; +}); diff --git a/test/language/expressions/class/static-private-methods-proxy-default-handler-throws.js b/test/language/expressions/class/static-private-methods-proxy-default-handler-throws.js new file mode 100644 index 0000000000..5a26a59463 --- /dev/null +++ b/test/language/expressions/class/static-private-methods-proxy-default-handler-throws.js @@ -0,0 +1,31 @@ +// Copyright (C) 2018 Rick Waldron. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-privatefieldget +description: Static private methods not accessible via default Proxy handler +info: | + 1. Assert: P is a Private Name value. + 2. If O is not an object, throw a TypeError exception. + 3. Let entry be PrivateFieldFind(P, O). + 4. If entry is empty, throw a TypeError exception. + +features: [class, class-static-methods-private] +---*/ + + +var C = class { + static #x(value) { + return 1; + } + static x() { + return this.#x(); + } +} + +var P = new Proxy(C, {}); + +assert.sameValue(C.x(), 1); +assert.throws(TypeError, function() { + P.x(); +}); diff --git a/test/language/statements/class/fields-after-same-line-gen-computed-names.js b/test/language/statements/class/fields-after-same-line-gen-computed-names.js index e7634a16bf..f1490e0eb0 100644 --- a/test/language/statements/class/fields-after-same-line-gen-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-gen-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-gen-computed-symbol-names.js index 03529d08dc..73d1a1751f 100644 --- a/test/language/statements/class/fields-after-same-line-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-gen-literal-names.js b/test/language/statements/class/fields-after-same-line-gen-literal-names.js index fd8c939e1c..277fd75c89 100644 --- a/test/language/statements/class/fields-after-same-line-gen-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-gen-private-names.js b/test/language/statements/class/fields-after-same-line-gen-private-names.js index 66bcc5a36e..1986c0342c 100644 --- a/test/language/statements/class/fields-after-same-line-gen-private-names.js +++ b/test/language/statements/class/fields-after-same-line-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-gen.template /*--- -description: static literal private names (field definitions after a generator in the same line) +description: private names (field definitions after a generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, generators, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-gen-static-private-fields.js b/test/language/statements/class/fields-after-same-line-gen-static-private-fields.js new file mode 100644 index 0000000000..38084c562a --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-gen.template +/*--- +description: static private fields (field definitions after a generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-gen-static-private-methods.js b/test/language/statements/class/fields-after-same-line-gen-static-private-methods.js new file mode 100644 index 0000000000..00ed8463be --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-gen.template +/*--- +description: static private methods (field definitions after a generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-gen-string-literal-names.js b/test/language/statements/class/fields-after-same-line-gen-string-literal-names.js index 8e8cc643fc..07530985b0 100644 --- a/test/language/statements/class/fields-after-same-line-gen-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-method-computed-names.js b/test/language/statements/class/fields-after-same-line-method-computed-names.js index 21fb3b86d7..6104c45f7a 100644 --- a/test/language/statements/class/fields-after-same-line-method-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-method-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-method-computed-symbol-names.js index 35f11d9308..5253ea022a 100644 --- a/test/language/statements/class/fields-after-same-line-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-method-literal-names.js b/test/language/statements/class/fields-after-same-line-method-literal-names.js index 80ecfe3208..707c6cd9f2 100644 --- a/test/language/statements/class/fields-after-same-line-method-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-method-private-names.js b/test/language/statements/class/fields-after-same-line-method-private-names.js index b241501c31..61f52545e4 100644 --- a/test/language/statements/class/fields-after-same-line-method-private-names.js +++ b/test/language/statements/class/fields-after-same-line-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-method.template /*--- -description: static literal private names (field definitions after a method in the same line) +description: private names (field definitions after a method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-method-static-private-fields.js b/test/language/statements/class/fields-after-same-line-method-static-private-fields.js new file mode 100644 index 0000000000..5c3b6f6b87 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-method.template +/*--- +description: static private fields (field definitions after a method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-method-static-private-methods.js b/test/language/statements/class/fields-after-same-line-method-static-private-methods.js new file mode 100644 index 0000000000..afdbfc13c6 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-method.template +/*--- +description: static private methods (field definitions after a method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-method-string-literal-names.js b/test/language/statements/class/fields-after-same-line-method-string-literal-names.js index 096ed952ef..1ac3f62cb6 100644 --- a/test/language/statements/class/fields-after-same-line-method-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-computed-names.js b/test/language/statements/class/fields-after-same-line-static-async-gen-computed-names.js index 5554b63e9b..f6d8311611 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-gen-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { static async *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-static-async-gen-computed-symbol-names.js index 6844ad7fe9..6d538d492d 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { static async *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-literal-names.js b/test/language/statements/class/fields-after-same-line-static-async-gen-literal-names.js index a98e2cea44..d6dea1573b 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-gen-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { static async *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-private-names.js b/test/language/statements/class/fields-after-same-line-static-async-gen-private-names.js index 3f40e656f0..3262f4498c 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-gen-private-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-static-async-gen.template /*--- -description: static literal private names (field definitions after a static async generator in the same line) +description: private names (field definitions after a static async generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-iteration] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { static async *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-fields.js b/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-fields.js new file mode 100644 index 0000000000..2e337619da --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-fields.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-static-async-gen.template +/*--- +description: static private fields (field definitions after a static async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static async *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +C.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-methods.js b/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-methods.js new file mode 100644 index 0000000000..fb473a75a7 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-static-private-methods.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-static-async-gen.template +/*--- +description: static private methods (field definitions after a static async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static async *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +C.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-after-same-line-static-async-gen-string-literal-names.js b/test/language/statements/class/fields-after-same-line-static-async-gen-string-literal-names.js index 294388a982..6b8d8536d3 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-gen-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { static async *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-computed-names.js b/test/language/statements/class/fields-after-same-line-static-async-method-computed-names.js index 34dfe534b0..e628b3ac56 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-method-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { static async m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-static-async-method-computed-symbol-names.js index e02eb6a006..ebb19a426f 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { static async m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-literal-names.js b/test/language/statements/class/fields-after-same-line-static-async-method-literal-names.js index 7652c546a7..6593a6c52a 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-method-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { static async m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-private-names.js b/test/language/statements/class/fields-after-same-line-static-async-method-private-names.js index bc001aa284..f37ea74df6 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-method-private-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-static-async-method.template /*--- -description: static literal private names (field definitions after a static async method in the same line) +description: private names (field definitions after a static async method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-functions] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { static async m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-static-private-fields.js b/test/language/statements/class/fields-after-same-line-static-async-method-static-private-fields.js new file mode 100644 index 0000000000..e77b50da51 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-async-method-static-private-fields.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-static-async-method.template +/*--- +description: static private fields (field definitions after a static async method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static async m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +C.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-static-private-methods.js b/test/language/statements/class/fields-after-same-line-static-async-method-static-private-methods.js new file mode 100644 index 0000000000..755b850bd1 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-async-method-static-private-methods.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-static-async-method.template +/*--- +description: static private methods (field definitions after a static async method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static async m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +C.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-after-same-line-static-async-method-string-literal-names.js b/test/language/statements/class/fields-after-same-line-static-async-method-string-literal-names.js index dde92722fa..4ff9e092a8 100644 --- a/test/language/statements/class/fields-after-same-line-static-async-method-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-async-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { static async m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-computed-names.js b/test/language/statements/class/fields-after-same-line-static-gen-computed-names.js index 49e281bd7e..14fd13e300 100644 --- a/test/language/statements/class/fields-after-same-line-static-gen-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-static-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { static *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-static-gen-computed-symbol-names.js index df6e52c392..612e4a3ea6 100644 --- a/test/language/statements/class/fields-after-same-line-static-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-static-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { static *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-literal-names.js b/test/language/statements/class/fields-after-same-line-static-gen-literal-names.js index 7ac5896575..249e98cb14 100644 --- a/test/language/statements/class/fields-after-same-line-static-gen-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { static *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-private-names.js b/test/language/statements/class/fields-after-same-line-static-gen-private-names.js index c6799db962..8a6a62c467 100644 --- a/test/language/statements/class/fields-after-same-line-static-gen-private-names.js +++ b/test/language/statements/class/fields-after-same-line-static-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-static-gen.template /*--- -description: static literal private names (field definitions after a static generator in the same line) +description: private names (field definitions after a static generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, generators, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { static *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-static-gen-static-private-fields.js b/test/language/statements/class/fields-after-same-line-static-gen-static-private-fields.js new file mode 100644 index 0000000000..ac5e4da93d --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-static-gen.template +/*--- +description: static private fields (field definitions after a static generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(C.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-static-private-methods.js b/test/language/statements/class/fields-after-same-line-static-gen-static-private-methods.js new file mode 100644 index 0000000000..77a4f80c9a --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-static-gen.template +/*--- +description: static private methods (field definitions after a static generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, generators, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(C.m().next().value, 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-static-gen-string-literal-names.js b/test/language/statements/class/fields-after-same-line-static-gen-string-literal-names.js index 2c602452be..15c7590c35 100644 --- a/test/language/statements/class/fields-after-same-line-static-gen-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { static *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-method-computed-names.js b/test/language/statements/class/fields-after-same-line-static-method-computed-names.js index 8ee37ce116..94975ef070 100644 --- a/test/language/statements/class/fields-after-same-line-static-method-computed-names.js +++ b/test/language/statements/class/fields-after-same-line-static-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { static m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-method-computed-symbol-names.js b/test/language/statements/class/fields-after-same-line-static-method-computed-symbol-names.js index d66c3d26af..81d9a231a4 100644 --- a/test/language/statements/class/fields-after-same-line-static-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-after-same-line-static-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { static m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-method-literal-names.js b/test/language/statements/class/fields-after-same-line-static-method-literal-names.js index 6f9ec4a4c7..7a31a87d8b 100644 --- a/test/language/statements/class/fields-after-same-line-static-method-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { static m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-after-same-line-static-method-private-names.js b/test/language/statements/class/fields-after-same-line-static-method-private-names.js index e270cbe507..9f118b185e 100644 --- a/test/language/statements/class/fields-after-same-line-static-method-private-names.js +++ b/test/language/statements/class/fields-after-same-line-static-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-static-method.template /*--- -description: static literal private names (field definitions after a static method in the same line) +description: private names (field definitions after a static method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { static m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-after-same-line-static-method-static-private-fields.js b/test/language/statements/class/fields-after-same-line-static-method-static-private-fields.js new file mode 100644 index 0000000000..847fbe5747 --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-static-method.template +/*--- +description: static private fields (field definitions after a static method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(C.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-static-method-static-private-methods.js b/test/language/statements/class/fields-after-same-line-static-method-static-private-methods.js new file mode 100644 index 0000000000..8c13b7e74f --- /dev/null +++ b/test/language/statements/class/fields-after-same-line-static-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-static-method.template +/*--- +description: static private methods (field definitions after a static method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(C.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "m"), false); + +verifyProperty(C, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-after-same-line-static-method-string-literal-names.js b/test/language/statements/class/fields-after-same-line-static-method-string-literal-names.js index 8c0c9b2a5b..28798be2f6 100644 --- a/test/language/statements/class/fields-after-same-line-static-method-string-literal-names.js +++ b/test/language/statements/class/fields-after-same-line-static-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { static m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-comp-name-init-err-contains-arguments.js b/test/language/statements/class/fields-comp-name-init-err-contains-arguments.js new file mode 100644 index 0000000000..54fe419111 --- /dev/null +++ b/test/language/statements/class/fields-comp-name-init-err-contains-arguments.js @@ -0,0 +1,35 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-arguments.case +// - src/class-fields/initializer-error/cls-decl-fields-comp-name.template +/*--- +description: Syntax error if `arguments` used in class field (computed ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if ContainsArguments of Initializer is true. + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var x = "string"; +class C { + [x] = arguments; +} diff --git a/test/language/statements/class/fields-comp-name-init-err-contains-super.js b/test/language/statements/class/fields-comp-name-init-err-contains-super.js new file mode 100644 index 0000000000..96026dddc9 --- /dev/null +++ b/test/language/statements/class/fields-comp-name-init-err-contains-super.js @@ -0,0 +1,28 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/init-err-contains-super.case +// - src/class-fields/initializer-error/cls-decl-fields-comp-name.template +/*--- +description: Syntax error if `super()` used in class field (computed ClassElementName) +esid: sec-class-definitions-static-semantics-early-errors +features: [class, class-fields-public] +flags: [generated] +negative: + phase: parse + type: SyntaxError +info: | + Static Semantics: Early Errors + + FieldDefinition: + PropertyNameInitializeropt + + - It is a Syntax Error if Initializer is present and Initializer Contains SuperCall is true. + +---*/ + + +throw "Test262: This statement should not be evaluated."; + +var x = "string"; +class C { + [x] = super(); +} diff --git a/test/language/statements/class/fields-computed-name-toprimitive-symbol.js b/test/language/statements/class/fields-computed-name-toprimitive-symbol.js index 5c9639bc9e..8818450017 100644 --- a/test/language/statements/class/fields-computed-name-toprimitive-symbol.js +++ b/test/language/statements/class/fields-computed-name-toprimitive-symbol.js @@ -4,7 +4,7 @@ /*--- description: ToPrimitive evaluation in the ComputedPropertyName (field definitions in a class declaration) esid: prod-FieldDefinition -features: [computed-property-names, Symbol.toPrimitive, Symbol, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, Symbol, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/statements/class/fields-computed-name-toprimitive.js b/test/language/statements/class/fields-computed-name-toprimitive.js index 518f1f164d..c986cd012d 100644 --- a/test/language/statements/class/fields-computed-name-toprimitive.js +++ b/test/language/statements/class/fields-computed-name-toprimitive.js @@ -4,7 +4,7 @@ /*--- description: ToPrimitive evaluation in the ComputedPropertyName (field definitions in a class declaration) esid: prod-FieldDefinition -features: [computed-property-names, Symbol.toPrimitive, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/statements/class/fields-computed-variable-name-propname-constructor.js b/test/language/statements/class/fields-computed-variable-name-propname-constructor.js deleted file mode 100644 index 2b7aa5a78e..0000000000 --- a/test/language/statements/class/fields-computed-variable-name-propname-constructor.js +++ /dev/null @@ -1,33 +0,0 @@ -// This file was procedurally generated from the following sources: -// - src/class-fields/propname-constructor.case -// - src/class-fields/propname-error/cls-decl-variable-name.template -/*--- -description: class fields forbid PropName 'constructor' (no early error -- PropName of ComputedPropertyName not forbidden value) -esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] -flags: [generated] -info: | - Static Semantics: PropName - ... - ComputedPropertyName : [ AssignmentExpression ] - Return empty. - - - // This test file tests the following early error: - Static Semantics: Early Errors - - ClassElement : FieldDefinition; - It is a Syntax Error if PropName of FieldDefinition is "constructor". - ----*/ - - -var constructor = 'foo'; -class C { - [constructor]; -} - -var c = new C(); - -assert.sameValue(c.hasOwnProperty("foo"), true); -assert.sameValue(C.hasOwnProperty("foo"), false); diff --git a/test/language/statements/class/fields-ctor-called-after-fields-init.js b/test/language/statements/class/fields-ctor-called-after-fields-init.js index e9c44bb1bb..9633a3bbd8 100644 --- a/test/language/statements/class/fields-ctor-called-after-fields-init.js +++ b/test/language/statements/class/fields-ctor-called-after-fields-init.js @@ -4,7 +4,7 @@ /*--- description: The constructor method is called after the fields are initalized (field definitions in a class declaration) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] info: | [[Construct]] ( argumentsList, newTarget) diff --git a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js index ec3eae5459..7520e6546f 100644 --- a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js +++ b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-1.js @@ -23,9 +23,8 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { x = eval('executed = true; super()["x"];'); } diff --git a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js index bd7c9757e3..75612496c5 100644 --- a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js +++ b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall-2.js @@ -7,13 +7,6 @@ esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - Additional Early Error Rules for Eval Outside Constructor Methods These static semantics are applied by PerformEval when a direct eval call occurs outside of the constructor method of a ClassDeclaration or ClassExpression. ScriptBody:StatementList @@ -23,9 +16,8 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { x = eval('executed = true; super().x;'); } diff --git a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall.js b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall.js index 3e988d94fe..c5f63012a8 100644 --- a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall.js +++ b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-supercall.js @@ -23,9 +23,8 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { x = eval('executed = true; super();'); } diff --git a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js index 7f3963b1f4..ca04c448dc 100644 --- a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js +++ b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-1.js @@ -23,9 +23,8 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { x = eval('executed = true; super.x;'); } diff --git a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js index b6df495eb2..be58a46774 100644 --- a/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js +++ b/test/language/statements/class/fields-derived-cls-direct-eval-err-contains-superproperty-2.js @@ -2,30 +2,26 @@ // - src/class-fields/eval-err-contains-superproperty-2.case // - src/class-fields/initializer-eval-super-property/cls-decl-fields-eval.template /*--- -description: error if `super['x']` in StatementList of eval (direct eval) +description: error if super['x'] in StatementList of eval (direct eval) esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody:StatementList + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList It is a Syntax Error if StatementList Contains SuperProperty. ---*/ -class A {} - var executed = false; +class A {} class C extends A { x = eval('executed = true; super["x"];'); } diff --git a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js index 16b468837b..7ee11c41d4 100644 --- a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js +++ b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-1.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: // - src/class-fields/eval-err-contains-supercall-1.case -// - src/class-fields/initializer-eval-super-call/cls-decl-fields-indirect-eval.template +// - src/class-fields/initializer-eval-super-call/cls-decl-private-fields-indirect-eval.template /*--- description: error if `super()['x']` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer @@ -23,11 +23,10 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { - x = (0, eval)('executed = true; super()["x"];'); + #x = (0, eval)('executed = true; super()["x"];'); } assert.throws(SyntaxError, function() { diff --git a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js index b7492996cd..9de84949fd 100644 --- a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js +++ b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall-2.js @@ -1,19 +1,12 @@ // This file was procedurally generated from the following sources: // - src/class-fields/eval-err-contains-supercall-2.case -// - src/class-fields/initializer-eval-super-call/cls-decl-fields-indirect-eval.template +// - src/class-fields/initializer-eval-super-call/cls-decl-private-fields-indirect-eval.template /*--- description: error if `super().x` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. - Additional Early Error Rules for Eval Outside Constructor Methods These static semantics are applied by PerformEval when a direct eval call occurs outside of the constructor method of a ClassDeclaration or ClassExpression. ScriptBody:StatementList @@ -23,11 +16,10 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { - x = (0, eval)('executed = true; super().x;'); + #x = (0, eval)('executed = true; super().x;'); } assert.throws(SyntaxError, function() { diff --git a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall.js b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall.js index d3554fe954..1ba08ba625 100644 --- a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall.js +++ b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-supercall.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: // - src/class-fields/eval-err-contains-supercall.case -// - src/class-fields/initializer-eval-super-call/cls-decl-fields-indirect-eval.template +// - src/class-fields/initializer-eval-super-call/cls-decl-private-fields-indirect-eval.template /*--- description: error if `super()` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer @@ -23,11 +23,10 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { - x = (0, eval)('executed = true; super();'); + #x = (0, eval)('executed = true; super();'); } assert.throws(SyntaxError, function() { diff --git a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js index e71f434467..c2520d7416 100644 --- a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js +++ b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-1.js @@ -1,6 +1,6 @@ // This file was procedurally generated from the following sources: // - src/class-fields/eval-err-contains-superproperty-1.case -// - src/class-fields/initializer-eval-super-property/cls-decl-fields-indirect-eval.template +// - src/class-fields/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template /*--- description: error if `super.x` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer @@ -23,11 +23,10 @@ info: | ---*/ -class A {} - var executed = false; +class A {} class C extends A { - x = (0, eval)('executed = true; super.x;'); + #x = (0, eval)('executed = true; super.x;'); } assert.throws(SyntaxError, function() { diff --git a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js index ee79439a68..2ed9f8c6a1 100644 --- a/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js +++ b/test/language/statements/class/fields-derived-cls-indirect-eval-err-contains-superproperty-2.js @@ -1,33 +1,29 @@ // This file was procedurally generated from the following sources: // - src/class-fields/eval-err-contains-superproperty-2.case -// - src/class-fields/initializer-eval-super-property/cls-decl-fields-indirect-eval.template +// - src/class-fields/initializer-eval-super-property/cls-decl-private-fields-indirect-eval.template /*--- -description: error if `super['x']` in StatementList of eval (indirect eval) +description: error if super['x'] in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer features: [class, class-fields-public] flags: [generated] info: | - Additional Early Error Rules for Eval Inside Initializer - These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. - ScriptBody : StatementList - - ... - The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. Additional Early Error Rules for Eval Outside Methods - These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. - ScriptBody:StatementList + + These static semantics are applied by PerformEval when a direct eval call occurs outside of a MethodDefinition. + + ScriptBody : StatementList It is a Syntax Error if StatementList Contains SuperProperty. ---*/ -class A {} - var executed = false; +class A {} class C extends A { - x = (0, eval)('executed = true; super["x"];'); + #x = (0, eval)('executed = true; super["x"];'); } assert.throws(SyntaxError, function() { diff --git a/test/language/statements/class/fields-direct-eval-err-contains-newtarget.js b/test/language/statements/class/fields-direct-eval-err-contains-newtarget.js index e24b384878..d0768c666d 100644 --- a/test/language/statements/class/fields-direct-eval-err-contains-newtarget.js +++ b/test/language/statements/class/fields-direct-eval-err-contains-newtarget.js @@ -4,7 +4,7 @@ /*--- description: error if `new.target` in StatementList of eval (direct eval) esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, new.target] +features: [class, new.target, class-fields-public] flags: [generated] info: | Additional Early Error Rules for Eval Inside Initializer diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-referenceerror.js b/test/language/statements/class/fields-evaluation-error-computed-name-referenceerror.js index 505de6f4b9..c0771fa335 100644 --- a/test/language/statements/class/fields-evaluation-error-computed-name-referenceerror.js +++ b/test/language/statements/class/fields-evaluation-error-computed-name-referenceerror.js @@ -4,7 +4,7 @@ /*--- description: ReferenceError evaluating a computed property name (field definitions in a class declaration) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-err.js b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-err.js index 77579a2f60..f3b1fa0312 100644 --- a/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-err.js +++ b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class declaration) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, Symbol.toPrimitive, class, class-fields-public] +features: [computed-property-names, Symbol.toPrimitive, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js new file mode 100644 index 0000000000..8f5b5d5b16 --- /dev/null +++ b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-noncallable.js @@ -0,0 +1,57 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/computed-name-toprimitive-returns-noncallable.case +// - src/class-fields/class-evaluation-error/cls-decl.template +/*--- +description: Custom error evaluating a computed property name (field definitions in a class declaration) +esid: sec-runtime-semantics-classdefinitionevaluation +features: [computed-property-names, Symbol.toPrimitive, class] +flags: [generated] +info: | + Runtime Semantics: ClassDefinitionEvaluation + + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of me is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + ... + + Runtime Semantics: ClassElementEvaluation + + ClassElement: FieldDefinition; + Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter false and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + ... + + Runtime Semantics: Evaluation + ComputedPropertyName: [ AssignmentExpression ] + + 1. Let exprValue be the result of evaluating AssignmentExpression. + 2. Let propName be ? GetValue(exprValue). + 3. Return ? ToPropertyKey(propName). + +---*/ +var obj = { + [Symbol.toPrimitive]: {} +}; + + + +function evaluate() { + class C { + [obj] = refErrorIfEvaluated; + } +} + +assert.throws(TypeError +, evaluate); diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js new file mode 100644 index 0000000000..de9c94b7de --- /dev/null +++ b/test/language/statements/class/fields-evaluation-error-computed-name-toprimitive-returns-nonobject.js @@ -0,0 +1,56 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/computed-name-toprimitive-returns-nonobject.case +// - src/class-fields/class-evaluation-error/cls-decl.template +/*--- +description: Custom error evaluating a computed property name (field definitions in a class declaration) +esid: sec-runtime-semantics-classdefinitionevaluation +features: [computed-property-names, Symbol.toPrimitive, class] +flags: [generated] +info: | + Runtime Semantics: ClassDefinitionEvaluation + + ... + 27. For each ClassElement e in order from elements + a. If IsStatic of me is false, then + i. Let fields be the result of performing ClassElementEvaluation for e with arguments proto and false. + b. Else, + i. Let fields be the result of performing ClassElementEvaluation for e with arguments F and false. + c. If fields is an abrupt completion, then + i. Set the running execution context's LexicalEnvironment to lex. + ii. Set the running execution context's PrivateNameEnvironment to outerPrivateEnvironment. + iii. Return Completion(status). + ... + + Runtime Semantics: ClassElementEvaluation + + ClassElement: FieldDefinition; + Return ClassFieldDefinitionEvaluation of FieldDefinition with parameter false and object. + + Runtime Semantics: ClassFieldDefinitionEvaluation + With parameters isStatic and homeObject. + + 1. Let fieldName be the result of evaluating ClassElementName. + 2. ReturnIfAbrupt(fieldName). + ... + + Runtime Semantics: Evaluation + ComputedPropertyName: [ AssignmentExpression ] + + 1. Let exprValue be the result of evaluating AssignmentExpression. + 2. Let propName be ? GetValue(exprValue). + 3. Return ? ToPropertyKey(propName). + +---*/ +var obj = { + [Symbol.toPrimitive]: 42 +}; + + + +function evaluate() { + class C { + [obj] = refErrorIfEvaluated; + } +} + +assert.throws(TypeError, evaluate); diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-tostring-err.js b/test/language/statements/class/fields-evaluation-error-computed-name-tostring-err.js index 2edbc79dbe..1390e7639e 100644 --- a/test/language/statements/class/fields-evaluation-error-computed-name-tostring-err.js +++ b/test/language/statements/class/fields-evaluation-error-computed-name-tostring-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class declaration) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/statements/class/fields-evaluation-error-computed-name-valueof-err.js b/test/language/statements/class/fields-evaluation-error-computed-name-valueof-err.js index b056fb488e..86d37c3dda 100644 --- a/test/language/statements/class/fields-evaluation-error-computed-name-valueof-err.js +++ b/test/language/statements/class/fields-evaluation-error-computed-name-valueof-err.js @@ -4,7 +4,7 @@ /*--- description: Custom error evaluating a computed property name (field definitions in a class declaration) esid: sec-runtime-semantics-classdefinitionevaluation -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] info: | Runtime Semantics: ClassDefinitionEvaluation diff --git a/test/language/statements/class/fields-indirect-eval-err-contains-newtarget.js b/test/language/statements/class/fields-indirect-eval-err-contains-newtarget.js index fb408f497d..3296a5902e 100644 --- a/test/language/statements/class/fields-indirect-eval-err-contains-newtarget.js +++ b/test/language/statements/class/fields-indirect-eval-err-contains-newtarget.js @@ -4,7 +4,7 @@ /*--- description: error if `new.target` in StatementList of eval (indirect eval) esid: sec-performeval-rules-in-initializer -features: [class, class-fields-public, new.target] +features: [class, new.target, class-fields-public] flags: [generated] info: | Additional Early Error Rules for Eval Inside Initializer diff --git a/test/language/statements/class/fields-init-err-evaluation.js b/test/language/statements/class/fields-init-err-evaluation.js index 67c9b0200b..96eaebeb9a 100644 --- a/test/language/statements/class/fields-init-err-evaluation.js +++ b/test/language/statements/class/fields-init-err-evaluation.js @@ -4,7 +4,7 @@ /*--- description: Return abrupt completion evaluating the field initializer (field definitions in a class declaration) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] info: | [[Construct]] ( argumentsList, newTarget) diff --git a/test/language/statements/class/fields-init-value-defined-after-class.js b/test/language/statements/class/fields-init-value-defined-after-class.js index 8c8eac3a26..4555de6efc 100644 --- a/test/language/statements/class/fields-init-value-defined-after-class.js +++ b/test/language/statements/class/fields-init-value-defined-after-class.js @@ -4,7 +4,7 @@ /*--- description: The initializer value is defined after the class evaluation (field definitions in a class declaration) esid: prod-FieldDefinition -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/statements/class/fields-init-value-incremental.js b/test/language/statements/class/fields-init-value-incremental.js index 24d5eb3b6f..efbb803480 100644 --- a/test/language/statements/class/fields-init-value-incremental.js +++ b/test/language/statements/class/fields-init-value-incremental.js @@ -4,7 +4,7 @@ /*--- description: The initializer value is defined during the class instatiation (field definitions in a class declaration) esid: prod-FieldDefinition -features: [computed-property-names, class, class-fields-public] +features: [computed-property-names, class] flags: [generated] includes: [propertyHelper.js] info: | diff --git a/test/language/statements/class/fields-multiple-definitions-computed-names.js b/test/language/statements/class/fields-multiple-definitions-computed-names.js index b6d3cfb14f..dd750df16c 100644 --- a/test/language/statements/class/fields-multiple-definitions-computed-names.js +++ b/test/language/statements/class/fields-multiple-definitions-computed-names.js @@ -29,7 +29,7 @@ class C { [x] = 42; [10] = "meep"; ["not initialized"] m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-definitions-computed-symbol-names.js b/test/language/statements/class/fields-multiple-definitions-computed-symbol-names.js index 813aac64b2..1ff9fb2327 100644 --- a/test/language/statements/class/fields-multiple-definitions-computed-symbol-names.js +++ b/test/language/statements/class/fields-multiple-definitions-computed-symbol-names.js @@ -30,7 +30,7 @@ class C { [x]; [y] = 42 m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-definitions-literal-names.js b/test/language/statements/class/fields-multiple-definitions-literal-names.js index 63d8ad694c..b80d396c39 100644 --- a/test/language/statements/class/fields-multiple-definitions-literal-names.js +++ b/test/language/statements/class/fields-multiple-definitions-literal-names.js @@ -30,7 +30,7 @@ class C { c = fn m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-definitions-private-names.js b/test/language/statements/class/fields-multiple-definitions-private-names.js index 6ea8e96278..e0e0a3c3b2 100644 --- a/test/language/statements/class/fields-multiple-definitions-private-names.js +++ b/test/language/statements/class/fields-multiple-definitions-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-multiple-definitions.template /*--- -description: static literal private names (multiple fields definitions) +description: private names (multiple fields definitions) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -30,7 +30,7 @@ class C { #x; #y m2() { return 39 } bar = "barbaz"; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-multiple-definitions-static-private-fields.js b/test/language/statements/class/fields-multiple-definitions-static-private-fields.js new file mode 100644 index 0000000000..d257631dde --- /dev/null +++ b/test/language/statements/class/fields-multiple-definitions-static-private-fields.js @@ -0,0 +1,102 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-multiple-definitions.template +/*--- +description: static private fields (multiple fields definitions) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + foo = "foobar"; + m() { return 42 } + static #x; static #y + m2() { return 39 } + bar = "barbaz"; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.m2(), 39); +assert.sameValue(Object.hasOwnProperty.call(c, "m2"), false); +assert.sameValue(c.m2, C.prototype.m2); + +verifyProperty(C.prototype, "m2", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-multiple-definitions-static-private-methods.js b/test/language/statements/class/fields-multiple-definitions-static-private-methods.js new file mode 100644 index 0000000000..df86d9893d --- /dev/null +++ b/test/language/statements/class/fields-multiple-definitions-static-private-methods.js @@ -0,0 +1,108 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-multiple-definitions.template +/*--- +description: static private methods (multiple fields definitions) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + foo = "foobar"; + m() { return 42 } + static #xVal; static #yVal + m2() { return 39 } + bar = "barbaz"; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.m2(), 39); +assert.sameValue(Object.hasOwnProperty.call(c, "m2"), false); +assert.sameValue(c.m2, C.prototype.m2); + +verifyProperty(C.prototype, "m2", { + enumerable: false, + configurable: true, + writable: true, +}); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-multiple-definitions-string-literal-names.js b/test/language/statements/class/fields-multiple-definitions-string-literal-names.js index 8ce2d2fd05..cc297096e4 100644 --- a/test/language/statements/class/fields-multiple-definitions-string-literal-names.js +++ b/test/language/statements/class/fields-multiple-definitions-string-literal-names.js @@ -28,7 +28,7 @@ class C { "d" = 42 m2() { return 39 } bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-computed-names.js b/test/language/statements/class/fields-multiple-stacked-definitions-computed-names.js index 1bdcb8e773..b6f884a84f 100644 --- a/test/language/statements/class/fields-multiple-stacked-definitions-computed-names.js +++ b/test/language/statements/class/fields-multiple-stacked-definitions-computed-names.js @@ -27,7 +27,7 @@ class C { [x] = 42; [10] = "meep"; ["not initialized"] foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-computed-symbol-names.js b/test/language/statements/class/fields-multiple-stacked-definitions-computed-symbol-names.js index 9bfeb243fc..76a7d9f7a7 100644 --- a/test/language/statements/class/fields-multiple-stacked-definitions-computed-symbol-names.js +++ b/test/language/statements/class/fields-multiple-stacked-definitions-computed-symbol-names.js @@ -28,7 +28,7 @@ class C { [x]; [y] = 42 foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-literal-names.js b/test/language/statements/class/fields-multiple-stacked-definitions-literal-names.js index db7c211752..59dd6f45f1 100644 --- a/test/language/statements/class/fields-multiple-stacked-definitions-literal-names.js +++ b/test/language/statements/class/fields-multiple-stacked-definitions-literal-names.js @@ -28,7 +28,7 @@ class C { c = fn foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-private-names.js b/test/language/statements/class/fields-multiple-stacked-definitions-private-names.js index e88d530aca..46914e9068 100644 --- a/test/language/statements/class/fields-multiple-stacked-definitions-private-names.js +++ b/test/language/statements/class/fields-multiple-stacked-definitions-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-multiple-stacked-definitions.template /*--- -description: static literal private names (multiple stacked fields definitions through ASI) +description: private names (multiple stacked fields definitions through ASI) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -28,7 +28,7 @@ class C { #x; #y foo = "foobar" bar = "barbaz"; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-static-private-fields.js b/test/language/statements/class/fields-multiple-stacked-definitions-static-private-fields.js new file mode 100644 index 0000000000..b2d30bb684 --- /dev/null +++ b/test/language/statements/class/fields-multiple-stacked-definitions-static-private-fields.js @@ -0,0 +1,80 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-multiple-stacked-definitions.template +/*--- +description: static private fields (multiple stacked fields definitions through ASI) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y + foo = "foobar" + bar = "barbaz"; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-static-private-methods.js b/test/language/statements/class/fields-multiple-stacked-definitions-static-private-methods.js new file mode 100644 index 0000000000..9e38dfbc91 --- /dev/null +++ b/test/language/statements/class/fields-multiple-stacked-definitions-static-private-methods.js @@ -0,0 +1,86 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-multiple-stacked-definitions.template +/*--- +description: static private methods (multiple stacked fields definitions through ASI) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal + foo = "foobar" + bar = "barbaz"; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.foo, "foobar"); +assert.sameValue(Object.hasOwnProperty.call(C, "foo"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "foo"), false); + +verifyProperty(c, "foo", { + value: "foobar", + enumerable: true, + configurable: true, + writable: true, +}); + +assert.sameValue(c.bar, "barbaz"); +assert.sameValue(Object.hasOwnProperty.call(C, "bar"), false); +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "bar"), false); + +verifyProperty(c, "bar", { + value: "barbaz", + enumerable: true, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-multiple-stacked-definitions-string-literal-names.js b/test/language/statements/class/fields-multiple-stacked-definitions-string-literal-names.js index fffb53f4f1..e65d06e981 100644 --- a/test/language/statements/class/fields-multiple-stacked-definitions-string-literal-names.js +++ b/test/language/statements/class/fields-multiple-stacked-definitions-string-literal-names.js @@ -26,7 +26,7 @@ class C { "d" = 42 foo = "foobar" bar = "barbaz"; - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-computed-names.js b/test/language/statements/class/fields-new-no-sc-line-method-computed-names.js index 656dad2c1a..40dcc6bc94 100644 --- a/test/language/statements/class/fields-new-no-sc-line-method-computed-names.js +++ b/test/language/statements/class/fields-new-no-sc-line-method-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"] m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-computed-symbol-names.js b/test/language/statements/class/fields-new-no-sc-line-method-computed-symbol-names.js index 803d75477e..3670093d19 100644 --- a/test/language/statements/class/fields-new-no-sc-line-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-new-no-sc-line-method-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); class C { [x]; [y] = 42 m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-literal-names.js b/test/language/statements/class/fields-new-no-sc-line-method-literal-names.js index ae718c8241..85571fd558 100644 --- a/test/language/statements/class/fields-new-no-sc-line-method-literal-names.js +++ b/test/language/statements/class/fields-new-no-sc-line-method-literal-names.js @@ -27,7 +27,7 @@ class C { a; b = 42; c = fn m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-private-names.js b/test/language/statements/class/fields-new-no-sc-line-method-private-names.js index f57b9ac5bb..ddb2b385ca 100644 --- a/test/language/statements/class/fields-new-no-sc-line-method-private-names.js +++ b/test/language/statements/class/fields-new-no-sc-line-method-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-new-no-sc-line-method.template /*--- -description: static literal private names (field definitions followed by a method in a new line without a semicolon) +description: private names (field definitions followed by a method in a new line without a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | class C { #x; #y m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-new-no-sc-line-method-static-private-fields.js b/test/language/statements/class/fields-new-no-sc-line-method-static-private-fields.js new file mode 100644 index 0000000000..21a082f6d5 --- /dev/null +++ b/test/language/statements/class/fields-new-no-sc-line-method-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-new-no-sc-line-method.template +/*--- +description: static private fields (field definitions followed by a method in a new line without a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y + m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-static-private-methods.js b/test/language/statements/class/fields-new-no-sc-line-method-static-private-methods.js new file mode 100644 index 0000000000..6b444eb326 --- /dev/null +++ b/test/language/statements/class/fields-new-no-sc-line-method-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-new-no-sc-line-method.template +/*--- +description: static private methods (field definitions followed by a method in a new line without a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal + m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-no-sc-line-method-string-literal-names.js b/test/language/statements/class/fields-new-no-sc-line-method-string-literal-names.js index e376980dfc..606f9857cd 100644 --- a/test/language/statements/class/fields-new-no-sc-line-method-string-literal-names.js +++ b/test/language/statements/class/fields-new-no-sc-line-method-string-literal-names.js @@ -25,7 +25,7 @@ class C { 'a'; "b"; 'c' = 39; "d" = 42 m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-gen-computed-names.js b/test/language/statements/class/fields-new-sc-line-gen-computed-names.js index ed18ea80b9..dac45df434 100644 --- a/test/language/statements/class/fields-new-sc-line-gen-computed-names.js +++ b/test/language/statements/class/fields-new-sc-line-gen-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"]; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-gen-computed-symbol-names.js b/test/language/statements/class/fields-new-sc-line-gen-computed-symbol-names.js index 3c8a55c93b..e18acba62c 100644 --- a/test/language/statements/class/fields-new-sc-line-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-new-sc-line-gen-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); class C { [x]; [y] = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-gen-literal-names.js b/test/language/statements/class/fields-new-sc-line-gen-literal-names.js index 65966a09cb..33764b72e5 100644 --- a/test/language/statements/class/fields-new-sc-line-gen-literal-names.js +++ b/test/language/statements/class/fields-new-sc-line-gen-literal-names.js @@ -27,7 +27,7 @@ class C { a; b = 42; c = fn; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-gen-private-names.js b/test/language/statements/class/fields-new-sc-line-gen-private-names.js index 540ad191c9..fe4b9d8fa5 100644 --- a/test/language/statements/class/fields-new-sc-line-gen-private-names.js +++ b/test/language/statements/class/fields-new-sc-line-gen-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-new-sc-line-generator.template /*--- -description: static literal private names (field definitions followed by a method in a new line with a semicolon) +description: private names (field definitions followed by a method in a new line with a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, generators] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | class C { #x; #y; *m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-new-sc-line-gen-static-private-fields.js b/test/language/statements/class/fields-new-sc-line-gen-static-private-fields.js new file mode 100644 index 0000000000..fc2cdc56ce --- /dev/null +++ b/test/language/statements/class/fields-new-sc-line-gen-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-new-sc-line-generator.template +/*--- +description: static private fields (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y; + *m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-sc-line-gen-static-private-methods.js b/test/language/statements/class/fields-new-sc-line-gen-static-private-methods.js new file mode 100644 index 0000000000..c1bf2164e0 --- /dev/null +++ b/test/language/statements/class/fields-new-sc-line-gen-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-new-sc-line-generator.template +/*--- +description: static private methods (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal; + *m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-sc-line-gen-string-literal-names.js b/test/language/statements/class/fields-new-sc-line-gen-string-literal-names.js index 2409d6ae0b..1e8ff0f814 100644 --- a/test/language/statements/class/fields-new-sc-line-gen-string-literal-names.js +++ b/test/language/statements/class/fields-new-sc-line-gen-string-literal-names.js @@ -25,7 +25,7 @@ class C { 'a'; "b"; 'c' = 39; "d" = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-method-computed-names.js b/test/language/statements/class/fields-new-sc-line-method-computed-names.js index a3055504f0..27d235a721 100644 --- a/test/language/statements/class/fields-new-sc-line-method-computed-names.js +++ b/test/language/statements/class/fields-new-sc-line-method-computed-names.js @@ -26,7 +26,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"]; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-method-computed-symbol-names.js b/test/language/statements/class/fields-new-sc-line-method-computed-symbol-names.js index 1e305c017d..6377c3578b 100644 --- a/test/language/statements/class/fields-new-sc-line-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-new-sc-line-method-computed-symbol-names.js @@ -27,7 +27,7 @@ var y = Symbol(); class C { [x]; [y] = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-method-literal-names.js b/test/language/statements/class/fields-new-sc-line-method-literal-names.js index 96b9f225a3..7c2d3b0a39 100644 --- a/test/language/statements/class/fields-new-sc-line-method-literal-names.js +++ b/test/language/statements/class/fields-new-sc-line-method-literal-names.js @@ -27,7 +27,7 @@ class C { a; b = 42; c = fn; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-new-sc-line-method-private-names.js b/test/language/statements/class/fields-new-sc-line-method-private-names.js index 9b095ec504..2801a349d1 100644 --- a/test/language/statements/class/fields-new-sc-line-method-private-names.js +++ b/test/language/statements/class/fields-new-sc-line-method-private-names.js @@ -2,24 +2,24 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-new-sc-line-method.template /*--- -description: static literal private names (field definitions followed by a method in a new line with a semicolon) +description: private names (field definitions followed by a method in a new line with a semicolon) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ info: | class C { #x; #y; m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-new-sc-line-method-static-private-fields.js b/test/language/statements/class/fields-new-sc-line-method-static-private-fields.js new file mode 100644 index 0000000000..77c05cade6 --- /dev/null +++ b/test/language/statements/class/fields-new-sc-line-method-static-private-fields.js @@ -0,0 +1,67 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-new-sc-line-method.template +/*--- +description: static private fields (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y; + m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-sc-line-method-static-private-methods.js b/test/language/statements/class/fields-new-sc-line-method-static-private-methods.js new file mode 100644 index 0000000000..eb7d9e137e --- /dev/null +++ b/test/language/statements/class/fields-new-sc-line-method-static-private-methods.js @@ -0,0 +1,73 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-new-sc-line-method.template +/*--- +description: static private methods (field definitions followed by a method in a new line with a semicolon) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal; + m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-new-sc-line-method-string-literal-names.js b/test/language/statements/class/fields-new-sc-line-method-string-literal-names.js index 9377cf7593..a5ebd2808c 100644 --- a/test/language/statements/class/fields-new-sc-line-method-string-literal-names.js +++ b/test/language/statements/class/fields-new-sc-line-method-string-literal-names.js @@ -25,7 +25,7 @@ class C { 'a'; "b"; 'c' = 39; "d" = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-private-direct-eval-err-contains-arguments.js b/test/language/statements/class/fields-private-direct-eval-err-contains-arguments.js new file mode 100644 index 0000000000..366efed2fc --- /dev/null +++ b/test/language/statements/class/fields-private-direct-eval-err-contains-arguments.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-arguments.case +// - src/class-fields/initializer-eval-arguments/cls-decl-private-fields-eval.template +/*--- +description: error if `arguments` in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + It is a Syntax Error if ContainsArguments of StatementList is true. + ... + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +var executed = false; +class C { + #x = eval('executed = true; arguments;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/test/language/statements/class/fields-private-direct-eval-err-contains-newtarget.js b/test/language/statements/class/fields-private-direct-eval-err-contains-newtarget.js new file mode 100644 index 0000000000..d44434ad17 --- /dev/null +++ b/test/language/statements/class/fields-private-direct-eval-err-contains-newtarget.js @@ -0,0 +1,34 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-newtarget.case +// - src/class-fields/initializer-eval-newtarget/cls-decl-private-fields-eval.template +/*--- +description: error if `new.target` in StatementList of eval (direct eval) +esid: sec-performeval-rules-in-initializer +features: [class, new.target, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Functions + These static semantics are applied by PerformEval when a direct eval call occurs outside of any function. + ScriptBody:StatementList + + It is a Syntax Error if StatementList Contains NewTarget. + +---*/ + + +var executed = false; +class C { + #x = eval('executed = true; new.target;'); +} + +var c = new C(); + +assert.sameValue(executed, true); +assert.sameValue(c.x, undefined); diff --git a/test/language/statements/class/fields-private-indirect-eval-err-contains-arguments.js b/test/language/statements/class/fields-private-indirect-eval-err-contains-arguments.js new file mode 100644 index 0000000000..dee4e5946f --- /dev/null +++ b/test/language/statements/class/fields-private-indirect-eval-err-contains-arguments.js @@ -0,0 +1,36 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-arguments.case +// - src/class-fields/initializer-eval-arguments/cls-decl-private-fields-indirect-eval.template +/*--- +description: error if `arguments` in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, class-fields-public, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + It is a Syntax Error if ContainsArguments of StatementList is true. + ... + + Static Semantics: ContainsArguments + IdentifierReference : Identifier + + 1. If the StringValue of Identifier is "arguments", return true. + ... + For all other grammatical productions, recurse on all nonterminals. If any piece returns true, then return true. Otherwise return false. + +---*/ + + +var executed = false; +class C { + #x = (0, eval)('executed = true; arguments;'); +} + +assert.throws(ReferenceError, function() { + new C(); +}); + +assert.sameValue(executed, true); diff --git a/test/language/statements/class/fields-private-indirect-eval-err-contains-newtarget.js b/test/language/statements/class/fields-private-indirect-eval-err-contains-newtarget.js new file mode 100644 index 0000000000..c15dd203a9 --- /dev/null +++ b/test/language/statements/class/fields-private-indirect-eval-err-contains-newtarget.js @@ -0,0 +1,35 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/eval-err-contains-newtarget.case +// - src/class-fields/initializer-eval-newtarget/cls-decl-private-fields-indirect-eval.template +/*--- +description: error if `new.target` in StatementList of eval (indirect eval) +esid: sec-performeval-rules-in-initializer +features: [class, new.target, class-fields-private] +flags: [generated] +info: | + Additional Early Error Rules for Eval Inside Initializer + These static semantics are applied by PerformEval when a direct eval call occurs inside a class field initializer. + ScriptBody : StatementList + + ... + The remaining eval rules apply as outside a constructor, inside a method, and inside a function. + + Additional Early Error Rules for Eval Outside Functions + These static semantics are applied by PerformEval when a direct eval call occurs outside of any function. + ScriptBody:StatementList + + It is a Syntax Error if StatementList Contains NewTarget. + +---*/ + + +var executed = false; +class C { + #x = (0, eval)('executed = true; new.target;'); +} + +assert.throws(SyntaxError, function() { + new C(); +}); + +assert.sameValue(executed, false); diff --git a/test/language/statements/class/fields-redeclaration-symbol.js b/test/language/statements/class/fields-redeclaration-symbol.js index 5d3337f356..9995556e8b 100644 --- a/test/language/statements/class/fields-redeclaration-symbol.js +++ b/test/language/statements/class/fields-redeclaration-symbol.js @@ -4,7 +4,7 @@ /*--- description: Redeclaration of public fields with the same name (field definitions in a class declaration) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] includes: [propertyHelper.js, compareArray.js] info: | diff --git a/test/language/statements/class/fields-redeclaration.js b/test/language/statements/class/fields-redeclaration.js index 3cc850ada8..236e683714 100644 --- a/test/language/statements/class/fields-redeclaration.js +++ b/test/language/statements/class/fields-redeclaration.js @@ -4,7 +4,7 @@ /*--- description: Redeclaration of public fields with the same name (field definitions in a class declaration) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class] flags: [generated] includes: [propertyHelper.js, compareArray.js] info: | diff --git a/test/language/statements/class/fields-regular-definitions-computed-names.js b/test/language/statements/class/fields-regular-definitions-computed-names.js index 7fa89ad913..485a382e49 100644 --- a/test/language/statements/class/fields-regular-definitions-computed-names.js +++ b/test/language/statements/class/fields-regular-definitions-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"] - + } var c = new C(); diff --git a/test/language/statements/class/fields-regular-definitions-computed-symbol-names.js b/test/language/statements/class/fields-regular-definitions-computed-symbol-names.js index 88c2d21f64..49e1b31638 100644 --- a/test/language/statements/class/fields-regular-definitions-computed-symbol-names.js +++ b/test/language/statements/class/fields-regular-definitions-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { [x]; [y] = 42 - + } var c = new C(); diff --git a/test/language/statements/class/fields-regular-definitions-literal-names.js b/test/language/statements/class/fields-regular-definitions-literal-names.js index 170ab303d6..bb7dc4cbf4 100644 --- a/test/language/statements/class/fields-regular-definitions-literal-names.js +++ b/test/language/statements/class/fields-regular-definitions-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { a; b = 42; c = fn - + } var c = new C(); diff --git a/test/language/statements/class/fields-regular-definitions-private-names.js b/test/language/statements/class/fields-regular-definitions-private-names.js index 2c482495a0..414c963995 100644 --- a/test/language/statements/class/fields-regular-definitions-private-names.js +++ b/test/language/statements/class/fields-regular-definitions-private-names.js @@ -2,30 +2,30 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-regular-definitions.template /*--- -description: static literal private names (regular fields defintion) +description: private names (regular fields defintion) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { #x; #y -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-static-private-fields.js b/test/language/statements/class/fields-regular-definitions-static-private-fields.js similarity index 75% rename from test/language/statements/class/fields-static-private-fields.js rename to test/language/statements/class/fields-regular-definitions-static-private-fields.js index a9b0611ee4..11cbfcf788 100644 --- a/test/language/statements/class/fields-static-private-fields.js +++ b/test/language/statements/class/fields-regular-definitions-static-private-fields.js @@ -1,23 +1,23 @@ // This file was procedurally generated from the following sources: // - src/class-fields/static-private-fields.case -// - src/class-fields/default/cls-decl.template +// - src/class-fields/productions/cls-decl-regular-definitions.template /*--- -description: literal private names (field definitions in a class declaration) +description: static private fields (regular fields defintion) esid: prod-FieldDefinition -features: [class, class-fields-public] +features: [class-static-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... static FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: + PrivateName : # IdentifierName ---*/ @@ -25,8 +25,18 @@ info: | class C { static #x; static #y + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } } +var c = new C(); + // Test the private fields do not appear as properties before set to value assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); diff --git a/test/language/statements/class/fields-regular-definitions-static-private-methods.js b/test/language/statements/class/fields-regular-definitions-static-private-methods.js new file mode 100644 index 0000000000..74b7858c7b --- /dev/null +++ b/test/language/statements/class/fields-regular-definitions-static-private-methods.js @@ -0,0 +1,61 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-regular-definitions.template +/*--- +description: static private methods (regular fields defintion) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-regular-definitions-string-literal-names.js b/test/language/statements/class/fields-regular-definitions-string-literal-names.js index cc8ea7ce7d..cc177acd57 100644 --- a/test/language/statements/class/fields-regular-definitions-string-literal-names.js +++ b/test/language/statements/class/fields-regular-definitions-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { 'a'; "b"; 'c' = 39; "d" = 42 - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-gen-computed-names.js b/test/language/statements/class/fields-same-line-async-gen-computed-names.js index 7e8cf65202..9dd54fa739 100644 --- a/test/language/statements/class/fields-same-line-async-gen-computed-names.js +++ b/test/language/statements/class/fields-same-line-async-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { async *m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-gen-computed-symbol-names.js b/test/language/statements/class/fields-same-line-async-gen-computed-symbol-names.js index 061aa74474..948d23c827 100644 --- a/test/language/statements/class/fields-same-line-async-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-same-line-async-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { async *m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-gen-literal-names.js b/test/language/statements/class/fields-same-line-async-gen-literal-names.js index 14e3dc66cd..4ca55d8d96 100644 --- a/test/language/statements/class/fields-same-line-async-gen-literal-names.js +++ b/test/language/statements/class/fields-same-line-async-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { async *m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-gen-private-names.js b/test/language/statements/class/fields-same-line-async-gen-private-names.js index a1c4b00def..adbd03e6c6 100644 --- a/test/language/statements/class/fields-same-line-async-gen-private-names.js +++ b/test/language/statements/class/fields-same-line-async-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-async-gen.template /*--- -description: static literal private names (field definitions after an async generator in the same line) +description: private names (field definitions after an async generator in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-iteration] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { async *m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-same-line-async-gen-static-private-fields.js b/test/language/statements/class/fields-same-line-async-gen-static-private-fields.js new file mode 100644 index 0000000000..25507fab39 --- /dev/null +++ b/test/language/statements/class/fields-same-line-async-gen-static-private-fields.js @@ -0,0 +1,70 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-async-gen.template +/*--- +description: static private fields (field definitions after an async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + async *m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +c.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-same-line-async-gen-static-private-methods.js b/test/language/statements/class/fields-same-line-async-gen-static-private-methods.js new file mode 100644 index 0000000000..56dec2a2ee --- /dev/null +++ b/test/language/statements/class/fields-same-line-async-gen-static-private-methods.js @@ -0,0 +1,76 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-async-gen.template +/*--- +description: static private methods (field definitions after an async generator in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-iteration] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + async *m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +c.m().next().then(function(v) { + assert.sameValue(v.value, 42); + assert.sameValue(v.done, true); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-same-line-async-gen-string-literal-names.js b/test/language/statements/class/fields-same-line-async-gen-string-literal-names.js index 01a18bebd9..759eb62bd1 100644 --- a/test/language/statements/class/fields-same-line-async-gen-string-literal-names.js +++ b/test/language/statements/class/fields-same-line-async-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { async *m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-method-computed-names.js b/test/language/statements/class/fields-same-line-async-method-computed-names.js index ab68ccb314..f68257e2a0 100644 --- a/test/language/statements/class/fields-same-line-async-method-computed-names.js +++ b/test/language/statements/class/fields-same-line-async-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { async m() { return 42; } [x] = 42; [10] = "meep"; ["not initialized"]; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-method-computed-symbol-names.js b/test/language/statements/class/fields-same-line-async-method-computed-symbol-names.js index 4c0e85f0bc..11eda8bd65 100644 --- a/test/language/statements/class/fields-same-line-async-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-same-line-async-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { async m() { return 42; } [x]; [y] = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-method-literal-names.js b/test/language/statements/class/fields-same-line-async-method-literal-names.js index 056461df19..a479fdd3c3 100644 --- a/test/language/statements/class/fields-same-line-async-method-literal-names.js +++ b/test/language/statements/class/fields-same-line-async-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { async m() { return 42; } a; b = 42; c = fn; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-async-method-private-names.js b/test/language/statements/class/fields-same-line-async-method-private-names.js index 5735b08153..9f58eb22d2 100644 --- a/test/language/statements/class/fields-same-line-async-method-private-names.js +++ b/test/language/statements/class/fields-same-line-async-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-after-same-line-async-method.template /*--- -description: static literal private names (field definitions after an async method in the same line) +description: private names (field definitions after an async method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, async-functions] flags: [generated, async] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { async m() { return 42; } #x; #y; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-same-line-async-method-static-private-fields.js b/test/language/statements/class/fields-same-line-async-method-static-private-fields.js new file mode 100644 index 0000000000..3530b98d0f --- /dev/null +++ b/test/language/statements/class/fields-same-line-async-method-static-private-fields.js @@ -0,0 +1,69 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-after-same-line-async-method.template +/*--- +description: static private fields (field definitions after an async method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + async m() { return 42; } static #x; static #y; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); + +c.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-same-line-async-method-static-private-methods.js b/test/language/statements/class/fields-same-line-async-method-static-private-methods.js new file mode 100644 index 0000000000..15a37aa86d --- /dev/null +++ b/test/language/statements/class/fields-same-line-async-method-static-private-methods.js @@ -0,0 +1,75 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-after-same-line-async-method.template +/*--- +description: static private methods (field definitions after an async method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, async-functions] +flags: [generated, async] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + async m() { return 42; } static #xVal; static #yVal; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); +assert.sameValue(c.m, C.prototype.m); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}, {restore: true}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); + +c.m().then(function(v) { + assert.sameValue(v, 42); +}, $DONE).then($DONE, $DONE); diff --git a/test/language/statements/class/fields-same-line-async-method-string-literal-names.js b/test/language/statements/class/fields-same-line-async-method-string-literal-names.js index 18986604f0..31354912cc 100644 --- a/test/language/statements/class/fields-same-line-async-method-string-literal-names.js +++ b/test/language/statements/class/fields-same-line-async-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { async m() { return 42; } 'a'; "b"; 'c' = 39; "d" = 42; - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-gen-computed-names.js b/test/language/statements/class/fields-same-line-gen-computed-names.js index bfd85d84ad..ac6ca3430b 100644 --- a/test/language/statements/class/fields-same-line-gen-computed-names.js +++ b/test/language/statements/class/fields-same-line-gen-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"]; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-gen-computed-symbol-names.js b/test/language/statements/class/fields-same-line-gen-computed-symbol-names.js index 82b5440f04..1e3724bf92 100644 --- a/test/language/statements/class/fields-same-line-gen-computed-symbol-names.js +++ b/test/language/statements/class/fields-same-line-gen-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { [x]; [y] = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-gen-literal-names.js b/test/language/statements/class/fields-same-line-gen-literal-names.js index a473fda3f4..4e3c4e3d72 100644 --- a/test/language/statements/class/fields-same-line-gen-literal-names.js +++ b/test/language/statements/class/fields-same-line-gen-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { a; b = 42; c = fn; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-gen-private-names.js b/test/language/statements/class/fields-same-line-gen-private-names.js index 435c2c8fd9..20a6fc1474 100644 --- a/test/language/statements/class/fields-same-line-gen-private-names.js +++ b/test/language/statements/class/fields-same-line-gen-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-same-line-generator.template /*--- -description: static literal private names (field definitions followed by a generator method in the same line) +description: private names (field definitions followed by a generator method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public, generators] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { #x; #y; *m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-same-line-gen-static-private-fields.js b/test/language/statements/class/fields-same-line-gen-static-private-fields.js new file mode 100644 index 0000000000..30df3ef646 --- /dev/null +++ b/test/language/statements/class/fields-same-line-gen-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-same-line-generator.template +/*--- +description: static private fields (field definitions followed by a generator method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y; *m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-same-line-gen-static-private-methods.js b/test/language/statements/class/fields-same-line-gen-static-private-methods.js new file mode 100644 index 0000000000..a1c6037d4f --- /dev/null +++ b/test/language/statements/class/fields-same-line-gen-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-same-line-generator.template +/*--- +description: static private methods (field definitions followed by a generator method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public, generators] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal; *m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m().next().value, 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-same-line-gen-string-literal-names.js b/test/language/statements/class/fields-same-line-gen-string-literal-names.js index 2b86174641..f4b52e635c 100644 --- a/test/language/statements/class/fields-same-line-gen-string-literal-names.js +++ b/test/language/statements/class/fields-same-line-gen-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { 'a'; "b"; 'c' = 39; "d" = 42; *m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-method-computed-names.js b/test/language/statements/class/fields-same-line-method-computed-names.js index b9b64e5424..f5dbafb308 100644 --- a/test/language/statements/class/fields-same-line-method-computed-names.js +++ b/test/language/statements/class/fields-same-line-method-computed-names.js @@ -25,7 +25,7 @@ var x = "b"; class C { [x] = 42; [10] = "meep"; ["not initialized"]; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-method-computed-symbol-names.js b/test/language/statements/class/fields-same-line-method-computed-symbol-names.js index ee373b465d..4080a9897b 100644 --- a/test/language/statements/class/fields-same-line-method-computed-symbol-names.js +++ b/test/language/statements/class/fields-same-line-method-computed-symbol-names.js @@ -26,7 +26,7 @@ var y = Symbol(); class C { [x]; [y] = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-method-literal-names.js b/test/language/statements/class/fields-same-line-method-literal-names.js index e3caff61aa..95c05ce2a3 100644 --- a/test/language/statements/class/fields-same-line-method-literal-names.js +++ b/test/language/statements/class/fields-same-line-method-literal-names.js @@ -26,7 +26,7 @@ const fn = function() {} class C { a; b = 42; c = fn; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-same-line-method-private-names.js b/test/language/statements/class/fields-same-line-method-private-names.js index 070db9093b..2a66f071fe 100644 --- a/test/language/statements/class/fields-same-line-method-private-names.js +++ b/test/language/statements/class/fields-same-line-method-private-names.js @@ -2,31 +2,31 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-same-line-method.template /*--- -description: static literal private names (field definitions followed by a method in the same line) +description: private names (field definitions followed by a method in the same line) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] includes: [propertyHelper.js] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ class C { #x; #y; m() { return 42; } -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-same-line-method-static-private-fields.js b/test/language/statements/class/fields-same-line-method-static-private-fields.js new file mode 100644 index 0000000000..6894e6f7ab --- /dev/null +++ b/test/language/statements/class/fields-same-line-method-static-private-fields.js @@ -0,0 +1,66 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-same-line-method.template +/*--- +description: static private fields (field definitions followed by a method in the same line) +esid: prod-FieldDefinition +features: [class-static-fields-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #x; static #y; m() { return 42; } + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private fields do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#x"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#y"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#y"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#y"), false, "test 10"); diff --git a/test/language/statements/class/fields-same-line-method-static-private-methods.js b/test/language/statements/class/fields-same-line-method-static-private-methods.js new file mode 100644 index 0000000000..fd2bf8fd76 --- /dev/null +++ b/test/language/statements/class/fields-same-line-method-static-private-methods.js @@ -0,0 +1,72 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-same-line-method.template +/*--- +description: static private methods (field definitions followed by a method in the same line) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +includes: [propertyHelper.js] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + static #xVal; static #yVal; m() { return 42; } + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +assert.sameValue(c.m(), 42); +assert.sameValue(c.m, C.prototype.m); +assert.sameValue(Object.hasOwnProperty.call(c, "m"), false); + +verifyProperty(C.prototype, "m", { + enumerable: false, + configurable: true, + writable: true, +}); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-same-line-method-string-literal-names.js b/test/language/statements/class/fields-same-line-method-string-literal-names.js index 50ffafe2f9..fca2d77d11 100644 --- a/test/language/statements/class/fields-same-line-method-string-literal-names.js +++ b/test/language/statements/class/fields-same-line-method-string-literal-names.js @@ -24,7 +24,7 @@ info: | class C { 'a'; "b"; 'c' = 39; "d" = 42; m() { return 42; } - + } var c = new C(); diff --git a/test/language/statements/class/fields-static-comp-name-init-err-contains-arguments.js b/test/language/statements/class/fields-static-comp-name-init-err-contains-arguments.js index 666a41ca8b..a18b90f529 100644 --- a/test/language/statements/class/fields-static-comp-name-init-err-contains-arguments.js +++ b/test/language/statements/class/fields-static-comp-name-init-err-contains-arguments.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `arguments` used in class field (static computed ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-comp-name-init-err-contains-super.js b/test/language/statements/class/fields-static-comp-name-init-err-contains-super.js index 12d148d613..258c0dbd2b 100644 --- a/test/language/statements/class/fields-static-comp-name-init-err-contains-super.js +++ b/test/language/statements/class/fields-static-comp-name-init-err-contains-super.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `super()` used in class field (static computed ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-literal-init-err-contains-arguments.js b/test/language/statements/class/fields-static-literal-init-err-contains-arguments.js index cd4f184292..449f385889 100644 --- a/test/language/statements/class/fields-static-literal-init-err-contains-arguments.js +++ b/test/language/statements/class/fields-static-literal-init-err-contains-arguments.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `arguments` used in class field (static literal ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-literal-init-err-contains-super.js b/test/language/statements/class/fields-static-literal-init-err-contains-super.js index 64334ba094..fb04feabb5 100644 --- a/test/language/statements/class/fields-static-literal-init-err-contains-super.js +++ b/test/language/statements/class/fields-static-literal-init-err-contains-super.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `super()` used in class field (static literal ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-private-init-err-contains-arguments.js b/test/language/statements/class/fields-static-private-init-err-contains-arguments.js index dc4b9a96bd..97f0d66ed0 100644 --- a/test/language/statements/class/fields-static-private-init-err-contains-arguments.js +++ b/test/language/statements/class/fields-static-private-init-err-contains-arguments.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `arguments` used in class field (static PrivateName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-private] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-private-init-err-contains-super.js b/test/language/statements/class/fields-static-private-init-err-contains-super.js index 19423553ea..475696926c 100644 --- a/test/language/statements/class/fields-static-private-init-err-contains-super.js +++ b/test/language/statements/class/fields-static-private-init-err-contains-super.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `super()` used in class field (static PrivateName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-private] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-string-literal-name-init-err-contains-arguments.js b/test/language/statements/class/fields-static-string-literal-name-init-err-contains-arguments.js index c44b995641..5c3decb179 100644 --- a/test/language/statements/class/fields-static-string-literal-name-init-err-contains-arguments.js +++ b/test/language/statements/class/fields-static-string-literal-name-init-err-contains-arguments.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `arguments` used in class field (static string literal ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-static-string-literal-name-init-err-contains-super.js b/test/language/statements/class/fields-static-string-literal-name-init-err-contains-super.js index 39cf2cb52a..b0d5dc66bb 100644 --- a/test/language/statements/class/fields-static-string-literal-name-init-err-contains-super.js +++ b/test/language/statements/class/fields-static-string-literal-name-init-err-contains-super.js @@ -4,7 +4,7 @@ /*--- description: Syntax error if `super()` used in class field (static string literal ClassElementName) esid: sec-class-definitions-static-semantics-early-errors -features: [class, class-fields-public] +features: [class, class-fields-public, class-static-fields-public] flags: [generated] negative: phase: parse diff --git a/test/language/statements/class/fields-wrapped-in-sc-computed-names.js b/test/language/statements/class/fields-wrapped-in-sc-computed-names.js index 69b5bce833..5ab17511d1 100644 --- a/test/language/statements/class/fields-wrapped-in-sc-computed-names.js +++ b/test/language/statements/class/fields-wrapped-in-sc-computed-names.js @@ -27,7 +27,7 @@ class C { ;;;; ;;;;;;[x] = 42; [10] = "meep"; ["not initialized"];;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/statements/class/fields-wrapped-in-sc-computed-symbol-names.js b/test/language/statements/class/fields-wrapped-in-sc-computed-symbol-names.js index cef596bb74..e81f993692 100644 --- a/test/language/statements/class/fields-wrapped-in-sc-computed-symbol-names.js +++ b/test/language/statements/class/fields-wrapped-in-sc-computed-symbol-names.js @@ -28,7 +28,7 @@ class C { ;;;; ;;;;;;[x]; [y] = 42;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/statements/class/fields-wrapped-in-sc-literal-names.js b/test/language/statements/class/fields-wrapped-in-sc-literal-names.js index caf9edbe98..2364d417b6 100644 --- a/test/language/statements/class/fields-wrapped-in-sc-literal-names.js +++ b/test/language/statements/class/fields-wrapped-in-sc-literal-names.js @@ -28,7 +28,7 @@ class C { ;;;;;;a; b = 42; c = fn;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/statements/class/fields-wrapped-in-sc-private-names.js b/test/language/statements/class/fields-wrapped-in-sc-private-names.js index 440650c832..5a8130a5cc 100644 --- a/test/language/statements/class/fields-wrapped-in-sc-private-names.js +++ b/test/language/statements/class/fields-wrapped-in-sc-private-names.js @@ -2,23 +2,23 @@ // - src/class-fields/private-names.case // - src/class-fields/productions/cls-decl-wrapped-in-sc.template /*--- -description: static literal private names (fields definition wrapped in semicolons) +description: private names (fields definition wrapped in semicolons) esid: prod-FieldDefinition features: [class-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: - #IdentifierName + PrivateName : + # IdentifierName ---*/ @@ -27,7 +27,7 @@ class C { ;;;; ;;;;;;#x; #y;;;;;;; ;;;; -x() { + x() { this.#x = 42; return this.#x; } diff --git a/test/language/statements/class/fields-static-private-methods.js b/test/language/statements/class/fields-wrapped-in-sc-static-private-fields.js similarity index 69% rename from test/language/statements/class/fields-static-private-methods.js rename to test/language/statements/class/fields-wrapped-in-sc-static-private-fields.js index 3bf11c26da..02eade5d9d 100644 --- a/test/language/statements/class/fields-static-private-methods.js +++ b/test/language/statements/class/fields-wrapped-in-sc-static-private-fields.js @@ -1,32 +1,44 @@ // This file was procedurally generated from the following sources: -// - src/class-fields/static-private-methods.case -// - src/class-fields/default/cls-decl.template +// - src/class-fields/static-private-fields.case +// - src/class-fields/productions/cls-decl-wrapped-in-sc.template /*--- -description: literal private names (field definitions in a class declaration) +description: static private fields (fields definition wrapped in semicolons) esid: prod-FieldDefinition -features: [class-static-methods-private, class, class-fields-public] +features: [class-static-fields-private, class, class-fields-public] flags: [generated] info: | - ClassElement: + ClassElement : ... static FieldDefinition ; - FieldDefinition: + FieldDefinition : ClassElementName Initializer_opt - ClassElementName: + ClassElementName : PrivateName - PrivateName: + PrivateName : # IdentifierName ---*/ class C { - static #xVal; static #yVal + ;;;; + ;;;;;;static #x; static #y;;;;;;; + ;;;; + static x() { + this.#x = 42; + return this.#x; + } + static y() { + this.#y = 43; + return this.#y; + } } +var c = new C(); + // Test the private fields do not appear as properties before set to value assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#x"), false, "test 1"); assert.sameValue(Object.hasOwnProperty.call(C, "#x"), false, "test 2"); diff --git a/test/language/statements/class/fields-wrapped-in-sc-static-private-methods.js b/test/language/statements/class/fields-wrapped-in-sc-static-private-methods.js new file mode 100644 index 0000000000..1ad7a3ab04 --- /dev/null +++ b/test/language/statements/class/fields-wrapped-in-sc-static-private-methods.js @@ -0,0 +1,63 @@ +// This file was procedurally generated from the following sources: +// - src/class-fields/static-private-methods.case +// - src/class-fields/productions/cls-decl-wrapped-in-sc.template +/*--- +description: static private methods (fields definition wrapped in semicolons) +esid: prod-FieldDefinition +features: [class-static-methods-private, class, class-fields-public] +flags: [generated] +info: | + ClassElement : + ... + static FieldDefinition ; + + FieldDefinition : + ClassElementName Initializer_opt + + ClassElementName : + PrivateName + + PrivateName : + # IdentifierName + +---*/ + + +class C { + ;;;; + ;;;;;;static #xVal; static #yVal;;;;;;; + ;;;; + static #x(value) { + this.#xVal = value; + return this.#xVal; + } + static #y(value) { + this.#y = value; + return this.#yVal; + } + static x() { + return this.#x(42); + } + static y() { + return this.#y(43); + } +} + +var c = new C(); + +// Test the private methods do not appear as properties before set to value +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#xVal"), false, "test 1"); +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 2"); +assert.sameValue(Object.hasOwnProperty.call(c, "#xVal"), false, "test 3"); + +assert.sameValue(Object.hasOwnProperty.call(C.prototype, "#yVal"), false, "test 4"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 5"); +assert.sameValue(Object.hasOwnProperty.call(c, "#yVal"), false, "test 6"); + +// Test if private fields can be sucessfully accessed and set to value +assert.sameValue(C.x(), 42, "test 7"); +assert.sameValue(C.y(), 43, "test 8"); + +// Test the private fields do not appear as properties before after set to value +assert.sameValue(Object.hasOwnProperty.call(C, "#xVal"), false, "test 9"); +assert.sameValue(Object.hasOwnProperty.call(C, "#yVal"), false, "test 10"); diff --git a/test/language/statements/class/fields-wrapped-in-sc-string-literal-names.js b/test/language/statements/class/fields-wrapped-in-sc-string-literal-names.js index e1ba62e970..1acfc2fe29 100644 --- a/test/language/statements/class/fields-wrapped-in-sc-string-literal-names.js +++ b/test/language/statements/class/fields-wrapped-in-sc-string-literal-names.js @@ -26,7 +26,7 @@ class C { ;;;;;;'a'; "b"; 'c' = 39; "d" = 42;;;;;;; ;;;; - + } var c = new C(); diff --git a/test/language/statements/class/privatename-not-valid-earlyerr-script-7.js b/test/language/statements/class/privatename-not-valid-earlyerr-script-7.js index 58c14e57dc..bfff8da44e 100644 --- a/test/language/statements/class/privatename-not-valid-earlyerr-script-7.js +++ b/test/language/statements/class/privatename-not-valid-earlyerr-script-7.js @@ -9,7 +9,7 @@ info: | It is a Syntax Error if AllPrivateNamesValid of StatementList with an empty List as an argument is false unless the source code is eval code that is being processed by a direct eval. -features: [class-fields-private] +features: [class, class-fields-private] negative: phase: parse type: SyntaxError diff --git a/test/language/statements/class/privatename-not-valid-earlyerr-script-8.js b/test/language/statements/class/privatename-not-valid-earlyerr-script-8.js index c134b47409..467b5ed045 100644 --- a/test/language/statements/class/privatename-not-valid-earlyerr-script-8.js +++ b/test/language/statements/class/privatename-not-valid-earlyerr-script-8.js @@ -9,7 +9,7 @@ info: | It is a Syntax Error if AllPrivateNamesValid of StatementList with an empty List as an argument is false unless the source code is eval code that is being processed by a direct eval. -features: [class-fields-private] +features: [class, class-fields-private] negative: phase: parse type: SyntaxError -- GitLab