mirror of
https://github.com/hanzoai/expr.git
synced 2026-09-24 16:58:58 +00:00
Add optional array access like foo?.[42] (#550)
This commit is contained in:
@@ -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, "]")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user