()
| 157 | } |
| 158 | |
| 159 | func (p *Parser) parseJSONText() *ast.SourceFile { |
| 160 | pos := p.nodePos() |
| 161 | var statements *ast.NodeList |
| 162 | var eof *ast.TokenNode |
| 163 | |
| 164 | if p.token == ast.KindEndOfFile { |
| 165 | statements = p.newNodeList(core.NewTextRange(pos, p.nodePos()), nil) |
| 166 | eof = p.parseTokenNode() |
| 167 | } else { |
| 168 | var expressions any // []*ast.Expression | *ast.Expression |
| 169 | |
| 170 | for p.token != ast.KindEndOfFile { |
| 171 | var expression *ast.Expression |
| 172 | switch p.token { |
| 173 | case ast.KindOpenBracketToken: |
| 174 | expression = p.parseArrayLiteralExpression() |
| 175 | case ast.KindTrueKeyword, ast.KindFalseKeyword, ast.KindNullKeyword: |
| 176 | expression = p.parseTokenNode() |
| 177 | case ast.KindMinusToken: |
| 178 | if p.lookAhead(func(p *Parser) bool { |
| 179 | return p.nextToken() == ast.KindNumericLiteral && p.nextToken() != ast.KindColonToken |
| 180 | }) { |
| 181 | expression = p.parsePrefixUnaryExpression() |
| 182 | } else { |
| 183 | expression = p.parseObjectLiteralExpression() |
| 184 | } |
| 185 | case ast.KindNumericLiteral, ast.KindStringLiteral: |
| 186 | if p.lookAhead(func(p *Parser) bool { return p.nextToken() != ast.KindColonToken }) { |
| 187 | expression = p.parseLiteralExpression(false /*intern*/) |
| 188 | break |
| 189 | } |
| 190 | fallthrough |
| 191 | default: |
| 192 | expression = p.parseObjectLiteralExpression() |
| 193 | } |
| 194 | |
| 195 | // Error recovery: collect multiple top-level expressions |
| 196 | if expressions != nil { |
| 197 | if es, ok := expressions.([]*ast.Expression); ok { |
| 198 | expressions = append(es, expression) |
| 199 | } else { |
| 200 | expressions = []*ast.Expression{expressions.(*ast.Expression), expression} |
| 201 | } |
| 202 | } else { |
| 203 | expressions = expression |
| 204 | if p.token != ast.KindEndOfFile { |
| 205 | p.parseErrorAtCurrentToken(diagnostics.Unexpected_token) |
| 206 | } |
| 207 | } |
| 208 | } |
| 209 | |
| 210 | var expression *ast.Expression |
| 211 | if es, ok := expressions.([]*ast.Expression); ok { |
| 212 | expression = p.finishNode(p.factory.NewArrayLiteralExpression(p.newNodeList(core.NewTextRange(pos, p.nodePos()), es), false), pos) |
| 213 | } else { |
| 214 | expression = expressions.(*ast.Expression) |
| 215 | } |
| 216 | statement := p.finishNode(p.factory.NewExpressionStatement(expression), pos) |
no test coverage detected