Coverage Report

Created: 2025-09-05 15:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/noah/src/ruchy/src/frontend/parser/types.rs
Line
Count
Source
1
//! Type-related parsing - minimal version with only used functions
2
3
use super::{ParserState, *};
4
5
1
pub fn parse_struct_literal(
6
1
    state: &mut ParserState,
7
1
    name: String,
8
1
    start_span: Span,
9
1
) -> Result<Expr> {
10
1
    state.tokens.expect(&Token::LeftBrace)
?0
;
11
12
1
    let mut fields = Vec::new();
13
2
    while !matches!(state.tokens.peek(), Some((Token::RightBrace, _))) {
14
        // Parse field name
15
2
        let field_name = if let Some((Token::Identifier(name), _)) = state.tokens.peek() {
16
2
            let name = name.clone();
17
2
            state.tokens.advance();
18
2
            name
19
        } else {
20
0
            bail!("Expected field name");
21
        };
22
23
        // Parse colon and value
24
2
        state.tokens.expect(&Token::Colon)
?0
;
25
2
        let value = super::parse_expr_recursive(state)
?0
;
26
27
2
        fields.push((field_name, value));
28
29
        // Handle comma or end of struct literal
30
2
        if 
matches!1
(state.tokens.peek(), Some((Token::Comma, _))) {
31
1
            state.tokens.advance();
32
1
        } else {
33
1
            break;
34
        }
35
    }
36
37
1
    state.tokens.expect(&Token::RightBrace)
?0
;
38
39
1
    Ok(Expr::new(
40
1
        ExprKind::StructLiteral { name, fields },
41
1
        start_span,
42
1
    ))
43
1
}