zen_expression/parser/
parser.rs

1use crate::functions::{FunctionKind, MethodKind};
2use crate::lexer::{
3    Bracket, ComparisonOperator, Identifier, Operator, QuotationMark, TemplateString, Token,
4    TokenKind,
5};
6use crate::parser::ast::{AstNodeError, Node};
7use crate::parser::error::ParserError;
8use crate::parser::standard::Standard;
9use crate::parser::unary::Unary;
10use crate::parser::NodeMetadata;
11use bumpalo::collections::Vec as BumpVec;
12use bumpalo::Bump;
13use nohash_hasher::BuildNoHashHasher;
14use rust_decimal::Decimal;
15use std::cell::{Cell, RefCell};
16use std::collections::HashMap;
17use std::fmt::Debug;
18use std::marker::PhantomData;
19use std::ops::Deref;
20
21macro_rules! expect {
22    ($self:ident, $token:expr) => {
23        if let Some(error_node) = $self.expect($token) {
24            return error_node;
25        }
26    };
27}
28macro_rules! afmt {
29    ($self:expr, $($arg:tt)*) => {{
30        let formatted = format!($($arg)*);
31        $self.bump.alloc_str(formatted.as_str())
32    }}
33}
34
35#[derive(Debug)]
36pub struct BaseParser;
37
38#[derive(Debug)]
39pub struct Parser<'arena, 'token_ref, Flavor> {
40    tokens: &'token_ref [Token<'arena>],
41    current: Cell<Option<&'token_ref Token<'arena>>>,
42    pub(crate) bump: &'arena Bump,
43    position: Cell<usize>,
44    depth: Cell<u8>,
45    marker_flavor: PhantomData<Flavor>,
46    has_range_operator: bool,
47    pub(crate) node_metadata:
48        Option<RefCell<HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>>>,
49}
50
51impl<'arena, 'token_ref> Parser<'arena, 'token_ref, BaseParser> {
52    pub fn try_new(
53        tokens: &'token_ref [Token<'arena>],
54        bump: &'arena Bump,
55    ) -> Result<Self, ParserError> {
56        let current = tokens.get(0);
57        let has_range_operator = tokens
58            .iter()
59            .any(|t| t.kind == TokenKind::Operator(Operator::Range));
60
61        Ok(Self {
62            tokens,
63            bump,
64            current: Cell::new(current),
65            depth: Cell::new(0),
66            position: Cell::new(0),
67            has_range_operator,
68            node_metadata: None,
69            marker_flavor: PhantomData,
70        })
71    }
72
73    pub fn standard(self) -> Parser<'arena, 'token_ref, Standard> {
74        Parser {
75            tokens: self.tokens,
76            bump: self.bump,
77            current: self.current,
78            depth: self.depth,
79            position: self.position,
80            has_range_operator: self.has_range_operator,
81            node_metadata: self.node_metadata,
82            marker_flavor: PhantomData,
83        }
84    }
85
86    pub fn unary(self) -> Parser<'arena, 'token_ref, Unary> {
87        Parser {
88            tokens: self.tokens,
89            bump: self.bump,
90            current: self.current,
91            depth: self.depth,
92            position: self.position,
93            has_range_operator: self.has_range_operator,
94            node_metadata: self.node_metadata,
95            marker_flavor: PhantomData,
96        }
97    }
98}
99
100impl<'arena, 'token_ref, Flavor> Parser<'arena, 'token_ref, Flavor> {
101    pub fn with_metadata(mut self) -> Parser<'arena, 'token_ref, Flavor> {
102        self.node_metadata = Some(Default::default());
103        self
104    }
105
106    pub(crate) fn current(&self) -> Option<&Token<'arena>> {
107        self.current.get()
108    }
109
110    pub(crate) fn current_kind(&self) -> Option<&TokenKind> {
111        self.current.get().map(|token| &token.kind)
112    }
113
114    fn token_start(&self) -> u32 {
115        match self.current() {
116            None => self.tokens.last().map(|t| t.span.1).unwrap_or_default(),
117            Some(t) => t.span.0,
118        }
119    }
120
121    #[allow(dead_code)]
122    fn token_end(&self) -> u32 {
123        match self.current() {
124            None => self.tokens.last().map(|t| t.span.1).unwrap_or_default(),
125            Some(t) => t.span.1,
126        }
127    }
128
129    pub(crate) fn prev_token_end(&self) -> u32 {
130        let Some(pos) = self.position().checked_sub(1) else {
131            return self.token_start();
132        };
133
134        match self.tokens.get(pos) {
135            None => self.token_start(),
136            Some(t) => t.span.1,
137        }
138    }
139
140    fn position(&self) -> usize {
141        self.position.get()
142    }
143
144    fn set_position(&self, position: usize) -> bool {
145        let target_token = self.tokens.get(position);
146
147        self.position.set(position);
148        self.current.set(target_token);
149
150        target_token.is_some()
151    }
152
153    pub(crate) fn depth(&self) -> u8 {
154        self.depth.get()
155    }
156
157    pub(crate) fn is_done(&self) -> bool {
158        self.current.get().is_none()
159    }
160
161    pub(crate) fn node<F>(&self, node: Node<'arena>, gen_metadata: F) -> &'arena Node<'arena>
162    where
163        F: FnOnce(MetadataHelper<'_, 'arena>) -> NodeMetadata,
164    {
165        let node = self.bump.alloc(node);
166        if let Some(node_metadata) = &self.node_metadata {
167            let metadata = {
168                let nm = node_metadata.borrow();
169                gen_metadata(MetadataHelper {
170                    node_metadata: nm.deref(),
171                    arena: PhantomData::<&'arena ()>,
172                })
173            };
174
175            let mut nm = node_metadata.borrow_mut();
176            nm.insert(node as *const Node as usize, metadata);
177        };
178
179        node
180    }
181
182    pub(crate) fn error(&self, error: AstNodeError<'arena>) -> &'arena Node<'arena> {
183        self.node(Node::Error { error, node: None }, |_| NodeMetadata {
184            span: (self.prev_token_end(), self.prev_token_end()),
185        })
186    }
187
188    pub(crate) fn error_with_node(
189        &self,
190        error: AstNodeError<'arena>,
191        node: &'arena Node<'arena>,
192    ) -> &'arena Node<'arena> {
193        self.node(
194            Node::Error {
195                error,
196                node: Some(node),
197            },
198            |_| NodeMetadata {
199                span: node.span().unwrap_or_default(),
200            },
201        )
202    }
203
204    pub(crate) fn next(&self) {
205        let new_position = self.position.get() + 1;
206
207        self.position.set(new_position);
208        self.current.set(self.tokens.get(new_position));
209    }
210
211    pub(crate) fn expect(&self, kind: TokenKind) -> Option<&'arena Node<'arena>> {
212        let token = self.current();
213        if token.is_some_and(|t| t.kind == kind) {
214            self.next();
215            return None;
216        }
217
218        Some(
219            self.error(AstNodeError::UnexpectedToken {
220                expected: afmt!(self, "{kind}"),
221                received: token
222                    .map(|t| afmt!(self, "{}", t.kind))
223                    .unwrap_or_else(|| afmt!(self, "None")),
224                span: token
225                    .map(|t| t.span)
226                    .unwrap_or((self.token_end(), self.token_end())),
227            }),
228        )
229    }
230
231    pub(crate) fn number(&self) -> &'arena Node<'arena> {
232        let Some(token) = self.current() else {
233            return self.error(AstNodeError::MissingToken {
234                expected: afmt!(self, "Number"),
235                position: self.position(),
236            });
237        };
238
239        let Ok(decimal) =
240            Decimal::from_str_exact(token.value).or_else(|_| Decimal::from_scientific(token.value))
241        else {
242            return self.error(AstNodeError::InvalidNumber {
243                number: afmt!(self, "{}", token.value),
244                span: token.span,
245            });
246        };
247
248        self.next();
249        self.node(Node::Number(decimal), |_| NodeMetadata { span: token.span })
250    }
251
252    pub(crate) fn bool(&self) -> &'arena Node<'arena> {
253        let Some(token) = self.current() else {
254            return self.error(AstNodeError::MissingToken {
255                expected: afmt!(self, "Boolean"),
256                position: self.position(),
257            });
258        };
259
260        let TokenKind::Boolean(boolean) = token.kind else {
261            return self.error(AstNodeError::InvalidBoolean {
262                boolean: afmt!(self, "{}", token.value),
263                span: token.span,
264            });
265        };
266
267        self.next();
268        self.node(Node::Bool(boolean), |_| NodeMetadata { span: token.span })
269    }
270
271    pub(crate) fn null(&self) -> &'arena Node<'arena> {
272        let Some(token) = self.current() else {
273            return self.error(AstNodeError::MissingToken {
274                expected: afmt!(self, "Null"),
275                position: self.position(),
276            });
277        };
278
279        if token.kind != TokenKind::Identifier(Identifier::Null) {
280            return self.error(AstNodeError::UnexpectedIdentifier {
281                expected: afmt!(self, "Null"),
282                received: afmt!(self, "{}", token.value),
283                span: token.span,
284            });
285        }
286
287        self.next();
288        self.node(Node::Null, |_| NodeMetadata { span: token.span })
289    }
290
291    pub(crate) fn simple_string(&self, quote_mark: &QuotationMark) -> &'arena Node<'arena> {
292        expect!(self, TokenKind::QuotationMark(quote_mark.clone()));
293        let string_value = self.current();
294
295        let error_literal = self.expect(TokenKind::Literal);
296        let error_mark_end = self.expect(TokenKind::QuotationMark(quote_mark.clone()));
297
298        error_literal
299            .or(error_mark_end)
300            .or(string_value.map(|t| {
301                self.node(Node::String(t.value), |_| NodeMetadata {
302                    span: (t.span.0 - 1, t.span.1 + 1),
303                })
304            }))
305            .unwrap_or_else(|| {
306                self.error(AstNodeError::Custom {
307                    message: afmt!(
308                        self,
309                        "Failed to parse string `{}`",
310                        string_value.map(|s| s.value).unwrap_or_default()
311                    ),
312                    span: string_value
313                        .map(|s| s.span)
314                        .unwrap_or((self.prev_token_end(), self.prev_token_end())),
315                })
316            })
317    }
318
319    pub(crate) fn template_string<F>(&self, expression_parser: F) -> &'arena Node<'arena>
320    where
321        F: Fn(ParserContext) -> &'arena Node<'arena>,
322    {
323        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
324
325        let Some(mut current_token) = self.current() else {
326            return self.error(AstNodeError::MissingToken {
327                expected: afmt!(self, "Backtick (`)"),
328                position: self.position(),
329            });
330        };
331
332        let mut span = (current_token.span.0 - 1, 0u32);
333
334        let mut nodes = BumpVec::new_in(self.bump);
335        while TokenKind::QuotationMark(QuotationMark::Backtick) != current_token.kind {
336            match current_token.kind {
337                TokenKind::TemplateString(template) => match template {
338                    TemplateString::ExpressionStart => {
339                        self.next();
340                        nodes.push(expression_parser(ParserContext::Global));
341
342                        if let Some(error) =
343                            self.expect(TokenKind::TemplateString(TemplateString::ExpressionEnd))
344                        {
345                            nodes.push(error);
346                        }
347                    }
348                    TemplateString::ExpressionEnd => {
349                        self.next();
350                    }
351                },
352                TokenKind::Literal => {
353                    nodes.push(
354                        self.node(Node::String(current_token.value), |_| NodeMetadata {
355                            span: current_token.span,
356                        }),
357                    );
358                    self.next();
359                }
360                _ => {
361                    return self.error(AstNodeError::UnexpectedToken {
362                        expected: afmt!(self, "Valid TemplateString token"),
363                        received: afmt!(self, "{}", current_token.kind),
364                        span: current_token.span,
365                    })
366                }
367            }
368
369            if let Some(ct) = self.current() {
370                current_token = ct;
371                span.1 = ct.span.1;
372            } else {
373                break;
374            }
375        }
376
377        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
378        self.node(Node::TemplateString(nodes.into_bump_slice()), |_| {
379            NodeMetadata { span }
380        })
381    }
382
383    pub(crate) fn method_call<F>(
384        &self,
385        node: &'arena Node,
386        method_name: &Token,
387        expression_parser: F,
388    ) -> &'arena Node<'arena>
389    where
390        F: Fn(ParserContext) -> &'arena Node<'arena>,
391    {
392        let Some(method_kind) = MethodKind::try_from(method_name.value).ok() else {
393            return self.error(AstNodeError::UnknownMethod {
394                name: afmt!(self, "{}", method_name.value),
395                span: method_name.span,
396            });
397        };
398
399        expect!(self, TokenKind::Bracket(Bracket::LeftParenthesis));
400
401        let mut arguments = BumpVec::new_in(&self.bump);
402        loop {
403            if self.current_kind() == Some(&TokenKind::Bracket(Bracket::RightParenthesis)) {
404                break;
405            }
406
407            arguments.push(expression_parser(ParserContext::Global));
408            if self.current_kind() != Some(&TokenKind::Operator(Operator::Comma)) {
409                break;
410            }
411
412            if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
413                arguments.push(error);
414                break;
415            }
416        }
417
418        if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
419            arguments.push(error);
420        }
421
422        let method_node = self.node(
423            Node::MethodCall {
424                this: node,
425                kind: method_kind,
426                arguments: arguments.into_bump_slice(),
427            },
428            |h| NodeMetadata {
429                span: (
430                    h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
431                    self.prev_token_end(),
432                ),
433            },
434        );
435
436        self.with_postfix(method_node, expression_parser)
437    }
438
439    pub(crate) fn with_postfix<F>(
440        &self,
441        node: &'arena Node<'arena>,
442        expression_parser: F,
443    ) -> &'arena Node<'arena>
444    where
445        F: Fn(ParserContext) -> &'arena Node<'arena>,
446    {
447        let Some(postfix_token) = self.current() else {
448            return node;
449        };
450
451        let postfix_kind = PostfixKind::from(postfix_token);
452
453        let processed_token = match postfix_kind {
454            PostfixKind::Other => return node,
455            PostfixKind::MemberAccess => {
456                self.next();
457                let property_token = self.current();
458                self.next();
459
460                let property = match property_token {
461                    None => self.error_with_node(
462                        AstNodeError::Custom {
463                            message: afmt!(self, "Expected a property"),
464                            span: (self.prev_token_end(), self.prev_token_end()),
465                        },
466                        node,
467                    ),
468                    Some(t) => match is_valid_property(t) {
469                        true => {
470                            if self.current_kind()
471                                == Some(&TokenKind::Bracket(Bracket::LeftParenthesis))
472                            {
473                                return self.method_call(node, t, expression_parser);
474                            }
475
476                            self.node(Node::String(t.value), |_| NodeMetadata { span: t.span })
477                        }
478                        false => {
479                            self.set_position(self.position() - 1);
480                            self.error_with_node(
481                                AstNodeError::InvalidProperty {
482                                    property: afmt!(self, "{}", t.value),
483                                    span: t.span,
484                                },
485                                node,
486                            )
487                        }
488                    },
489                };
490
491                self.node(Node::Member { node, property }, |h| NodeMetadata {
492                    span: h.span(node, property).unwrap_or_default(),
493                })
494            }
495            PostfixKind::PropertyAccess => {
496                self.next();
497                let mut from: Option<&'arena Node<'arena>> = None;
498                let mut to: Option<&'arena Node<'arena>> = None;
499
500                let Some(mut c) = self.current() else {
501                    return self.error_with_node(
502                        AstNodeError::Custom {
503                            message: afmt!(self, "Expected a property"),
504                            span: (self.prev_token_end(), self.prev_token_end()),
505                        },
506                        node,
507                    );
508                };
509
510                if c.kind == TokenKind::Operator(Operator::Slice) {
511                    self.next();
512
513                    let Some(cc) = self.current() else {
514                        return self.error_with_node(
515                            AstNodeError::Custom {
516                                message: afmt!(self, "Unexpected token"),
517                                span: (self.prev_token_end(), self.prev_token_end()),
518                            },
519                            node,
520                        );
521                    };
522                    c = cc;
523
524                    if c.kind != TokenKind::Bracket(Bracket::RightSquareBracket) {
525                        to = Some(expression_parser(ParserContext::Global));
526                    }
527
528                    expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
529                    self.node(Node::Slice { node, to, from }, |h| NodeMetadata {
530                        span: (
531                            h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
532                            self.prev_token_end(),
533                        ),
534                    })
535                } else {
536                    let from_node = expression_parser(ParserContext::Global);
537                    from = Some(from_node);
538                    let Some(cc) = self.current() else {
539                        return self.error_with_node(
540                            AstNodeError::Custom {
541                                message: afmt!(self, "Unexpected token"),
542                                span: (self.prev_token_end(), self.prev_token_end()),
543                            },
544                            self.node(
545                                Node::Member {
546                                    node,
547                                    property: from_node,
548                                },
549                                |h| NodeMetadata {
550                                    span: h.span(node, from_node).unwrap_or_default(),
551                                },
552                            ),
553                        );
554                    };
555                    c = cc;
556
557                    if c.kind == TokenKind::Operator(Operator::Slice) {
558                        self.next();
559                        let Some(cc) = self.current() else {
560                            return self.error_with_node(
561                                AstNodeError::Custom {
562                                    message: afmt!(self, "Invalid slice syntax"),
563                                    span: (self.prev_token_end(), self.prev_token_end()),
564                                },
565                                self.node(Node::Slice { node, from, to }, |h| NodeMetadata {
566                                    span: h.span(node, from_node).unwrap_or_default(),
567                                }),
568                            );
569                        };
570                        c = cc;
571
572                        if c.kind != TokenKind::Bracket(Bracket::RightSquareBracket) {
573                            to = Some(expression_parser(ParserContext::Global));
574                        }
575
576                        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
577                        self.node(Node::Slice { node, from, to }, |h| NodeMetadata {
578                            span: (
579                                h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
580                                self.prev_token_end(),
581                            ),
582                        })
583                    } else {
584                        // Slice operator [:] was not found,
585                        // it should be just an index node.
586                        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
587                        self.node(
588                            Node::Member {
589                                node,
590                                property: from.unwrap_or_else(|| {
591                                    return self.error_with_node(
592                                        AstNodeError::Custom {
593                                            message: afmt!(self, "Invalid index property"),
594                                            span: (self.prev_token_end(), self.prev_token_end()),
595                                        },
596                                        node,
597                                    );
598                                }),
599                            },
600                            |h| NodeMetadata {
601                                span: (
602                                    h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
603                                    self.prev_token_end(),
604                                ),
605                            },
606                        )
607                    }
608                }
609            }
610        };
611
612        self.with_postfix(processed_token, expression_parser)
613    }
614
615    /// Closure
616    pub(crate) fn closure<F>(&self, expression_parser: F) -> &'arena Node<'arena>
617    where
618        F: Fn(ParserContext) -> &'arena Node<'arena>,
619    {
620        let start = self.token_start();
621
622        self.depth.set(self.depth.get() + 1);
623        let node = expression_parser(ParserContext::Closure);
624        self.depth.set(self.depth.get() - 1);
625
626        self.node(Node::Closure(node), |_| NodeMetadata {
627            span: (start, self.prev_token_end()),
628        })
629    }
630
631    /// Identifier expression
632    /// Either <Identifier> or <Identifier Expression>
633    pub(crate) fn identifier<F>(&self, expression_parser: F) -> &'arena Node<'arena>
634    where
635        F: Fn(ParserContext) -> &'arena Node<'arena>,
636    {
637        let Some(token) = self.current() else {
638            return self.error(AstNodeError::MissingToken {
639                expected: afmt!(self, "Identifier"),
640                position: self.position(),
641            });
642        };
643
644        match token.kind {
645            TokenKind::Identifier(_) | TokenKind::Literal => {
646                // ok
647            }
648            _ => {
649                return self.error(AstNodeError::Custom {
650                    message: afmt!(self, "Expected an `identifier`, received `{}`.", token.kind),
651                    span: token.span,
652                });
653            }
654        }
655
656        let Some(identifier_token) = self.current() else {
657            return self.error(AstNodeError::Custom {
658                message: afmt!(self, "Expected an `identifier`."),
659                span: (self.prev_token_end(), self.prev_token_end()),
660            });
661        };
662        self.next();
663
664        let current_token = self.current();
665        if current_token.map(|t| t.kind) != Some(TokenKind::Bracket(Bracket::LeftParenthesis)) {
666            let identifier_node = match identifier_token.kind {
667                TokenKind::Identifier(Identifier::RootReference) => {
668                    self.node(Node::Root, |_| NodeMetadata {
669                        span: identifier_token.span,
670                    })
671                }
672                _ => self.node(Node::Identifier(identifier_token.value), |_| NodeMetadata {
673                    span: identifier_token.span,
674                }),
675            };
676
677            return self.with_postfix(identifier_node, expression_parser);
678        }
679
680        // Potentially it might be a built-in expression
681        let Ok(function) = FunctionKind::try_from(identifier_token.value) else {
682            return self.error(AstNodeError::UnknownBuiltIn {
683                name: afmt!(self, "{}", identifier_token.value),
684                span: identifier_token.span,
685            });
686        };
687
688        self.next();
689        let function_node = match function {
690            FunctionKind::Closure(_) => {
691                let mut arguments = BumpVec::new_in(&self.bump);
692
693                arguments.push(expression_parser(ParserContext::Global));
694                if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
695                    arguments.push(error);
696                };
697
698                arguments.push(self.closure(&expression_parser));
699                if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
700                    arguments.push(error);
701                }
702
703                Node::FunctionCall {
704                    kind: function,
705                    arguments: self.bump.alloc_slice_copy(arguments.into_bump_slice()),
706                }
707            }
708            _ => {
709                let mut arguments = BumpVec::new_in(&self.bump);
710                loop {
711                    if self.current_kind() == Some(&TokenKind::Bracket(Bracket::RightParenthesis)) {
712                        break;
713                    }
714
715                    arguments.push(expression_parser(ParserContext::Global));
716                    if self.current_kind() != Some(&TokenKind::Operator(Operator::Comma)) {
717                        break;
718                    }
719
720                    if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
721                        arguments.push(error);
722                        break;
723                    }
724                }
725
726                if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
727                    arguments.push(error);
728                }
729
730                Node::FunctionCall {
731                    kind: function,
732                    arguments: arguments.into_bump_slice(),
733                }
734            }
735        };
736
737        self.with_postfix(
738            self.node(function_node, |_| NodeMetadata {
739                span: (identifier_token.span.0, self.prev_token_end()),
740            }),
741            expression_parser,
742        )
743    }
744
745    /// Interval node
746    pub(crate) fn interval<F>(&self, expression_parser: F) -> Option<&'arena Node<'arena>>
747    where
748        F: Fn(ParserContext) -> &'arena Node<'arena>,
749    {
750        // Performance optimisation: skip if expression does not contain an interval for faster evaluation
751        if !self.has_range_operator {
752            return None;
753        }
754
755        let TokenKind::Bracket(_) = &self.current()?.kind else {
756            return None;
757        };
758
759        let initial_position = self.position();
760        let TokenKind::Bracket(left_bracket) = &self.current()?.kind else {
761            self.set_position(initial_position);
762            return None;
763        };
764
765        self.next();
766        let left = expression_parser(ParserContext::Global);
767        if left.has_error() {
768            self.set_position(initial_position);
769            return None;
770        };
771
772        if let Some(_) = self.expect(TokenKind::Operator(Operator::Range)) {
773            self.set_position(initial_position);
774            return None;
775        };
776
777        let right = expression_parser(ParserContext::Global);
778        if right.has_error() {
779            self.set_position(initial_position);
780            return None;
781        };
782
783        let TokenKind::Bracket(right_bracket) = &self.current()?.kind else {
784            self.set_position(initial_position);
785            return None;
786        };
787
788        self.next();
789
790        let interval_node = self.node(
791            Node::Interval {
792                left,
793                right,
794                left_bracket: *left_bracket,
795                right_bracket: *right_bracket,
796            },
797            |_| NodeMetadata {
798                span: (initial_position as u32, self.position() as u32),
799            },
800        );
801
802        Some(self.with_postfix(interval_node, expression_parser))
803    }
804
805    /// Array nodes
806    pub(crate) fn array<F>(&self, expression_parser: F) -> &'arena Node<'arena>
807    where
808        F: Fn(ParserContext) -> &'arena Node<'arena>,
809    {
810        let Some(current_token) = self.current() else {
811            return self.error(AstNodeError::MissingToken {
812                expected: afmt!(self, "Array"),
813                position: self.position(),
814            });
815        };
816
817        if current_token.kind != TokenKind::Bracket(Bracket::LeftSquareBracket) {
818            return self.error(AstNodeError::UnexpectedToken {
819                expected: afmt!(self, "{}", TokenKind::Bracket(Bracket::LeftSquareBracket)),
820                received: afmt!(self, "{}", current_token.kind),
821                span: current_token.span,
822            });
823        }
824
825        self.next();
826        let mut nodes = BumpVec::new_in(self.bump);
827        while !(self.current().map(|t| t.kind)
828            == Some(TokenKind::Bracket(Bracket::RightSquareBracket)))
829        {
830            if !nodes.is_empty() {
831                expect!(self, TokenKind::Operator(Operator::Comma));
832                if self.current().map(|t| t.kind)
833                    == Some(TokenKind::Bracket(Bracket::RightSquareBracket))
834                {
835                    break;
836                }
837            }
838
839            nodes.push(expression_parser(ParserContext::Global));
840        }
841
842        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
843
844        let node = Node::Array(nodes.into_bump_slice());
845
846        self.with_postfix(
847            self.node(node, |_| NodeMetadata {
848                span: (current_token.span.0, self.prev_token_end()),
849            }),
850            expression_parser,
851        )
852    }
853
854    pub(crate) fn object<F>(&self, expression_parser: F) -> &'arena Node<'arena>
855    where
856        F: Fn(ParserContext) -> &'arena Node<'arena>,
857    {
858        let span_start = self.token_start();
859        expect!(self, TokenKind::Bracket(Bracket::LeftCurlyBracket));
860
861        let mut key_value_pairs = BumpVec::new_in(self.bump);
862        if let Some(TokenKind::Bracket(Bracket::RightCurlyBracket)) = self.current().map(|t| t.kind)
863        {
864            self.next();
865            return self.node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
866                NodeMetadata {
867                    span: (span_start, self.prev_token_end()),
868                }
869            });
870        }
871
872        loop {
873            let key = self.object_key(&expression_parser);
874            expect!(self, TokenKind::Operator(Operator::Slice));
875            let value = expression_parser(ParserContext::Global);
876
877            key_value_pairs.push((key, value));
878
879            let Some(current_token) = self.current() else {
880                break;
881            };
882
883            match current_token.kind {
884                TokenKind::Operator(Operator::Comma) => {
885                    expect!(self, TokenKind::Operator(Operator::Comma));
886                }
887                TokenKind::Bracket(Bracket::RightCurlyBracket) => break,
888                _ => {
889                    return self.error(AstNodeError::Custom {
890                        message: afmt!(self, "Invalid object syntax"),
891                        span: current_token.span,
892                    })
893                }
894            }
895        }
896
897        if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightCurlyBracket)) {
898            key_value_pairs.push((
899                self.node(Node::Null, |_| NodeMetadata {
900                    span: error.span().unwrap_or_default(),
901                }),
902                error,
903            ));
904        };
905
906        self.node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
907            NodeMetadata {
908                span: (span_start, self.prev_token_end()),
909            }
910        })
911    }
912
913    pub(crate) fn object_key<F>(&self, expression_parser: F) -> &'arena Node<'arena>
914    where
915        F: Fn(ParserContext) -> &'arena Node<'arena>,
916    {
917        let Some(key_token) = self.current() else {
918            return self.error(AstNodeError::Custom {
919                message: afmt!(self, "Expected an object key"),
920                span: (self.prev_token_end(), self.prev_token_end()),
921            });
922        };
923
924        let key = match key_token.kind {
925            TokenKind::Identifier(identifier) => {
926                self.next();
927                self.node(Node::String(identifier.into()), |_| NodeMetadata {
928                    span: key_token.span,
929                })
930            }
931            TokenKind::Boolean(boolean) => match boolean {
932                true => {
933                    self.next();
934                    self.node(Node::String("true"), |_| NodeMetadata {
935                        span: key_token.span,
936                    })
937                }
938                false => {
939                    self.next();
940                    self.node(Node::String("false"), |_| NodeMetadata {
941                        span: key_token.span,
942                    })
943                }
944            },
945            TokenKind::Number => {
946                self.next();
947                self.node(Node::String(key_token.value), |_| NodeMetadata {
948                    span: key_token.span,
949                })
950            }
951            TokenKind::Literal => {
952                self.next();
953                self.node(Node::String(key_token.value), |_| NodeMetadata {
954                    span: key_token.span,
955                })
956            }
957            TokenKind::Bracket(bracket) => match bracket {
958                Bracket::LeftSquareBracket => {
959                    expect!(self, TokenKind::Bracket(Bracket::LeftSquareBracket));
960                    let token = expression_parser(ParserContext::Global);
961                    expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
962
963                    token
964                }
965                _ => {
966                    return self.error(AstNodeError::Custom {
967                        message: afmt!(self, "Operator is not supported as object key"),
968                        span: key_token.span,
969                    })
970                }
971            },
972            TokenKind::QuotationMark(qm) => match qm {
973                QuotationMark::SingleQuote => self.simple_string(&QuotationMark::SingleQuote),
974                QuotationMark::DoubleQuote => self.simple_string(&QuotationMark::DoubleQuote),
975                QuotationMark::Backtick => {
976                    return self.error(AstNodeError::Custom {
977                        message: afmt!(
978                            self,
979                            "TemplateString expression not supported as object key"
980                        ),
981                        span: key_token.span,
982                    })
983                }
984            },
985            TokenKind::TemplateString(_) => {
986                return self.error(AstNodeError::Custom {
987                    message: afmt!(
988                        self,
989                        "TemplateString expression not supported as object key"
990                    ),
991                    span: key_token.span,
992                })
993            }
994            TokenKind::Operator(_) => {
995                return self.error(AstNodeError::Custom {
996                    message: afmt!(self, "Operator is not supported as object key"),
997                    span: key_token.span,
998                })
999            }
1000        };
1001
1002        key
1003    }
1004
1005    /// Conditional
1006    /// condition_node ? on_true : on_false
1007    pub(crate) fn conditional<F>(
1008        &self,
1009        condition: &'arena Node<'arena>,
1010        expression_parser: F,
1011    ) -> Option<&'arena Node<'arena>>
1012    where
1013        F: Fn(ParserContext) -> &'arena Node<'arena>,
1014    {
1015        let Some(current_token) = self.current() else {
1016            return None;
1017        };
1018        if current_token.kind != TokenKind::Operator(Operator::QuestionMark) {
1019            return None;
1020        }
1021
1022        self.next();
1023
1024        let on_true = expression_parser(ParserContext::Global);
1025        if let Some(error_node) = self.expect(TokenKind::Operator(Operator::Slice)) {
1026            return Some(error_node);
1027        }
1028
1029        let on_false = expression_parser(ParserContext::Global);
1030
1031        let conditional_node = Node::Conditional {
1032            condition,
1033            on_true,
1034            on_false,
1035        };
1036
1037        Some(self.node(conditional_node, |_| NodeMetadata {
1038            span: (current_token.span.0, self.prev_token_end()),
1039        }))
1040    }
1041
1042    /// Literal - number, string, array etc.
1043    pub(crate) fn literal<F>(&self, expression_parser: F) -> &'arena Node<'arena>
1044    where
1045        F: Fn(ParserContext) -> &'arena Node<'arena>,
1046    {
1047        let Some(current_token) = self.current() else {
1048            return self.error(AstNodeError::Custom {
1049                message: afmt!(self, "Expected a literal"),
1050                span: (self.prev_token_end(), self.prev_token_end()),
1051            });
1052        };
1053
1054        match &current_token.kind {
1055            TokenKind::Identifier(identifier) => match identifier {
1056                Identifier::Null => self.null(),
1057                _ => self.identifier(&expression_parser),
1058            },
1059            TokenKind::Literal => self.identifier(&expression_parser),
1060            TokenKind::Boolean(_) => self.bool(),
1061            TokenKind::Number => self.number(),
1062            TokenKind::QuotationMark(quote_mark) => match quote_mark {
1063                QuotationMark::SingleQuote | QuotationMark::DoubleQuote => {
1064                    self.simple_string(quote_mark)
1065                }
1066                QuotationMark::Backtick => self.template_string(&expression_parser),
1067            },
1068            TokenKind::Bracket(bracket) => match bracket {
1069                Bracket::LeftParenthesis
1070                | Bracket::RightParenthesis
1071                | Bracket::RightSquareBracket => {
1072                    self.interval(&expression_parser).unwrap_or_else(|| {
1073                        self.error(AstNodeError::Custom {
1074                            message: afmt!(self, "Invalid syntax"),
1075                            span: (self.prev_token_end(), self.prev_token_end()),
1076                        })
1077                    })
1078                }
1079                Bracket::LeftSquareBracket => self
1080                    .interval(&expression_parser)
1081                    .unwrap_or_else(|| self.array(&expression_parser)),
1082                Bracket::LeftCurlyBracket => self.object(&expression_parser),
1083                Bracket::RightCurlyBracket => self.error(AstNodeError::Custom {
1084                    message: afmt!(self, "Unexpected RightCurlyBracket token"),
1085                    span: current_token.span,
1086                }),
1087            },
1088            TokenKind::Operator(_) => self.error(AstNodeError::Custom {
1089                message: afmt!(self, "Unexpected Operator token"),
1090                span: current_token.span,
1091            }),
1092            TokenKind::TemplateString(_) => self.error(AstNodeError::Custom {
1093                message: afmt!(self, "Unexpected TemplateString token"),
1094                span: current_token.span,
1095            }),
1096        }
1097    }
1098}
1099
1100fn is_valid_property(token: &Token) -> bool {
1101    match &token.kind {
1102        TokenKind::Identifier(_) => true,
1103        TokenKind::Literal => true,
1104        TokenKind::Operator(operator) => match operator {
1105            Operator::Logical(_) => true,
1106            Operator::Comparison(comparison) => matches!(comparison, ComparisonOperator::In),
1107            _ => false,
1108        },
1109        _ => false,
1110    }
1111}
1112
1113#[derive(Debug)]
1114enum PostfixKind {
1115    MemberAccess,
1116    PropertyAccess,
1117    Other,
1118}
1119
1120impl From<&Token<'_>> for PostfixKind {
1121    fn from(token: &Token) -> Self {
1122        match &token.kind {
1123            TokenKind::Bracket(Bracket::LeftSquareBracket) => Self::PropertyAccess,
1124            TokenKind::Operator(Operator::Dot) => Self::MemberAccess,
1125            _ => Self::Other,
1126        }
1127    }
1128}
1129
1130pub(crate) struct MetadataHelper<'a, 'arena> {
1131    node_metadata: &'a HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>,
1132    arena: PhantomData<&'arena ()>,
1133}
1134
1135impl<'a, 'arena> MetadataHelper<'a, 'arena> {
1136    pub(crate) fn span(
1137        &self,
1138        left: &'arena Node<'arena>,
1139        right: &'arena Node<'arena>,
1140    ) -> Option<(u32, u32)> {
1141        Some((self.metadata(left)?.span.0, self.metadata(right)?.span.1))
1142    }
1143
1144    pub(crate) fn metadata(&self, n: &'arena Node<'arena>) -> Option<&NodeMetadata> {
1145        self.node_metadata.get(&self.address(n))
1146    }
1147
1148    fn address(&self, n: &'arena Node<'arena>) -> usize {
1149        n as *const Node as usize
1150    }
1151}
1152
1153#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1154pub(crate) enum ParserContext {
1155    Global,
1156    Closure,
1157}