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 d77e55b4e1b17492aafc0b42f660719bac794bd8..4903bbe3bc27102d589fcf8c6092fb98ca5fab48 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 874f2cdfcbca5fe69026d1bafaeac8715a5a519d..81276cc9a973f6868fac1712d44b47527945f59c 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 ca449cf30321235f2c1d2b6335e8f3bad2912610..5b1638c4ab369fd4a3128dddee49f2049c0aedd8 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 cf1622749660a6d0ad211a210bd2e1ec81188293..a895a065c7c5e3a7eeb7aa675b2f59ce0268e18e 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 e730657f11eab2e4667016d574f82bacd1c8f054..456c88bca9738497218836865b95187b532ba4e0 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 0000000000000000000000000000000000000000..2812237a8e58126b46af9f3e3820c89ab4df6fa2 --- /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 0000000000000000000000000000000000000000..a7b69d61cc9c3d3a95b5440604956bb9df714cc8 --- /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 fbec9434025e11d461dea6225b4ba76f6abaa2a0..2b1e5968882d002af004e2a39f4de874d3fdc8c7 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 21da8910229ec7ccdc29c65e675b890780e1b2ec..5a5da9ea5648dd69eddf8256f2b89f427560d611 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 81e5ca2a2334c5cc1c46fd9d5d459c63a5aa1729..e21e2a8a7dcf305b1f74969a0ff8f4afd1e9546c 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 542488ff923cd6b58e02e349c8af5996317aa4fe..fb0a1cb92c228b3fe381de2ae3dfd265dee77c7a 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 145f1398d30367f02d9c8093654cde499eb3a7b6..7c65b26ac2e8ca12cf167cd76a85a7d4dba599c2 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 0000000000000000000000000000000000000000..5f8209be7d03aacbf2d357118e02cd6da23a743a --- /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 0000000000000000000000000000000000000000..a45087347c61a4ee7e252b0f97fa453c7094a33a --- /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 bc534cb4b9ba6887e9f537cfe5190d09d2b5e87d..a1d0ef3ad26ad85db9e3ecccf56f9cfe186e598c 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 2a66b8ee761e88e0701dd35dbf317980c59580a2..4f92e5bc9f4f4212c78d4cd88a0064eb16df045d 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 2ea39e9b6be3697b77f009f1a62df53a8a5c30eb..80d36a6128f20c80d0f19802721aaf8333b09508 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 e4ebb76d4b743459310260a1733691bd1a443d4c..b298c5f63316843c47fb49b8cc0f2e49d587628a 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 167504e93f4a8f8ba60dffaf396ef837fed68dbe..8a73040702ac347da45fee5be86ebcd6d74b2022 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 0000000000000000000000000000000000000000..8f27dd87362ab4ccc154b77a29122480f29f3e0d --- /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 0000000000000000000000000000000000000000..d8e030b0d5ae2e67f8167909bc7d440f8278ba3f --- /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 464838a511c825435bef3e8d85b7269520280806..95e1a4643222a1d493c0be754cad08200c4dae75 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 e39f9c059d682f6e67bff4cdf970d459672d4eff..b32ed9b83f67e69d540d546f82111f58cee6c968 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 dd0650e0e8ad97af44f4a33af13662423dce0b57..392fb7b0a6d0e37e5dff91ce2c97410b868019a6 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 1e1af3d4dcfb7a39c7562f344ba7e238c7ce38ad..14f723d1dd5156f05069c1f966b70b3aa49704fc 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 df6dd1aeb771f5adbb19a306cb45065193738085..2dfe19655fb8d8d5dde5466a50ab5e6945cebffa 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 0000000000000000000000000000000000000000..21a43260e1365e1dccc7504634fc876f022492b4 --- /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 0000000000000000000000000000000000000000..3a61adf3ff8815eb30b3d8fa312b40a5c085130d --- /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 25ce5be1f2f42b44b59bbcae64685c341ba46c94..9d0422cbdc71880a906119f1779cfdd65ef664d4 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 4f3cf3e5346f8de6eea865b8a49396c4f5bcc639..6012cc4503b60263d45ef44e6989e47bb0a204da 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 6aec78a03d824902ee1255d98e40f22143d6f8a9..2ebffeedb6bd1579d37ee2c09465994b84b71578 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 2ba95a6f1464e708ee96ba33333817e792e11484..a89c5d2db93ee76c864e3ec1977a01eaac2727bf 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 5883a5abc05ab198db7cadd229f52bc20d6dc71d..c1a73d77f42cf44db6fc0cd0ec978e132e4ade29 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 0000000000000000000000000000000000000000..4e8ea7804901a4cef8768e50c90ca3ada316eb95 --- /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 0000000000000000000000000000000000000000..b7e9ca1ae2928894b7fea0183ae78c7f6e64a3d9 --- /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 1b8364227247f005482034602373a80ee7b22221..caa4ce8271d9417c7ccf63821698c8d3dc4e5e57 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 66eb3d09897b0c4afba46a9847e3bb3a2aa5cfbb..7b67ffd5a6d9aa080b46631159cabb494fae0ba8 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 82f3a4eaedf68b225a60aaaf8907b5f6276522a1..3d1d410d2622e1f55aad00ae051527d863e5164e 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 59a4c9c35407416a93cb3db286a2e4730c0b08e0..0e79cf5cd4e511777f5f47201e33750208fcfc40 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 48fe0208dd5efd85ee3e06e215b268a6e07d2a08..3ab534569e6b75da19266bc3214d1cdf8f9c60d8 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 0000000000000000000000000000000000000000..852fa7ce836d54089bc7c4b6fa7281384257a331 --- /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 0000000000000000000000000000000000000000..8cb2832729fd6b085b7389e816634c2ebbbc4ec2 --- /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 d4d1e093b1b4ee06c0ace78da41898e181e70fbe..d8d96aa6fac0538e1a739dd74ede34d0e1c2dca7 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 c9437b784d76c4bbcba4c11691228d2b4e2c59bf..5177e0ca3f6e01510a79eb99d15ac8632786698d 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 7329aa9b8f051b098d05d5b68aef5f4ed04e48f9..cf1349be07b7014742f67047655e6704a6b56fec 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 bceceabf9e801eec3d6b659bc2daf3961b3d5158..0000000000000000000000000000000000000000 --- 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 1ea88de76cedaefb2079e7a7c8f4321ac6ba3844..86745235bc3a652ad5bea09ac38c967606110d22 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 b80496c694d826cbeff6ccafe9041752fd6d54e0..dd380aacfe952db0d9bb48cb24ee31b6c22672dc 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 e09d0a2b17692f9b1c67c9ee42217304d8cce61c..e7a2fde56908f39819ba2a90350becc964ac1a19 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 4b4a50c00f65b297b308f3b4e09eed8f02b9398f..e518d465386b18fcd261e4a280be2e9870aef9ff 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 72049e20d9b444223432884da7dc391bfc7ddfdd..c7954bc69cf0e0d4210a9f73e7b89678e637558b 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 2c0c1c52a53989704326562e1c0cdf794c1d97b6..01a9d1f63251d26a86b3c2107fcd0e598f25d318 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 325a0d040cc62b3cba266274de32cbb20098fc8d..a9c97fe8cd58413e6fc8a84598aac186d3904f18 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 ea36cd9ed1a69ae00fbbc446c0b0d03337e4fc80..c983e887ce8a51681973e0d6f4fbc4150ec2ae7a 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 2bb1d7f2ab09746853178ff533368fc23ef260c1..44bb95f62f2f7ac8f7967b070d7b79dba7ef4c95 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 36bf98e3e982acdde134b0e4fec950a623f767ba..9878a14a926ef517eb5cdaff3864b6c2f1a7f10e 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 e636dc056bd18e057c0a47c8ff8d96797ae52c26..9ea13833b2451c79709a0581d082e16c681409d6 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 94cb63a9ea77d5828664dd50155863781766624c..9422ebd0060f8aa0f9b571bc8f63e293a0aca168 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 66a6c1432602db0271f762a2883c3ba39fd8b58c..ead74882c300257b17195fe72ed01e36e978665e 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 0522c255923bb1bb597f16818181a20b447657dc..79dbe2d852a0fc358043d91c3163341b63d9cab4 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 0000000000000000000000000000000000000000..ccd69779f00841c11fbbaca2a9863fe42af8cee8 --- /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 0000000000000000000000000000000000000000..3c56ba8a5e40e9d68ace8e753aa7d0e2bec61c97 --- /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 cecb9de93890f9e737e266047fcd809a1bc6fe4e..732473265004c34d2757e50ad67cad9ca1499f39 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 f709947c115e03ae15fbd448163d7fb948c7e312..20f3fe45585948c21f250d8537e76960871b93f0 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 84a0c29d709e4581ff22bdd0cc18fbbcc137c967..e0080086715cd6a1d0b23dc9e0061b6c1c742e2a 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 dd81e90753ef6bb32a3c1dbfd4f11debbd8b5e10..baf937e731c2fc095b176f80fc66b5c2a76979b6 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 0a2f10d1eb58e3fb386ae527987181f069fec17f..52e4047a622b8f0641584e0e7d60ec07ab39a6af 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 b2b87b99246db6b1a1be12732526d9cce5dac19c..b8b62d937bc8db108273555cfd9acdb3913836cc 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 a2ee0a53a3aeef0b43cf35af6c5d90308461abbb..30172655228521f9991165cea96cf29db62386a8 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 4de6b2039a54d4a764c553452b10de166af7f696..f95fd4a73ba5ebdc86073462ac2b40b3227bde4e 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 c6036f85144917aca0300aefb022aa31ebd9df4d..66de23bea5b18de8593844986c1c56818826550e 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 716b43beafd0508a80e2f8f2a58d907c49ea2fb3..ceef5621fbbe2a55e8fb46c704d6eb91090a613b 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 0000000000000000000000000000000000000000..8898f730903f24c284a26bb36e22d5b57cfcacfb --- /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 0000000000000000000000000000000000000000..5a46f0832c8a0c5b2707f079186aedb6238410eb --- /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 0000000000000000000000000000000000000000..dec012b261bf51fd57b557b2849c95ade369ccee --- /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 e2957ad149151a5f392e703798a943811648b401..a2815cd54f077742e624684fd708c736c201c34b 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 fb384b137657a11b47a01834a695ce0d0ca4ef21..0174e246691528521993f8cc767f32dc9cdd3e0b 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 d92d329622486636da5779c4d7b869753bf1ac18..97ac2d4f73d640f77fb51ff4fc0728271cd90966 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 f0a676b3277af0f452899c2663c6356258536122..2ca220c61c00c27ddee619565d3ccddc8b60cb18 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 6dc6095542e5e83413c7aacd52fdd8a825de8c75..3bf30d36551817a83a0d0c31be00102880fa687c 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 0000000000000000000000000000000000000000..b92b29eb464da07f8c69a5b063bbce01362e308d --- /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 0000000000000000000000000000000000000000..85791c2060eb4e44c5fe0f57115fe8f63b008dac --- /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 90c6b7cd1b3d0f799e039090a7347a5f8edc623e..1de4a11c09ef470fa99d583aabeacc267b696097 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 50538a5deaba2edb776321a400b6885a5ab33dba..0c10e823dc1836ab14c4d474b650d5c41737f746 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 3139836e1c35246304b6b3695326ae86ad73a42e..5ec1f72a6e52febf15dc6cc194a4aa957762c63f 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 477b4b21fd8d9e573a2913c7113257e9735407df..20aaeeac10d6ceb122f9843a505ab2521830c209 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 76048e7e0309581ec0d55117a1b8bf390a3f8f93..32828b73038bf0486bd9a05790e5791d29ac73c2 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 0000000000000000000000000000000000000000..be9b34dd24f1e6ee5bc0886377f5b6d3facb84e6 --- /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 0000000000000000000000000000000000000000..5c41cadc9a6ff15f64074d23f63a6647ad02766e --- /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 3183a04453394c435e8c75b0b7e008ee5e54a115..5466a60bca4cf6390340cb01b95b6a3fce2510b8 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 5d1e910a381c2e77c92423767b614ef31ac5f86a..ecea272f927f509c021400e607281fafdf695cd7 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 2e3e813a50b140aeb9f1bdf9f052adaf81616326..fdfbb093ddac0e37b4a79ccc1803fb9aeffd212a 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 2551403195b5696a8f7f1b1dcec8752f9b0084ee..102b4824537fd2400457874dfd6ab09bfcb39d29 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 e72c8e6748e226c417c08855a67ee90702eb8634..399bf822c96574b764221c3f39c425dab4e3478f 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 0000000000000000000000000000000000000000..1595aca16c0a7b72658e0c14a355829717e3cd44 --- /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 0000000000000000000000000000000000000000..525cb72141a0900ae2093116f97195121ddaa478 --- /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 751a5016a59abbf77c700ce35a5c9ab927acba25..ecc41b6ee371dd030eaf3e657c494581efc516f8 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 37a17dee8f060d9f9552e4a5222cac1653828ace..feee67ec7ef06c92dff44a65d1177f09a0cf25d6 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 fdf9cf0f756ba9454dd509bc5737cd99abaade52..93bbdd4a1cb1b708a37eae6966b6e24b8494108e 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 0f771745d3e805c20a862d5264935148e1c99a2a..239c4b5aa2131d5144a63e8fd5d02c89c0c58f35 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 959a5874e48e7ea7403438dd2c145ded52eab990..79bc6a00f4daf0606b822b051f8ba12f82a6d701 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 0000000000000000000000000000000000000000..babe41933625da6005bffb0c9fe284b0fc3cdd79 --- /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 0000000000000000000000000000000000000000..4074913bf368f266d0c306c6c5a9160f15954daa --- /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 da012272041a5e5d244097ebc1ad8ef2a0f76fec..5a8c955e35ee91509529ab6531ec451e6c2591e8 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 0000000000000000000000000000000000000000..1c0c822c55666dba89ec314c45b2671f8104b307 --- /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 0000000000000000000000000000000000000000..2273bc4dfd67ad49dafbea8777a92798cb4825a9 --- /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 0000000000000000000000000000000000000000..15fc715f6532865e632714d5989b6c7d5cc6573f --- /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 0000000000000000000000000000000000000000..42e0f30ecf733096af165520d8244e0312f8fa16 --- /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 4e42bf38d6cc0215ce1a067990017cf7d6ea63d4..f1c1a4dec7302f1f66294bd4c5afac7d3b9d27b0 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 24234ce21bcb106ea40d8ab60c4174c9d0a33959..d8762afee104c3b861501e95adb033ddf18aa8df 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 fc724d59d055222393bd2b32b590e96d193c7d94..fb8da12d2eee2dc6718d481940a91ccdea099bec 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 33478971803aca7e934cd4b0628bc7f4849075de..87700b4fc96e6ccfeaf3736431e14c646bf4be0e 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 6bcbfd9de5ba39d67653af851cb98b5ae7a5b851..2a7f25dd50b77ad0ae1a584d674786572a463999 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 86a26026a4d82ff3107bb51574c9f56620a84fe8..5e84f59b16b7f0d586d618561daaa84b6f8e7826 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 4192939646c7e7d173a9de0a3dc09c97c283e8d4..ba9d0f026f58d5338c692e3cd8617a10a3fb5973 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 0000000000000000000000000000000000000000..e1ef400f13bf2b0804af575845cfec3d64c3e267 --- /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 d0afcaa36d285340b7b3726332fd707f6e4d7d16..5e316ec03ff73fc156aff70d2219820c6c25a310 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 d312f9c70d2751f98ce714b94d8f4d422ea741d6..7f8d920fec9e9182c4d791eaecacba9b9e25e135 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 294259667ec1485449d7833180653eaf83ac1055..a8d955ec20bad0697d17bd1fd44c9570aeff2065 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 0796a955c9ee8be2194e538bfa56f73e599021ee..861efccce1361a280d3ac68685ed542d82920656 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 db0ed849928e4af68bba560451851230a798e6d0..05ddab3fe4c70c4d35253c2a754967b23023ffb9 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 0000000000000000000000000000000000000000..40d189e4db24f54ea4199081f1a0532d3b168870 --- /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 0000000000000000000000000000000000000000..2bbac54e1b6b66fcfd5daae92b66e711268d0736 --- /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 b72f2c24548fc1a78eed19dbad7f57b74f3636dd..108d2cf8f11c9b1c3dc181b7bc9ab3fee0a63b58 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 82031be527f80c7e1f397981705f9a540d7607db..c358d94b9be914ba198954ac57ded47186767426 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 1519d8d04fe8172b99af410d7cbb3f812f43bdfd..b211484c3bf199e0c3ea9478c9bc7cd5d8e8511e 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 11b3ff42a1b23b80565ca1f176c32911da09e61e..b4dbeb9bc4e987563c68966dd55b89bc16dc558d 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 c357bc663775386150d621ed74c4584a76c40d90..dab4667908d8d25766dc0c42dcd69791fbd68f2d 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 0000000000000000000000000000000000000000..2370de7b5604eb56cd54e2e13516fe31e8b51c0d --- /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 0000000000000000000000000000000000000000..fadd09677c5dfe5c49a602ed2d082919f0200dbf --- /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 9bc2eac679a083225f7afd204d96fe9c7616923e..a311fd7c94745f7588d2f75deadad839cb6c56f2 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 3f9e73ae98cbaae462fead7236841a14fe07bf38..9beb41169724cacfeabf636ee9f109856cb47d46 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 8f038bfb122fc247b6ce1ce433bf856912b0ed13..77726bee198a87d672bf6b6c8f1b2212f35c1411 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 d59e9e2b89741b0a6779c11c57371f663e523621..e3283b6a4bea53a2154c4a2fae14b1426cbc9ae0 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 dad18ab09cb7fc45019d4a12b8b717a0316b3409..91f1b7eefa1b6b99ef5440f936851b7bc99492cd 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 0000000000000000000000000000000000000000..5f1fdd0487d42ffa8b6084b50d7857631b8c55e7 --- /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 0000000000000000000000000000000000000000..d659b01a947f99924af022280f0cf17ab1c06ec3 --- /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 1765683b6521af0fd6f75d092ee1a6ef7c1e7266..c566da04d71bd42052ae0011fbfea6c9b4e3e1cd 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 eb626db479695dc73dcdd9ddfea03cb5ad648cf4..4958c0ffb5c0b5147231135d1fa587ce53d5ff36 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 e063a1ab9be58b50d50f297446e0b5d80f47def2..bbed59a05bdd6f4d1c9d7721b8ce5e45bc2aab38 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 70c7af3f8de1272337a061a1b3378c149ef6436e..c448686a73d14c9b1278d1a20fac417c65994011 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 354f77ec47e0664e60fee49d28f24835e39a92d8..d041a3e61e8aa01c69f2683614a353ba4680856c 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 0000000000000000000000000000000000000000..bffbb73d9f36ad93cf4f04ae4a3cc9377f95f429 --- /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 0000000000000000000000000000000000000000..a1c0c40cd5e452655aeecd35298bd15c662563f5 --- /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 e0823a9cd1a4213ae8cd7d5910697b87c8881588..a9ae3ec04aeb5f6d368484ecffc94b44e70af6b1 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 0000000000000000000000000000000000000000..71a013ef751a7d7c19eca57537c84386b90d356e --- /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 0000000000000000000000000000000000000000..49605fef46914b9d9e7bd856447abfaf132abe99 --- /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 0000000000000000000000000000000000000000..a5223c3f1d5d078d09409d669898be676e92c967 --- /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 0000000000000000000000000000000000000000..ac49312a9c75270a3b51b7fdc40a8d3738ae6b3a --- /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 0000000000000000000000000000000000000000..bcc2a49cd379a9574e16befb365ab4e6ab38e663 --- /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 0000000000000000000000000000000000000000..feaf029a14d8abfa3bc164e0cdb6fa565fd3dd0a --- /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 0000000000000000000000000000000000000000..787a945674159826cd8dd661db065758181f689d --- /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 0000000000000000000000000000000000000000..5a5474dce90fcffe7271eea21a64a5f7e1511156 --- /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 607437f8f757321e85cf2e39573d917fbe7285ed..34b6bb0f903c43f5d7d6d307f589ec85dc556969 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 ff4fc8ae925df21a16bc0b81b3fd81898c3f5d24..2ac06208b51ee8af4214540f08355c9332ee133d 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 a12d79c9c4c9995ebf911d9907acd1e181a406fb..01bd09b25be097eea526d1526313f68f70f39f96 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 cb551e4c881dd6286532598ad1dfdc0e8d7c35df..6bdf637ffb3c6bd6a8a4bb1b99e014a247f762aa 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 0000000000000000000000000000000000000000..f501112962b6326dad692ee7b8aa39f371e68159 --- /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 0000000000000000000000000000000000000000..32636c420dc8d7dbf178aededea602c7b76532e0 --- /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 1260883fe31508d05fbe984f7cb98b104bfe2a52..c2f25406475d12c47c65018f4df6b854959042de 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 0000000000000000000000000000000000000000..d2a26a993eac27a84d3a8047339c3b3959eeb9d2 --- /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 0000000000000000000000000000000000000000..9649b5406a0d30fa4839b0ea013e443a0421b4d0 --- /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 0000000000000000000000000000000000000000..5a26a594630bc2f8c759c568fef55ef1f6f11ce0 --- /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 e7634a16bf9a0a3daaa94c5e2b81e5fa7a005e71..f1490e0eb03c56c7607e27c1276d30d3dfb63f52 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 03529d08dc9fbfcbb52f68d774862f076e812c72..73d1a1751f30bb41bf77256ea07cdead5c5eb3e9 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 fd8c939e1c3933f02553accdd4b2e407890d4b43..277fd75c8929a396de5d0aa20ae42d1c7083dd8e 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 66bcc5a36eed879ce6a0f8c844c830a1cafb2aff..1986c0342c0ba5ec364d1f003d550425fa754f22 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 0000000000000000000000000000000000000000..38084c562a8e04438f62f5b88708e769d99e6c0f --- /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 0000000000000000000000000000000000000000..00ed8463beba63a4e03b2ab40f9a9cdab271b048 --- /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 8e8cc643fc099adc3ef532df5320b01a7156f428..07530985b043f9b76d93f0ce8f4a9ce2e2564932 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 21fb3b86d77e2daab9963919d02641877d1d4fbc..6104c45f7a4961ceed48f816e33feaf878af470d 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 35f11d9308d2d37fdff7866bad2f98b1d7eafdd1..5253ea022aca64f74f70864d861b2f1079a78fe3 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 80ecfe320890b41d19e439b7394db4c74d843f5c..707c6cd9f2bfa8be6ba5da782a9e5857ab448f81 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 b241501c310810b8ba66d74878673a31c7221255..61f52545e45d7c5c5db5033dd648592d4d3c1a30 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 0000000000000000000000000000000000000000..5c3b6f6b87a861b880d9224e6cc169e6a6b015c1 --- /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 0000000000000000000000000000000000000000..afdbfc13c648ef18cccbb76934f5a1e56e330ed9 --- /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 096ed952ef348fe1a1c3bb2889ec32c2cdf4ebb2..1ac3f62cb626ac885741d5c1655963163fa64c39 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 5554b63e9b4d6067544d3aafa2bf7752502fcb0d..f6d8311611b54df45ed835a9c61f9d36a732fd89 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 6844ad7fe9c1a415017af829ca8086c4f4ff8285..6d538d492d369ade3dbff9cfb6a5e259d9c2d246 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 a98e2cea44d474217e449d3494a27ef70dbab002..d6dea1573b517c76f58b53b72278cfd05307f774 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 3f40e656f09b09b7d00270f567517b0fe064093b..3262f4498c49f3c52332b4c170721589a402b09e 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 0000000000000000000000000000000000000000..2e337619da000c41c068e9ea0c5312ceee365fb4 --- /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 0000000000000000000000000000000000000000..fb473a75a77af3f52e5dbad45946be18f389f3bf --- /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 294388a982aae58097f1c4a4fd7a81207da32e60..6b8d8536d3e27f4be33f621c358112415a4fb2de 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 34dfe534b0382dc74065efda94639593e29099da..e628b3ac5672cfec832e3e4fa2582c3c546979e4 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 e02eb6a006a0bd236b3765a9ab5d490a34f36d1d..ebb19a426fccb67299a9a8ef4a5c10764c6588f7 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 7652c546a7c4275a173365802242451ed2cbcd03..6593a6c52a0d56ca25f4efeec01ab48aaba52f1c 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 bc001aa284ec1a57e74968a5768b279f7b673b41..f37ea74df696a727e554878f3fd7526256dd06bf 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 0000000000000000000000000000000000000000..e77b50da511ccae4d15c0e1a3baf57e65ff13851 --- /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 0000000000000000000000000000000000000000..755b850bd186f85d3b6ef1ef7dc52d2172273532 --- /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 dde92722fa9d0dd5a421478e2c56f8f7ff027bb5..4ff9e092a818ed58f2d140e7f0abee08dc429097 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 49e281bd7eafc0adb210710c936284233772d48c..14fd13e300d98316df472c094b431bed6626ec9f 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 df6e52c3922bc70a4e1c4023b87be3b7da4d5f8d..612e4a3ea6ce340aa30e141cfb2791322b0b2143 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 7ac589657567cf3ec475e87ff5fdd48b69def9a3..249e98cb14ac0710aa831a640abbbd16bfdc3647 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 c6799db962b06b5345b2cc315bac04524e16ca5c..8a6a62c4671cf6b380b36c002a6bf92de87fa3e7 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 0000000000000000000000000000000000000000..ac5e4da93ddbb480f844db5bfcee22659850fec5 --- /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 0000000000000000000000000000000000000000..77a4f80c9a698d28962e43ad960164934a7bc939 --- /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 2c602452be9e67f4a5c7ed59b276b68f382b20c3..15c7590c350663da8dd94a299baab9bfa230ea7f 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 8ee37ce11612c9a29665a93f9738069a32a3131f..94975ef07066092999767af44361d4a47b4d508c 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 d66c3d26af69e590f36398f2d09f258d817981dc..81d9a231a47e6952c447884300c346dd395c1f5e 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 6f9ec4a4c7705df533150fce2e619c3b0639d5c9..7a31a87d8b4a2ddc6b07d938da10e567207aaac3 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 e270cbe50777a6491b27ad432597418775705785..9f118b185efa453fb65389fc0a5e08b1e1b62b05 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 0000000000000000000000000000000000000000..847fbe5747589ab0064c9556ddc9a2ef97fb9f3a --- /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 0000000000000000000000000000000000000000..8c13b7e74f93e9799695f022270b117ba859e0d8 --- /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 8c0c9b2a5b5b105e5de79a8cc8a2548157d06c3c..28798be2f6570c9a6807e0f286844c77bfdd5092 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 0000000000000000000000000000000000000000..54fe41911188301626b45be7dab1748b3e246dca --- /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 0000000000000000000000000000000000000000..96026dddc91061f64c1d270ad8d392aaf2da990f --- /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 5c9639bc9ecf2fb9938ac18fb0451d874304711d..88184500177f2a1a5b17f983b20710cd5bb044fe 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 518f1f164df22a4e3e23980fc9bdcec79d32891a..c986cd012dbaba524df5c88fe90340b6a34c60af 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 2b7aa5a78e494ed10ef0bce56c992e2cdc3b91b6..0000000000000000000000000000000000000000 --- 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 e9c44bb1bbe6e2a0644c7be858e4418bd42f1b2b..9633a3bbd8e409c8c7df4f874e586dc1af8776ad 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 ec3eae5459f5b5240607c8a3b90bb312e285e9b8..7520e6546fdf2d64d2a54700a616fe717ec630b1 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 bd7c9757e33197efa5694f887208e7468480b919..75612496c56815165db23f23ec2742368aaad5d9 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 3e988d94feacbaee3e848704229221e53f9e218e..c5f63012a8cf68f156ee88ce1743f60276b51bfe 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 7f3963b1f48d17549970e00aee512023cda4d70f..ca04c448dc9c2d6004d80bee0b7af202938b3a56 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 b6df495eb2d73c6547d51e13660dad9eaa0b7683..be58a467748297cd1d627ed6776bbddbb9a19a6e 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 16b468837be238efe7fc89bc05918f2cde4a2af7..7ee11c41d4ec573445d292399170cffca2b81f90 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 b7492996cdce0615c6d02b68875a66524c121bbf..9de84949fd7bcd033985541cf87b559d3a2a832b 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 d3554fe95405319e7d7b57f72a702be573f35a69..1ba08ba625317f1d6adf6e6799ee97ad05345765 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 e71f434467a29433eeb108f31abb47fb7b037b97..c2520d741691e4eadf6bf8ac815c4b382e4bcbd2 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 ee79439a6849d17109453e3c4bee3f54425f38b1..2ed9f8c6a1a158ba01c4737a942c0f75842dc8cd 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 e24b3848785051551f5acb5811756e21b0f8bcdb..d0768c666da7628cf4710a40d34aa0dbabc475aa 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 505de6f4b9b5ee373e2d0066109229ba8c57993f..c0771fa335a8ae635cc253eb61d987ca6e5144ed 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 77579a2f60f6aed9bea9bffd3862a51afc3003f8..f3b1fa0312fefcd4ca07d27c0cbfe76a4a98d692 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 0000000000000000000000000000000000000000..8f5b5d5b16ac678a1f15cbfa4e4c4f5e628fb921 --- /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 0000000000000000000000000000000000000000..de9c94b7de92e0a0e9a15ac1f23876cdeddd5c2f --- /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 2edbc79dbe89655ef08aca1e468d92b3bb5cece8..1390e7639e292712ba087062a4dc06e924870c66 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 b056fb488ea2eed195a3cf69bddf5758cf845881..86d37c3dda6f685e0d48958b9a12ce05fac37b19 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 fb408f497d793c672f21cf8665f88228239209ba..3296a5902e8438b5a83e1dd3dd7a83ffa529edec 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 67c9b0200bd7bbfaa6f8b481daaca1c2fe582de0..96eaebeb9aee3d67e0daf74abb53b8ff7260622b 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 8c8eac3a268855bf7c10fd10fed9849e64f30e1a..4555de6efce79004bae3c3f834707e6810a908bf 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 24d5eb3b6f52d21ec4f44ac178641b1e0473c201..efbb8034803eefe73a2d745ca790c5f1e610000a 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 b6d3cfb14f91036892950f678a3e3dc12db7b68b..dd750df16cae1e30fef2cbb252f15a1c649a4325 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 813aac64b2759662500f1669e48914c30e4e62c6..1ff9fb2327f7c89c77265cf818ebea4962f76b65 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 63d8ad694cf962410453521eca6f795c332675e9..b80d396c392fd383fb97b2b839158c3372d3e814 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 6ea8e962786288af2afef72ca6abe6b992510f09..e0e0a3c3b24b5f52346f9501da435325ee1e547d 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 0000000000000000000000000000000000000000..d257631dde001d7a9a2ecb8c541287d7953d4ada --- /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 0000000000000000000000000000000000000000..df86d9893d65901e8d7332d715e2c11f7ac26fc4 --- /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 8ce2d2fd051b67ebf83e4e4f9b6263df1d13c64a..cc297096e4163e6fb2431dbda99418e6d8d5962e 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 1bdcb8e773bbed01d1b1c6d82e794eb9fe030aa6..b6f884a84f7b6e81cb2c01c261fb3bf75bc43cb7 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 9bfeb243fc2734b2870eb01ea9d1a3029bf47d82..76a7d9f7a7a08630011379f5bb9d95c413887b4d 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 db7c211752a7e0f83338d1338517bf7637baeca3..59dd6f45f17181c611e8fd2f35a5ec9dbb0547d5 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 e88d530aca5c7563b3995a23fddc0af69fc7d40e..46914e9068c1fc163ba3e267372a571cb37a65f6 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 0000000000000000000000000000000000000000..b2d30bb6844a9aa308eaa342a12c9935f4eddd72 --- /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 0000000000000000000000000000000000000000..9e38dfbc9112705d4f04a321d7615748cde876f2 --- /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 fffb53f4f1ad4da1db9d83ffa49b54b8e9402c08..e65d06e9817120a48668e2069983a4e2bc06fcfe 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 656dad2c1ae7f34ce473c62cc61023e554708578..40dcc6bc94396cfe068e0ee1caa8debbfc4c3296 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 803d75477e12d59b32003077a69af41b487acada..3670093d19c42ea9d9aca1ba142fa2866d260179 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 ae718c8241b3688897ccb8a4964189f56d4c6cfd..85571fd5582022965f11cafe92c6eff77fd4d3ad 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 f57b9ac5bb878df08dfb6fbecaf3e2bae387a002..ddb2b385cad3564bcfb5d2719d7ecaf1f384ed46 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 0000000000000000000000000000000000000000..21a082f6d5c5f49d0095caedbaafe128b7469b82 --- /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 0000000000000000000000000000000000000000..6b444eb32649c8c57ab9c059b857f70cfebe31d0 --- /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 e376980dfc4eeac829b23424de844c4c60119418..606f9857cdbf8bd60143acde6a73719259ec77c5 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 ed18ea80b92eb719aa3a6eddb4aa96732bd353db..dac45df4344b694a1614d3852da5c54ffb39a670 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 3c8a55c93befb9338786ccf819b11c3f427a0128..e18acba62c6904fce6ee6d00411c3ffb16ffa7a0 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 65966a09cb093c6df19c4cfae4d7c0a8259ac602..33764b72e56af209246a9ea3a7741e463870c022 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 540ad191c952d9c470dd2863ac66432148c79370..fe4b9d8fa504a96c8b9741b25fa0a474e93e75df 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 0000000000000000000000000000000000000000..fc2cdc56cee170afa81676bb0c26001e4c272315 --- /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 0000000000000000000000000000000000000000..c1bf2164e0a3dc5ce9d2d46fb3a2fdf8480c2e95 --- /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 2409d6ae0b86b0e0078058eb223307613645353b..1e8ff0f8147a0b8d535b080efc07430401e05081 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 a3055504f09d85f6aa8b1901fca160a5ff5ad19f..27d235a7214a22489b3cab3dedfc76b8f0216c63 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 1e305c017d444730ead1ad96f4120e152d63e7fc..6377c3578bec79dc0496c243d2fcc8264a456efa 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 96b9f225a34a6ab4f24961490309a690035f41ab..7c2d3b0a39062d8475eac6565279645aef414df5 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 9b095ec504144e235c3c521a57070161f6bd8d3a..2801a349d1316f2ff3f24206cb6a2831b5cf861c 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 0000000000000000000000000000000000000000..77c05cade69be23b1a54c4a429c4224e581c8de7 --- /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 0000000000000000000000000000000000000000..eb7d9e137e9f8afa41d276a2a60e024a7f2a4f98 --- /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 9377cf759384aade5a28159815ec115727e3ceaf..a5ebd2808cfb899603f92f571688757cd23daba2 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 0000000000000000000000000000000000000000..366efed2fcf98578ed993a7794742eeeec678f7b --- /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 0000000000000000000000000000000000000000..d44434ad174537b2864600dc6b9961294bd3d698 --- /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 0000000000000000000000000000000000000000..dee4e5946fe060c7a23f777b6e36c6e4a1735aa4 --- /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 0000000000000000000000000000000000000000..c15dd203a9d5f72c720ca7c749f092a596a32478 --- /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 5d3337f356ab6569178a1b1dbeb049f8361d2d96..9995556e8b171d9e7a5d60d9719b8edfaae1c120 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 3cc850ada8e5eb0574a29f3844eac470d4e903de..236e683714ae4291485bd405b21f814dc8509844 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 7fa89ad9139fd3c785c700b69ed4f5de089c2d05..485a382e4935c02089fc19bbb316ed8630359f5f 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 88c2d21f6495e5d7b384d21b0d2a593c3f44cc39..49e1b31638aae90570aad65f7369cdebe3750c9a 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 170ab303d6a00e8ea0d8ed9d9cd9d180115ed5aa..bb7dc4cbf44628bf449951cc803f44db0e5f0363 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 2c482495a09e7321c2c6a9c4c798b28f5d5bbf3a..414c963995972f782faa5b9e858aef14602654f2 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 a9b0611ee4a34f26777bd4d3782c9c2d77ee6d31..11cbfcf788b70b398fec9b2c1f5c322f3dae7a95 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 0000000000000000000000000000000000000000..74b7858c7b6cb4e71b7131cb6b49d54f4eb69ea8 --- /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 cc8ea7ce7d5291314c461d39e3a0305dce074e52..cc177acd57e68db378397e7da9a18b7e8766048e 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 7e8cf6520266b6b4947aef4b94c2f54aaca22373..9dd54fa73993ef14af071e5a80bb84bcbfd6fb3b 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 061aa74474314c64aa9028c8e952430defb77def..948d23c827140231347b206cdc5497557ba73196 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 14e3dc66cd5a9dea7182c441968054faf4e26014..4ca55d8d9612c2b47e27a722b6622020b1b835fa 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 a1c4b00defec76e37d84e237cdc26d169197e9e7..adbd03e6c6237a78331637f7a380263bbc167932 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 0000000000000000000000000000000000000000..25507fab392c8e855b4d68c8620449eb536f4d39 --- /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 0000000000000000000000000000000000000000..56dec2a2eee2b06be0aa3d54fa01f43e816e8690 --- /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 01a18bebd9e6865ec1851b5320007b43d0c0227e..759eb62bd115735555a7717b43f55a45392d1d82 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 ab68ccb314cd71e09df735bf462ae0b0a5215594..f68257e2a005e88893fd3b7e6ce164f3db1ed2d5 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 4c0e85f0bc031e81946769502392719b5f2179c5..11eda8bd65145c86b7ee4d426ed1bdb9fe7c8d25 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 056461df1932c13b6a3a4fec1bc64b0472e6d895..a479fdd3c3b007b5f10f1ecbe1e0a44ffe407fb6 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 5735b08153adc35396a5b29bb3f1d98204a836b5..9f58eb22d2beef11173e9f7f7d8527e618f4e5a8 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 0000000000000000000000000000000000000000..3530b98d0f2d9dd4f93d573ac2105854aeea3f67 --- /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 0000000000000000000000000000000000000000..15a37aa86df5faf156393d3328b33915795d7db4 --- /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 18986604f0fc88f6607384b10a093dd70d892d21..31354912ccb78166fb105f175da0c92b01643641 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 bfd85d84ad782bb7cdd57a2ceb23d1146e1f3133..ac6ca3430b9b89321805edf8b1b500b5a1f1eda4 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 82b5440f04752fb690ad5aca416bc272f15f74fb..1e3724bf9212d53fee60e4615dd61ccbe6321b92 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 a473fda3f41ce247a99960cd242c87988b4ba005..4e3c4e3d7274b8300da0234c3c43479ff57f8894 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 435c2c8fd97f5c2a725918676da91a7898615049..20a6fc1474633e427e289c20aed9f4b13adf3992 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 0000000000000000000000000000000000000000..30df3ef646d959a13b329e65e88d50b30700589a --- /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 0000000000000000000000000000000000000000..a1c6037d4ff3b8c66f6fc3238e4154e0b46ed4f7 --- /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 2b86174641d739d2213c1caf7c5fad72f75e420e..f4b52e635ca210821c2c5bc484dbf54d592ddca8 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 b9b64e5424cb64d9c81e7eecbb0e02f75a936ee4..f5dbafb3081a31d86fc56b4067e4e639c2f22796 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 ee373b465d95466a60afa96a9c07dfb648e1732e..4080a9897bb351db1e818932d33408056ff02ca6 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 e3caff61aa8cfa2ebc18873e08fdd8ffb4a859b2..95c05ce2a30c651384391ca2b8a066267d7be0d1 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 070db9093b4304de9edfd660d4ce8fb5b69a7f84..2a66f071feb8237e406823e0870bd38bee48fd85 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 0000000000000000000000000000000000000000..6894e6f7ab1eaed04298ad2dffdc5f2bea927107 --- /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 0000000000000000000000000000000000000000..fd2bf8fd769618c6073168467de70b5c8d2909d1 --- /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 50ffafe2f960854b4d28077e7ca733b5e7e8b306..fca2d77d1195f198bc6bc40ff73df4120bb008ca 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 666a41ca8b6451d72a1b0f67c99f91c2d6ede9eb..a18b90f529e0a77b7046dfc30320732a6a28e7a9 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 12d148d6138a0f15fd6c21941e5d2cc49978803f..258c0dbd2b0574315e98d0405a90a3169bc37eaf 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 cd4f184292e805efb86f307cf4b830ea414435c4..449f385889c90325f3125922a098e2cd3c01ab30 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 64334ba094f20ae366415c7bc62a87b855d54fcc..fb04feabb58f69cdb6922951cb205c3335994ea6 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 dc4b9a96bdba8a793385fd5225e75ec7468b843b..97f0d66ed017102a10d8110883f88e647b5db501 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 19423553eafe3970ea33d8ccc6468c2a455073ea..475696926c6b42f1ac3aeb1d9949f379fdd8bbaa 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 c44b99564153e1353320b6f8f468d83b351a27d6..5c3decb17947e6bd8e7995c2ff3b120835520f80 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 39cf2cb52ae6c2e8f719dbf6dcfceec62317f444..b0d5dc66bb82993e1e42505f56553677b01cf4b0 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 69b5bce83346bc8a52cdb31adf23c5fb6fe7852b..5ab17511d15b768d43f0b3a84895f459ac8d39eb 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 cef596bb745538ea535509a694aa95eec778dc3d..e81f993692ed5ec0b6e9adbd41463a4b29551502 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 caf9edbe98074729c74abd26a5c5d91233a897c5..2364d417b68cd10cda5e5ef43f353dfbfac62672 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 440650c8323740c5155859d7f1dbf8aba36a9e3c..5a8130a5cce2c8e45dcc0c322f1a0908297218f0 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 3bf11c26da7be8a741fe8044c45fe226620a16bc..02eade5d9d981da5358da67b0e7f49f5157eb8e8 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 0000000000000000000000000000000000000000..1ad7a3ab0443c8d23f3f4bd68094f969c4348238 --- /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 e1ba62e97060ea1d97fc6015e47ce227e4a886b1..1acfc2fe29449a2adeb6a561853c93714ed26a64 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 58c14e57dcd3425c79dc44db15d235237a0a46e8..bfff8da44ec1b9137f94a489d2e7f6b52249f532 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 c134b47409744a24a788fdcc7db9a13d08d1f54d..467b5ed045e050c1dab9f7295479fcaee537dd76 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