diff --git a/parser/expression.go b/parser/expression.go index ebb6a4c96..49d007721 100644 --- a/parser/expression.go +++ b/parser/expression.go @@ -1489,12 +1489,59 @@ func (p *Parser) parseIsExpression(left ast.Expression) ast.Expression { } func (p *Parser) parseArrayAccess(left ast.Expression) ast.Expression { + pos := p.current.Pos + p.nextToken() // skip [ + + // Check for empty brackets [] - this is JSON array path notation + // json.arr[].field becomes Identifier json.arr.:`Array(JSON)`.field + if p.currentIs(token.RBRACKET) { + p.nextToken() // skip ] + + if ident, ok := left.(*ast.Identifier); ok { + // Append the JSON array type notation to the identifier + ident.Parts = append(ident.Parts, ":`Array(JSON)`") + + // Continue parsing any dot accesses that follow + for p.currentIs(token.DOT) { + p.nextToken() // skip . + + if p.currentIs(token.CARET) { + // Handle JSON path parent access: x.^c0 + p.nextToken() // skip ^ + if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + ident.Parts = append(ident.Parts, "^"+p.current.Value) + p.nextToken() + } else { + break + } + } else if p.currentIs(token.IDENT) || p.current.Token.IsKeyword() { + ident.Parts = append(ident.Parts, p.current.Value) + p.nextToken() + + // Check for nested empty array access (e.g., arr[].nested[].field) + if p.currentIs(token.LBRACKET) { + return p.parseArrayAccess(ident) + } + } else { + break + } + } + return ident + } + + // Not an identifier, fall through to create ArrayAccess with nil index + return &ast.ArrayAccess{ + Position: pos, + Array: left, + Index: nil, + } + } + + // Regular array access with index expression expr := &ast.ArrayAccess{ - Position: p.current.Pos, + Position: pos, Array: left, } - - p.nextToken() // skip [ expr.Index = p.parseExpression(LOWEST) p.expect(token.RBRACKET) diff --git a/parser/testdata/03553_json_shared_data_advanced_serialization/metadata.json b/parser/testdata/03553_json_shared_data_advanced_serialization/metadata.json index 94b13ecde..0967ef424 100644 --- a/parser/testdata/03553_json_shared_data_advanced_serialization/metadata.json +++ b/parser/testdata/03553_json_shared_data_advanced_serialization/metadata.json @@ -1,104 +1 @@ -{ - "explain_todo": { - "stmt117": true, - "stmt119": true, - "stmt121": true, - "stmt123": true, - "stmt125": true, - "stmt127": true, - "stmt129": true, - "stmt131": true, - "stmt133": true, - "stmt139": true, - "stmt141": true, - "stmt143": true, - "stmt145": true, - "stmt155": true, - "stmt157": true, - "stmt159": true, - "stmt161": true, - "stmt163": true, - "stmt165": true, - "stmt167": true, - "stmt169": true, - "stmt171": true, - "stmt173": true, - "stmt175": true, - "stmt177": true, - "stmt185": true, - "stmt187": true, - "stmt189": true, - "stmt191": true, - "stmt193": true, - "stmt195": true, - "stmt197": true, - "stmt199": true, - "stmt201": true, - "stmt207": true, - "stmt209": true, - "stmt21": true, - "stmt211": true, - "stmt213": true, - "stmt223": true, - "stmt225": true, - "stmt227": true, - "stmt229": true, - "stmt23": true, - "stmt231": true, - "stmt233": true, - "stmt235": true, - "stmt237": true, - "stmt239": true, - "stmt241": true, - "stmt243": true, - "stmt245": true, - "stmt25": true, - "stmt253": true, - "stmt255": true, - "stmt257": true, - "stmt259": true, - "stmt261": true, - "stmt263": true, - "stmt265": true, - "stmt267": true, - "stmt269": true, - "stmt27": true, - "stmt275": true, - "stmt277": true, - "stmt279": true, - "stmt281": true, - "stmt29": true, - "stmt291": true, - "stmt293": true, - "stmt295": true, - "stmt297": true, - "stmt299": true, - "stmt301": true, - "stmt303": true, - "stmt305": true, - "stmt307": true, - "stmt309": true, - "stmt31": true, - "stmt311": true, - "stmt313": true, - "stmt33": true, - "stmt35": true, - "stmt37": true, - "stmt43": true, - "stmt45": true, - "stmt47": true, - "stmt49": true, - "stmt59": true, - "stmt61": true, - "stmt63": true, - "stmt65": true, - "stmt67": true, - "stmt69": true, - "stmt71": true, - "stmt73": true, - "stmt75": true, - "stmt77": true, - "stmt79": true, - "stmt81": true - } -} +{}