Add optional array access like foo?.[42] (#550)

This commit is contained in:
Sergey
2024-02-08 12:20:20 +01:00
committed by GitHub
parent a20dd842e3
commit 8d2e6b133c
3 changed files with 45 additions and 0 deletions
+10
View File
@@ -575,10 +575,16 @@ end:
func (p *parser) parsePostfixExpression(node Node) Node {
postfixToken := p.current
for (postfixToken.Is(Operator) || postfixToken.Is(Bracket)) && p.err == nil {
optional := postfixToken.Value == "?."
parseToken:
if postfixToken.Value == "." || postfixToken.Value == "?." {
p.next()
propertyToken := p.current
if optional && propertyToken.Is(Bracket, "[") {
postfixToken = propertyToken
goto parseToken
}
p.next()
if propertyToken.Kind != Identifier &&
@@ -662,8 +668,12 @@ func (p *parser) parsePostfixExpression(node Node) Node {
node = &MemberNode{
Node: node,
Property: from,
Optional: optional,
}
node.SetLocation(postfixToken.Location)
if optional {
node = &ChainNode{Node: node}
}
p.expect(Bracket, "]")
}
}
+13
View File
@@ -747,6 +747,19 @@ func TestParse_optional_chaining(t *testing.T) {
},
},
},
{
"foo.bar?.[0]",
&ChainNode{
Node: &MemberNode{
Node: &MemberNode{
Node: &IdentifierNode{Value: "foo"},
Property: &StringNode{Value: "bar"},
},
Property: &IntegerNode{Value: 0},
Optional: true,
},
},
},
}
for _, test := range parseTests {
actual, err := parser.Parse(test.input)