(pos Pos)
| 2246 | } |
| 2247 | |
| 2248 | func (p *Parser) parseDictionaryArgExpr(pos Pos) (*DictionaryArgExpr, error) { |
| 2249 | name, err := p.parseIdent() |
| 2250 | if err != nil { |
| 2251 | return nil, err |
| 2252 | } |
| 2253 | |
| 2254 | var value Expr |
| 2255 | // Parse the value part |
| 2256 | switch { |
| 2257 | case p.matchTokenKind(TokenKindString): |
| 2258 | literal, err := p.parseLiteral(p.Pos()) |
| 2259 | if err != nil { |
| 2260 | return nil, err |
| 2261 | } |
| 2262 | value = literal |
| 2263 | case p.matchTokenKind(TokenKindInt), p.matchTokenKind(TokenKindFloat): |
| 2264 | literal, err := p.parseLiteral(p.Pos()) |
| 2265 | if err != nil { |
| 2266 | return nil, err |
| 2267 | } |
| 2268 | value = literal |
| 2269 | case p.matchTokenKind(TokenKindIdent): |
| 2270 | ident, err := p.parseIdent() |
| 2271 | if err != nil { |
| 2272 | return nil, err |
| 2273 | } |
| 2274 | // Check if it's followed by optional parentheses |
| 2275 | if p.matchTokenKind(TokenKindLParen) { |
| 2276 | _ = p.lexer.consumeToken() // consume ( |
| 2277 | if err := p.expectTokenKind(TokenKindRParen); err != nil { |
| 2278 | return nil, err |
| 2279 | } |
| 2280 | value = &FunctionExpr{ |
| 2281 | Name: ident, |
| 2282 | } |
| 2283 | } else { |
| 2284 | value = ident |
| 2285 | } |
| 2286 | default: |
| 2287 | return nil, fmt.Errorf("expected identifier, string or number in dictionary argument, got %s", p.lastTokenKind()) |
| 2288 | } |
| 2289 | |
| 2290 | return &DictionaryArgExpr{ |
| 2291 | ArgPos: pos, |
| 2292 | Name: name, |
| 2293 | Value: value, |
| 2294 | }, nil |
| 2295 | } |
| 2296 | |
| 2297 | func (p *Parser) parseDictionaryLifetimeClause(pos Pos) (*DictionaryLifetimeClause, error) { |
| 2298 | if err := p.expectKeyword(KeywordLifetime); err != nil { |
no test coverage detected