jetcrab\parser\literals/
object.rs1use 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}