Skip to content
This repository was archived by the owner on Jan 25, 2022. It is now read-only.

Commit b055cd6

Browse files
author
Daniel Ehrenberg
authored
Merge pull request #301 from jridgewell/optional-chain
Add OptionalChain support
2 parents 9c96032 + fca14ec commit b055cd6

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
out/index.html
2+
node_modules/

spec.html

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,18 @@ <h1>Updated Syntactic Grammar Productions</h1>
142142
CallExpression[?Yield, ?Await] `.` IdentifierName
143143
CallExpression[?Yield, ?Await] TemplateLiteral[?Yield, ?Await]
144144
<ins>CallExpression[?Yield, ?Await] `.` PrivateIdentifier</ins>
145+
146+
OptionalChain[Yield, Await] :
147+
`?.` `[` Expression[+In, ?Yield, ?Await] `]`
148+
`?.` IdentifierName
149+
`?.` Arguments[?Yield, ?Await]
150+
`?.` TemplateLiteral[?Yield, ?Await, +Tagged]
151+
<ins>`?.` PrivateIdentifier</ins>
152+
OptionalChain[?Yield, ?Await] `[` Expression[+In, ?Yield, ?Await] `]`
153+
OptionalChain[?Yield, ?Await] `.` IdentifierName
154+
OptionalChain[?Yield, ?Await] Arguments[?Yield, ?Await]
155+
OptionalChain[?Yield, ?Await] TemplateLiteral[?Yield, ?Await, +Tagged]
156+
<ins>OptionalChain[?Yield, ?Await] `.` PrivateIdentifier</ins>
145157
</emu-grammar>
146158
</emu-clause>
147159

@@ -183,7 +195,7 @@ <h1>Static Semantics: Early Errors</h1>
183195
<emu-grammar>UnaryExpression : `delete` UnaryExpression</emu-grammar>
184196
<ul>
185197
<li>
186-
It is a Syntax Error if the |UnaryExpression| is contained in strict mode code and the derived |UnaryExpression| is <emu-grammar>PrimaryExpression : IdentifierReference</emu-grammar>, <ins><emu-grammar>MemberExpression : MemberExpression `.` PrivateIdentifier</emu-grammar>, or <emu-grammar>CallExpression : CallExpression `.` PrivateIdentifier</emu-grammar></ins>.
198+
It is a Syntax Error if the |UnaryExpression| is contained in strict mode code and the derived |UnaryExpression| is <emu-grammar>PrimaryExpression : IdentifierReference</emu-grammar>, <ins><emu-grammar>MemberExpression : MemberExpression `.` PrivateIdentifier</emu-grammar>, <emu-grammar>CallExpression : CallExpression `.` PrivateIdentifier</emu-grammar>, <emu-grammar>OptionalChain : `?.` PrivateIdentifier</emu-grammar>, or <emu-grammar>OptionalChain : OptionalChain `.` PrivateIdentifier</emu-grammar></ins>.
187199
</li>
188200
<li>
189201
<p>It is a Syntax Error if the derived |UnaryExpression| is
@@ -224,6 +236,18 @@ <h1>Static Semantics: AllPrivateIdentifiersValid</h1>
224236
1. Return *false*.
225237
</emu-alg>
226238

239+
<emu-grammar>OptionalChain[Yield, Await] : `?.` PrivateIdentifier</emu-grammar>
240+
<emu-alg>
241+
1. If StringValue of |PrivateIdentifier| is in _names_, return *true*.
242+
1. Return *false*.
243+
</emu-alg>
244+
245+
<emu-grammar>OptionalChain[Yield, Await] : OptionalChain[?Yield, ?Await] `.` PrivateIdentifier</emu-grammar>
246+
<emu-alg>
247+
1. If StringValue of |PrivateIdentifier| is in _names_, return *true*.
248+
1. Return *false*.
249+
</emu-alg>
250+
227251
<emu-grammar> ClassBody[Yield, Await] : ClassElementList[?Yield, ?Await] </emu-grammar>
228252
<emu-alg>
229253
1. Let _newNames_ be the concatenation of _names_ with PrivateBoundIdentifiers of |ClassBody|.
@@ -1544,6 +1568,27 @@ <h1>Runtime Semantics: Evaluation</h1>
15441568
</emu-alg>
15451569
</emu-clause>
15461570

1571+
<emu-clause id="sec-private-references-runtime-semantics-chainevaluation">
1572+
<h1>Runtime Semantics: ChainEvaluation</h1>
1573+
<p>With parameters _baseValue_ and _baseReference_.</p>
1574+
<emu-grammar>OptionalChain : `?.` PrivateIdentifier</emu-grammar>
1575+
<emu-alg>
1576+
1. Let _bv_ be ? RequireObjectCoercible(_baseValue_).
1577+
1. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|.
1578+
1. Return MakePrivateReference(_bv_, _fieldNameString_).
1579+
</emu-alg>
1580+
1581+
<emu-grammar>OptionalChain : OptionalChain `.` PrivateIdentifier</emu-grammar>
1582+
<emu-alg>
1583+
1. Let _optionalChain_ be |OptionalChain|.
1584+
1. Let _newReference_ be ? ChainEvaluation of _optionalChain_ with arguments _baseValue_ and _baseReference_.
1585+
1. Let _newValue_ be ? GetValue(_newReference_).
1586+
1. Let _nv_ be ? RequireObjectCoercible(_newValue_).
1587+
1. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|.
1588+
1. Return MakePrivateReference(_nv_, _fieldNameString_).
1589+
</emu-alg>
1590+
</emu-clause>
1591+
15471592
<emu-clause id="sec-reference-specification-type">
15481593
<h1>The Reference Specification Type</h1>
15491594
<emu-note>

0 commit comments

Comments
 (0)