jetcrab\parser\literals/
object.rs

1use crate::ast::{Node, ObjectLiteral, Property};
2use crate::lexer::TokenKind;
3use crate::parser::error::{ParseResult, ParserError};
4use crate::parser::Parser;
5
6impl Parser {
7    pub fn parse_object_literal(&mut self) -> ParseResult<Node> {
8        self.advance();
9
10        let mut properties = Vec::new();
11
12        while !self.check(TokenKind::RightBrace) && !self.is_eof() {
13            properties.push(self.parse_property()?);
14
15            if self.check(TokenKind::Comma) {
16                self.advance();
17            }
18        }
19
20        self.expect(TokenKind::RightBrace)?;
21
22        let span = self.create_span_from_tokens();
23        Ok(Node::ObjectLiteral(ObjectLiteral {
24            properties,
25            span: Some(span),
26        }))
27    }
28
29    pub fn parse_property(&mut self) -> ParseResult<Node> {
30        let key = if self.check_identifier() {
31            Box::new(self.parse_identifier()?)
32        } else if let Some(token) = &self.current {
33            if let TokenKind::String(_) = &token.kind {
34                Box::new(self.parse_primary_expression()?)
35            } else {
36                return Err(ParserError::invalid_syntax(
37                    "Expected identifier or string literal",
38                    self.current_position().unwrap_or_default(),
39                ));
40            }
41        } else {
42            return Err(ParserError::unexpected_end_of_input(None));
43        };
44
45        self.expect(TokenKind::Colon)?;
46        let value = Box::new(self.parse_expression()?);
47
48        let span = self.create_span_from_tokens();
49        Ok(Node::Property(Property {
50            key,
51            value,
52            kind: "init".to_string(),
53            computed: false,
54            method: false,
55            shorthand: false,
56            span: Some(span),
57        }))
58    }
59}