Skip to content
Snippets Groups Projects
Commit 94a0eaeb authored by Leo Balter's avatar Leo Balter Committed by Rick Waldron
Browse files

Generate tests

parent ef0e6dfb
No related branches found
No related tags found
No related merge requests found
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-async-generator.case
// - src/class-elements/private-methods/cls-expr.template
/*---
description: Private Async Generator (private method definitions in a class expression)
esid: prod-MethodDefinition
features: [async-iteration]
flags: [generated, async]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
var ctorPromise;
/***
* template notes:
* 1. method should always be #m
* 2. the template provides c.ref/other.ref for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
var C = class {
async * #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
var ctorIter = this.#m();
var p = ctorIter.next();
ctorPromise = p.then(({ value, done }) => {
assert.sameValue(value, 42, 'return from generator method, inside ctor');
assert.sameValue(done, true, 'iterator is done, inside ctor');
}, $DONE);
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
ctorPromise.then(() => {
var iter = c.ref();
return iter.next().then(({ value, done }) => {
assert.sameValue(value, 42, 'return from generator method');
assert.sameValue(done, true, 'iterator is done');
});
}, $DONE).then($DONE, $DONE);
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-async-method.case
// - src/class-elements/private-methods/cls-expr.template
/*---
description: Private Async Method (private method definitions in a class expression)
esid: prod-MethodDefinition
features: [async-functions]
flags: [generated, async]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
var ctorPromise;
/***
* template notes:
* 1. method should always be #m
* 2. the template provides c.ref/other.ref for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
var C = class {
async #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
ctorPromise = this.#m().then(value => {
assert.sameValue(this.#m(), 42, 'already defined in the ctor');
}, $DONE);
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
ctorPromise.then(() => {
return c.ref().then(value => {
assert.sameValue(value, 42, 'function return');
});
}, $DONE).then($DONE, $DONE);
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-generator.case
// - src/class-elements/private-methods/cls-expr.template
/*---
description: Private Generator (private method definitions in a class expression)
esid: prod-MethodDefinition
features: [generators]
flags: [generated]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
/***
* template notes:
* 1. method should always be #m
* 2. the template provides c.ref/other.ref for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
var C = class {
* #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
var res = this.#m().next();
assert.sameValue(res.value, 42, 'return from generator method, inside ctor');
assert.sameValue(res.done, true, 'iterator is done, inside ctor');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
var res = c.ref().next();
assert.sameValue(res.value, 42, 'return from generator method');
assert.sameValue(res.done, true, 'iterator is done');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-method.case
// - src/class-elements/private-methods/cls-expr.template
/*---
description: Private Method (private method definitions in a class expression)
esid: prod-MethodDefinition
flags: [generated]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
/***
* template notes:
* 1. method should always be #m
* 2. the template provides c.ref/other.ref for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
var C = class {
#m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
assert.sameValue(this.#m(), 42, 'already defined in the ctor');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref(), 42, 'function return');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-async-generator.case
// - src/class-elements/private-methods/cls-decl.template
/*---
description: Private Async Generator (private method definitions in a class declaration)
esid: prod-MethodDefinition
features: [async-iteration, class, class-methods-private]
flags: [generated, async]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
var ctorPromise;
/*** template notes
* method should always be #m
* the template provides c.ref() for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
class C {
async * #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
var ctorIter = this.#m();
var p = ctorIter.next();
ctorPromise = p.then(({ value, done }) => {
assert.sameValue(value, 42, 'return from generator method, inside ctor');
assert.sameValue(done, true, 'iterator is done, inside ctor');
}, $DONE);
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
ctorPromise.then(() => {
var iter = c.ref();
return iter.next().then(({ value, done }) => {
assert.sameValue(value, 42, 'return from generator method');
assert.sameValue(done, true, 'iterator is done');
});
}, $DONE).then($DONE, $DONE);
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-async-method.case
// - src/class-elements/private-methods/cls-decl.template
/*---
description: Private Async Method (private method definitions in a class declaration)
esid: prod-MethodDefinition
features: [async-functions, class, class-methods-private]
flags: [generated, async]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
var ctorPromise;
/*** template notes
* method should always be #m
* the template provides c.ref() for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
class C {
async #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
ctorPromise = this.#m().then(value => {
assert.sameValue(this.#m(), 42, 'already defined in the ctor');
}, $DONE);
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
ctorPromise.then(() => {
return c.ref().then(value => {
assert.sameValue(value, 42, 'function return');
});
}, $DONE).then($DONE, $DONE);
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-generator.case
// - src/class-elements/private-methods/cls-decl.template
/*---
description: Private Generator (private method definitions in a class declaration)
esid: prod-MethodDefinition
features: [generators, class, class-methods-private]
flags: [generated]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
/*** template notes
* method should always be #m
* the template provides c.ref() for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
class C {
* #m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
var res = this.#m().next();
assert.sameValue(res.value, 42, 'return from generator method, inside ctor');
assert.sameValue(res.done, true, 'iterator is done, inside ctor');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
var res = c.ref().next();
assert.sameValue(res.value, 42, 'return from generator method');
assert.sameValue(res.done, true, 'iterator is done');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
// This file was procedurally generated from the following sources:
// - src/class-elements/prod-private-method.case
// - src/class-elements/private-methods/cls-decl.template
/*---
description: Private Method (private method definitions in a class declaration)
esid: prod-MethodDefinition
features: [class, class-methods-private]
flags: [generated]
info: |
ClassElement :
MethodDefinition
...
;
ClassElementName :
PropertyName
PrivateName
PrivateName ::
# IdentifierName
MethodDefinition :
ClassElementName ( UniqueFormalParameters ) { FunctionBody }
GeneratorMethod
AsyncMethod
AsyncGeneratorMethod
get ClassElementName () { FunctionBody }
set ClassElementName ( PropertySetParameterList ) { FunctionBody }
GeneratorMethod :
* ClassElementName ( UniqueFormalParameters ){GeneratorBody}
AsyncMethod :
async [no LineTerminator here] ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }
AsyncGeneratorMethod :
async [no LineTerminator here]* ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }
---
InitializeClassElements ( F, proto )
...
5. For each item element in order from elements,
a. Assert: If element.[[Placement]] is "prototype" or "static", then element.[[Key]] is not a Private Name.
b. If element.[[Kind]] is "method" and element.[[Placement]] is "static" or "prototype",
i. Let receiver be F if element.[[Placement]] is "static", else let receiver be proto.
ii. Perform ? DefineClassElement(receiver, element).
InitializeInstanceElements ( O, constructor )
...
3. Let elements be the value of F's [[Elements]] internal slot.
4. For each item element in order from elements,
a. If element.[[Placement]] is "own" and element.[[Kind]] is "method",
i. Perform ? DefineClassElement(O, element).
DefineClassElement (receiver, element)
...
6. If key is a Private Name,
a. Perform ? PrivateFieldDefine(receiver, key, descriptor).
PrivateFieldDefine (P, O, desc)
...
6. Append { [[PrivateName]]: P, [[PrivateFieldDescriptor]]: desc } to O.[[PrivateFieldDescriptors]].
---*/
/*** template notes
* method should always be #m
* the template provides c.ref() for external reference
*/
function hasOwnProperty(obj, name) {
return Object.prototype.hasOwnProperty.call(obj, name);
}
class C {
#m() { return 42; }
get ref() { return this.#m; }
constructor() {
assert.sameValue(
hasOwnProperty(this, '#m'), false,
'private methods are defined in an special internal slot and cannot be found as own properties'
);
assert.sameValue(typeof this.#m, 'function');
assert.sameValue(this.ref(), this.#m, 'returns the same value');
assert.sameValue(this.#m(), 42, 'already defined in the ctor');
assert.sameValue(this.#m.name, '#m', 'function name inside constructor');
}
}
var c = new C();
var other = new C();
assert.sameValue(
hasOwnProperty(C.prototype, '#m'), false,
'method is not defined in the prototype'
);
assert.sameValue(
hasOwnProperty(C, '#m'), false,
'method is not defined in the contructor'
);
assert.sameValue(
hasOwnProperty(c, '#m'), false,
'method cannot be seen outside of the class'
);
/***
* MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
*
* 1. Let methodDef be DefineMethod of MethodDefinition with argument homeObject.
* ...
*/
assert.sameValue(c.ref, other.ref, 'The method is defined once, and reused on every new instance');
assert.sameValue(c.ref(), 42, 'function return');
assert.sameValue(c.ref.name, '#m', 'function name is preserved external reference');
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment