Adding case where PrivateName is used inside computed property. (#2241)

* Adding case where PrivateName is used inside computed property.

* Adding proper description to early errors on usage of undeclared private names inside computed property.
This commit is contained in:
Caio Lima 2019-07-30 11:53:56 -07:00 committed by Leo Balter
parent 98d4844997
commit aeff2b0048
6 changed files with 240 additions and 0 deletions

View File

@ -0,0 +1,43 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
desc: Use of undeclared PrivateName in ComputedProperty is a syntax error
info: |
ClassElementName:
PropertyName
PrivateIdentifier
PropertyName:
LiteralPropertyName
ComputedPropertyName
ComputedPropertyName:
[ AssignmentExpression ]
AssignmentExpression ... MemberExpression
MemberExpression:
MemberExpression . PrivateName
Static Semantics: AllPrivateIdentifiersValid
AllPrivateIdentifiersValid is an abstract operation which takes names as an argument.
MemberExpression : MemberExpression . PrivateIdentifier
1. If StringValue of PrivateIdentifier is in names, return true.
2. Return false.
ClassBody : ClassElementList
1. Let newNames be the concatenation of names with PrivateBoundIdentifiers of ClassBody.
2. Return AllPrivateIdentifiersValid of ClassElementList with the argument newNames.
Static Semantics: Early Errors
ScriptBody : StatementList
It is a Syntax Error if AllPrivateIdentifiersValid 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, class-fields-public]
template: syntax/invalid
---*/
//- elements
[this.#f] = 'Test262'

View File

@ -0,0 +1,52 @@
// This file was procedurally generated from the following sources:
// - src/class-elements/grammar-privatename-in-computed-property-missing.case
// - src/class-elements/syntax/invalid/cls-expr-elements-invalid-syntax.template
/*---
description: Use of undeclared PrivateName in ComputedProperty is a syntax error (class expression)
esid: prod-ClassElement
features: [class-fields-private, class-fields-public, class]
flags: [generated]
negative:
phase: parse
type: SyntaxError
info: |
ClassElementName:
PropertyName
PrivateIdentifier
PropertyName:
LiteralPropertyName
ComputedPropertyName
ComputedPropertyName:
[ AssignmentExpression ]
AssignmentExpression ... MemberExpression
MemberExpression:
MemberExpression . PrivateName
Static Semantics: AllPrivateIdentifiersValid
AllPrivateIdentifiersValid is an abstract operation which takes names as an argument.
MemberExpression : MemberExpression . PrivateIdentifier
1. If StringValue of PrivateIdentifier is in names, return true.
2. Return false.
ClassBody : ClassElementList
1. Let newNames be the concatenation of names with PrivateBoundIdentifiers of ClassBody.
2. Return AllPrivateIdentifiersValid of ClassElementList with the argument newNames.
Static Semantics: Early Errors
ScriptBody : StatementList
It is a Syntax Error if AllPrivateIdentifiersValid 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.
---*/
$DONOTEVALUATE();
var C = class {
[this.#f] = 'Test262'
};

View File

@ -0,0 +1,32 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Private getter of a class is visible in its ComputetProperty scope
esid: prod-ClassTail
info: |
ClassTail : ClassHeritage { ClassBody }
1. Let lex be the LexicalEnvironment of the running execution context.
2. Let classScope be NewDeclarativeEnvironment(lex).
3. Let classScopeEnvRec be classScope's EnvironmentRecord.
...
15. Set the running execution context's LexicalEnvironment to classScope.
16. Set the running execution context's PrivateEnvironment to classPrivateEnvironment.
...
27. For each ClassElement e in order from elements
a. If IsStatic of e is false, then
i. Let field be the result of ClassElementEvaluation for e with arguments proto and false.
...
features: [class-methods-private, class-fields-public, class]
---*/
assert.throws(TypeError, function() {
class C {
get #f() {
throw new Test262Error();
}
[this.#f] = 'Test262';
}
}, 'access to a private acessor from ordinary object');

View File

@ -0,0 +1,29 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: PrivateName of a class is visible in its ComputetProperty scope
esid: prod-ClassTail
info: |
ClassTail : ClassHeritage { ClassBody }
1. Let lex be the LexicalEnvironment of the running execution context.
2. Let classScope be NewDeclarativeEnvironment(lex).
3. Let classScopeEnvRec be classScope's EnvironmentRecord.
...
15. Set the running execution context's LexicalEnvironment to classScope.
16. Set the running execution context's PrivateEnvironment to classPrivateEnvironment.
...
27. For each ClassElement e in order from elements
a. If IsStatic of e is false, then
i. Let field be the result of ClassElementEvaluation for e with arguments proto and false.
...
features: [class-fields-private, class]
---*/
assert.throws(TypeError, function() {
class C {
[this.#f] = 'Test262';
#f = 'foo';
}
}, 'access to a not defined private field in object should throw a TypeError');

View File

@ -0,0 +1,32 @@
// Copyright (C) 2019 Caio Lima (Igalia SL). All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
description: Private method of a class is visible in its ComputetProperty scope
esid: prod-ClassTail
info: |
ClassTail : ClassHeritage { ClassBody }
1. Let lex be the LexicalEnvironment of the running execution context.
2. Let classScope be NewDeclarativeEnvironment(lex).
3. Let classScopeEnvRec be classScope's EnvironmentRecord.
...
15. Set the running execution context's LexicalEnvironment to classScope.
16. Set the running execution context's PrivateEnvironment to classPrivateEnvironment.
...
27. For each ClassElement e in order from elements
a. If IsStatic of e is false, then
i. Let field be the result of ClassElementEvaluation for e with arguments proto and false.
...
features: [class-methods-private, class-fields-public, class]
---*/
assert.throws(TypeError, function() {
class C {
#m() {
throw new Test262Error();
}
[this.#m()] = 'Test262';
}
}, 'access to a private method from ordinary object');

View File

@ -0,0 +1,52 @@
// This file was procedurally generated from the following sources:
// - src/class-elements/grammar-privatename-in-computed-property-missing.case
// - src/class-elements/syntax/invalid/cls-decl-elements-invalid-syntax.template
/*---
description: Use of undeclared PrivateName in ComputedProperty is a syntax error (class declaration)
esid: prod-ClassElement
features: [class-fields-private, class-fields-public, class]
flags: [generated]
negative:
phase: parse
type: SyntaxError
info: |
ClassElementName:
PropertyName
PrivateIdentifier
PropertyName:
LiteralPropertyName
ComputedPropertyName
ComputedPropertyName:
[ AssignmentExpression ]
AssignmentExpression ... MemberExpression
MemberExpression:
MemberExpression . PrivateName
Static Semantics: AllPrivateIdentifiersValid
AllPrivateIdentifiersValid is an abstract operation which takes names as an argument.
MemberExpression : MemberExpression . PrivateIdentifier
1. If StringValue of PrivateIdentifier is in names, return true.
2. Return false.
ClassBody : ClassElementList
1. Let newNames be the concatenation of names with PrivateBoundIdentifiers of ClassBody.
2. Return AllPrivateIdentifiersValid of ClassElementList with the argument newNames.
Static Semantics: Early Errors
ScriptBody : StatementList
It is a Syntax Error if AllPrivateIdentifiersValid 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.
---*/
$DONOTEVALUATE();
class C {
[this.#f] = 'Test262'
}