jetcrab\parser\literals/
class.rs

1use crate::ast::{ClassExpression, Node};
2use crate::lexer::TokenKind;
3use crate::parser::error::ParseResult;
4use crate::parser::Parser;
5
6impl Parser {
7    pub fn parse_class_expression(&mut self) -> ParseResult<Node> {
8        self.advance();
9
10        let id = if self.check_identifier() {
11            Some(Box::new(self.parse_identifier()?))
12        } else {
13            None
14        };
15
16        let super_class = if let Some(token) = &self.current {
17            if let TokenKind::Keyword(kw) = &token.kind {
18                if kw == "extends" {
19                    self.advance();
20                    Some(Box::new(self.parse_expression()?))
21                } else {
22                    None
23                }
24            } else {
25                None
26            }
27        } else {
28            None
29        };
30
31        let body = Box::new(self.parse_class_body()?);
32
33        let span = self.create_span_from_tokens();
34        Ok(Node::ClassExpression(ClassExpression {
35            id,
36            super_class,
37            body,
38            span: Some(span),
39        }))
40    }
41}