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) = Decimal::from_str_exact(token.value) else {
240            return self.error(AstNodeError::InvalidNumber {
241                number: afmt!(self, "{}", token.value),
242                span: token.span,
243            });
244        };
245
246        self.next();
247        self.node(Node::Number(decimal), |_| NodeMetadata { span: token.span })
248    }
249
250    pub(crate) fn bool(&self) -> &'arena Node<'arena> {
251        let Some(token) = self.current() else {
252            return self.error(AstNodeError::MissingToken {
253                expected: afmt!(self, "Boolean"),
254                position: self.position(),
255            });
256        };
257
258        let TokenKind::Boolean(boolean) = token.kind else {
259            return self.error(AstNodeError::InvalidBoolean {
260                boolean: afmt!(self, "{}", token.value),
261                span: token.span,
262            });
263        };
264
265        self.next();
266        self.node(Node::Bool(boolean), |_| NodeMetadata { span: token.span })
267    }
268
269    pub(crate) fn null(&self) -> &'arena Node<'arena> {
270        let Some(token) = self.current() else {
271            return self.error(AstNodeError::MissingToken {
272                expected: afmt!(self, "Null"),
273                position: self.position(),
274            });
275        };
276
277        if token.kind != TokenKind::Identifier(Identifier::Null) {
278            return self.error(AstNodeError::UnexpectedIdentifier {
279                expected: afmt!(self, "Null"),
280                received: afmt!(self, "{}", token.value),
281                span: token.span,
282            });
283        }
284
285        self.next();
286        self.node(Node::Null, |_| NodeMetadata { span: token.span })
287    }
288
289    pub(crate) fn simple_string(&self, quote_mark: &QuotationMark) -> &'arena Node<'arena> {
290        expect!(self, TokenKind::QuotationMark(quote_mark.clone()));
291        let string_value = self.current();
292
293        let error_literal = self.expect(TokenKind::Literal);
294        let error_mark_end = self.expect(TokenKind::QuotationMark(quote_mark.clone()));
295
296        error_literal
297            .or(error_mark_end)
298            .or(string_value.map(|t| {
299                self.node(Node::String(t.value), |_| NodeMetadata {
300                    span: (t.span.0 - 1, t.span.1 + 1),
301                })
302            }))
303            .unwrap_or_else(|| {
304                self.error(AstNodeError::Custom {
305                    message: afmt!(
306                        self,
307                        "Failed to parse string `{}`",
308                        string_value.map(|s| s.value).unwrap_or_default()
309                    ),
310                    span: string_value
311                        .map(|s| s.span)
312                        .unwrap_or((self.prev_token_end(), self.prev_token_end())),
313                })
314            })
315    }
316
317    pub(crate) fn template_string<F>(&self, expression_parser: F) -> &'arena Node<'arena>
318    where
319        F: Fn(ParserContext) -> &'arena Node<'arena>,
320    {
321        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
322
323        let Some(mut current_token) = self.current() else {
324            return self.error(AstNodeError::MissingToken {
325                expected: afmt!(self, "Backtick (`)"),
326                position: self.position(),
327            });
328        };
329
330        let mut span = (current_token.span.0 - 1, 0u32);
331
332        let mut nodes = BumpVec::new_in(self.bump);
333        while TokenKind::QuotationMark(QuotationMark::Backtick) != current_token.kind {
334            match current_token.kind {
335                TokenKind::TemplateString(template) => match template {
336                    TemplateString::ExpressionStart => {
337                        self.next();
338                        nodes.push(expression_parser(ParserContext::Global));
339
340                        if let Some(error) =
341                            self.expect(TokenKind::TemplateString(TemplateString::ExpressionEnd))
342                        {
343                            nodes.push(error);
344                        }
345                    }
346                    TemplateString::ExpressionEnd => {
347                        self.next();
348                    }
349                },
350                TokenKind::Literal => {
351                    nodes.push(
352                        self.node(Node::String(current_token.value), |_| NodeMetadata {
353                            span: current_token.span,
354                        }),
355                    );
356                    self.next();
357                }
358                _ => {
359                    return self.error(AstNodeError::UnexpectedToken {
360                        expected: afmt!(self, "Valid TemplateString token"),
361                        received: afmt!(self, "{}", current_token.kind),
362                        span: current_token.span,
363                    })
364                }
365            }
366
367            if let Some(ct) = self.current() {
368                current_token = ct;
369                span.1 = ct.span.1;
370            } else {
371                break;
372            }
373        }
374
375        expect!(self, TokenKind::QuotationMark(QuotationMark::Backtick));
376        self.node(Node::TemplateString(nodes.into_bump_slice()), |_| {
377            NodeMetadata { span }
378        })
379    }
380
381    pub(crate) fn method_call<F>(
382        &self,
383        node: &'arena Node,
384        method_name: &Token,
385        expression_parser: F,
386    ) -> &'arena Node<'arena>
387    where
388        F: Fn(ParserContext) -> &'arena Node<'arena>,
389    {
390        let Some(method_kind) = MethodKind::try_from(method_name.value).ok() else {
391            return self.error(AstNodeError::UnknownMethod {
392                name: afmt!(self, "{}", method_name.value),
393                span: method_name.span,
394            });
395        };
396
397        expect!(self, TokenKind::Bracket(Bracket::LeftParenthesis));
398
399        let mut arguments = BumpVec::new_in(&self.bump);
400        loop {
401            if self.current_kind() == Some(&TokenKind::Bracket(Bracket::RightParenthesis)) {
402                break;
403            }
404
405            arguments.push(expression_parser(ParserContext::Global));
406            if self.current_kind() != Some(&TokenKind::Operator(Operator::Comma)) {
407                break;
408            }
409
410            if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
411                arguments.push(error);
412                break;
413            }
414        }
415
416        if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
417            arguments.push(error);
418        }
419
420        let method_node = self.node(
421            Node::MethodCall {
422                this: node,
423                kind: method_kind,
424                arguments: arguments.into_bump_slice(),
425            },
426            |h| NodeMetadata {
427                span: (
428                    h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
429                    self.prev_token_end(),
430                ),
431            },
432        );
433
434        self.with_postfix(method_node, expression_parser)
435    }
436
437    pub(crate) fn with_postfix<F>(
438        &self,
439        node: &'arena Node<'arena>,
440        expression_parser: F,
441    ) -> &'arena Node<'arena>
442    where
443        F: Fn(ParserContext) -> &'arena Node<'arena>,
444    {
445        let Some(postfix_token) = self.current() else {
446            return node;
447        };
448
449        let postfix_kind = PostfixKind::from(postfix_token);
450
451        let processed_token = match postfix_kind {
452            PostfixKind::Other => return node,
453            PostfixKind::MemberAccess => {
454                self.next();
455                let property_token = self.current();
456                self.next();
457
458                let property = match property_token {
459                    None => self.error_with_node(
460                        AstNodeError::Custom {
461                            message: afmt!(self, "Expected a property"),
462                            span: (self.prev_token_end(), self.prev_token_end()),
463                        },
464                        node,
465                    ),
466                    Some(t) => match is_valid_property(t) {
467                        true => {
468                            if self.current_kind()
469                                == Some(&TokenKind::Bracket(Bracket::LeftParenthesis))
470                            {
471                                return self.method_call(node, t, expression_parser);
472                            }
473
474                            self.node(Node::String(t.value), |_| NodeMetadata { span: t.span })
475                        }
476                        false => {
477                            self.set_position(self.position() - 1);
478                            self.error_with_node(
479                                AstNodeError::InvalidProperty {
480                                    property: afmt!(self, "{}", t.value),
481                                    span: t.span,
482                                },
483                                node,
484                            )
485                        }
486                    },
487                };
488
489                self.node(Node::Member { node, property }, |h| NodeMetadata {
490                    span: h.span(node, property).unwrap_or_default(),
491                })
492            }
493            PostfixKind::PropertyAccess => {
494                self.next();
495                let mut from: Option<&'arena Node<'arena>> = None;
496                let mut to: Option<&'arena Node<'arena>> = None;
497
498                let Some(mut c) = self.current() else {
499                    return self.error_with_node(
500                        AstNodeError::Custom {
501                            message: afmt!(self, "Expected a property"),
502                            span: (self.prev_token_end(), self.prev_token_end()),
503                        },
504                        node,
505                    );
506                };
507
508                if c.kind == TokenKind::Operator(Operator::Slice) {
509                    self.next();
510
511                    let Some(cc) = self.current() else {
512                        return self.error_with_node(
513                            AstNodeError::Custom {
514                                message: afmt!(self, "Unexpected token"),
515                                span: (self.prev_token_end(), self.prev_token_end()),
516                            },
517                            node,
518                        );
519                    };
520                    c = cc;
521
522                    if c.kind != TokenKind::Bracket(Bracket::RightSquareBracket) {
523                        to = Some(expression_parser(ParserContext::Global));
524                    }
525
526                    expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
527                    self.node(Node::Slice { node, to, from }, |h| NodeMetadata {
528                        span: (
529                            h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
530                            self.prev_token_end(),
531                        ),
532                    })
533                } else {
534                    let from_node = expression_parser(ParserContext::Global);
535                    from = Some(from_node);
536                    let Some(cc) = self.current() else {
537                        return self.error_with_node(
538                            AstNodeError::Custom {
539                                message: afmt!(self, "Unexpected token"),
540                                span: (self.prev_token_end(), self.prev_token_end()),
541                            },
542                            self.node(
543                                Node::Member {
544                                    node,
545                                    property: from_node,
546                                },
547                                |h| NodeMetadata {
548                                    span: h.span(node, from_node).unwrap_or_default(),
549                                },
550                            ),
551                        );
552                    };
553                    c = cc;
554
555                    if c.kind == TokenKind::Operator(Operator::Slice) {
556                        self.next();
557                        let Some(cc) = self.current() else {
558                            return self.error_with_node(
559                                AstNodeError::Custom {
560                                    message: afmt!(self, "Invalid slice syntax"),
561                                    span: (self.prev_token_end(), self.prev_token_end()),
562                                },
563                                self.node(Node::Slice { node, from, to }, |h| NodeMetadata {
564                                    span: h.span(node, from_node).unwrap_or_default(),
565                                }),
566                            );
567                        };
568                        c = cc;
569
570                        if c.kind != TokenKind::Bracket(Bracket::RightSquareBracket) {
571                            to = Some(expression_parser(ParserContext::Global));
572                        }
573
574                        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
575                        self.node(Node::Slice { node, from, to }, |h| NodeMetadata {
576                            span: (
577                                h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
578                                self.prev_token_end(),
579                            ),
580                        })
581                    } else {
582                        // Slice operator [:] was not found,
583                        // it should be just an index node.
584                        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
585                        self.node(
586                            Node::Member {
587                                node,
588                                property: from.unwrap_or_else(|| {
589                                    return self.error_with_node(
590                                        AstNodeError::Custom {
591                                            message: afmt!(self, "Invalid index property"),
592                                            span: (self.prev_token_end(), self.prev_token_end()),
593                                        },
594                                        node,
595                                    );
596                                }),
597                            },
598                            |h| NodeMetadata {
599                                span: (
600                                    h.metadata(node).map(|m| m.span.0).unwrap_or_default(),
601                                    self.prev_token_end(),
602                                ),
603                            },
604                        )
605                    }
606                }
607            }
608        };
609
610        self.with_postfix(processed_token, expression_parser)
611    }
612
613    /// Closure
614    pub(crate) fn closure<F>(&self, expression_parser: F) -> &'arena Node<'arena>
615    where
616        F: Fn(ParserContext) -> &'arena Node<'arena>,
617    {
618        let start = self.token_start();
619
620        self.depth.set(self.depth.get() + 1);
621        let node = expression_parser(ParserContext::Closure);
622        self.depth.set(self.depth.get() - 1);
623
624        self.node(Node::Closure(node), |_| NodeMetadata {
625            span: (start, self.prev_token_end()),
626        })
627    }
628
629    /// Identifier expression
630    /// Either <Identifier> or <Identifier Expression>
631    pub(crate) fn identifier<F>(&self, expression_parser: F) -> &'arena Node<'arena>
632    where
633        F: Fn(ParserContext) -> &'arena Node<'arena>,
634    {
635        let Some(token) = self.current() else {
636            return self.error(AstNodeError::MissingToken {
637                expected: afmt!(self, "Identifier"),
638                position: self.position(),
639            });
640        };
641
642        match token.kind {
643            TokenKind::Identifier(_) | TokenKind::Literal => {
644                // ok
645            }
646            _ => {
647                return self.error(AstNodeError::Custom {
648                    message: afmt!(self, "Expected an `identifier`, received `{}`.", token.kind),
649                    span: token.span,
650                });
651            }
652        }
653
654        let Some(identifier_token) = self.current() else {
655            return self.error(AstNodeError::Custom {
656                message: afmt!(self, "Expected an `identifier`."),
657                span: (self.prev_token_end(), self.prev_token_end()),
658            });
659        };
660        self.next();
661
662        let current_token = self.current();
663        if current_token.map(|t| t.kind) != Some(TokenKind::Bracket(Bracket::LeftParenthesis)) {
664            let identifier_node = match identifier_token.kind {
665                TokenKind::Identifier(Identifier::RootReference) => {
666                    self.node(Node::Root, |_| NodeMetadata {
667                        span: identifier_token.span,
668                    })
669                }
670                _ => self.node(Node::Identifier(identifier_token.value), |_| NodeMetadata {
671                    span: identifier_token.span,
672                }),
673            };
674
675            return self.with_postfix(identifier_node, expression_parser);
676        }
677
678        // Potentially it might be a built-in expression
679        let Ok(function) = FunctionKind::try_from(identifier_token.value) else {
680            return self.error(AstNodeError::UnknownBuiltIn {
681                name: afmt!(self, "{}", identifier_token.value),
682                span: identifier_token.span,
683            });
684        };
685
686        self.next();
687        let function_node = match function {
688            FunctionKind::Closure(_) => {
689                let mut arguments = BumpVec::new_in(&self.bump);
690
691                arguments.push(expression_parser(ParserContext::Global));
692                if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
693                    arguments.push(error);
694                };
695
696                arguments.push(self.closure(&expression_parser));
697                if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
698                    arguments.push(error);
699                }
700
701                Node::FunctionCall {
702                    kind: function,
703                    arguments: self.bump.alloc_slice_copy(arguments.into_bump_slice()),
704                }
705            }
706            _ => {
707                let mut arguments = BumpVec::new_in(&self.bump);
708                loop {
709                    if self.current_kind() == Some(&TokenKind::Bracket(Bracket::RightParenthesis)) {
710                        break;
711                    }
712
713                    arguments.push(expression_parser(ParserContext::Global));
714                    if self.current_kind() != Some(&TokenKind::Operator(Operator::Comma)) {
715                        break;
716                    }
717
718                    if let Some(error) = self.expect(TokenKind::Operator(Operator::Comma)) {
719                        arguments.push(error);
720                        break;
721                    }
722                }
723
724                if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightParenthesis)) {
725                    arguments.push(error);
726                }
727
728                Node::FunctionCall {
729                    kind: function,
730                    arguments: arguments.into_bump_slice(),
731                }
732            }
733        };
734
735        self.with_postfix(
736            self.node(function_node, |_| NodeMetadata {
737                span: (identifier_token.span.0, self.prev_token_end()),
738            }),
739            expression_parser,
740        )
741    }
742
743    /// Interval node
744    pub(crate) fn interval<F>(&self, expression_parser: F) -> Option<&'arena Node<'arena>>
745    where
746        F: Fn(ParserContext) -> &'arena Node<'arena>,
747    {
748        // Performance optimisation: skip if expression does not contain an interval for faster evaluation
749        if !self.has_range_operator {
750            return None;
751        }
752
753        let TokenKind::Bracket(_) = &self.current()?.kind else {
754            return None;
755        };
756
757        let initial_position = self.position();
758        let TokenKind::Bracket(left_bracket) = &self.current()?.kind else {
759            self.set_position(initial_position);
760            return None;
761        };
762
763        self.next();
764        let left = expression_parser(ParserContext::Global);
765        if left.has_error() {
766            self.set_position(initial_position);
767            return None;
768        };
769
770        if let Some(_) = self.expect(TokenKind::Operator(Operator::Range)) {
771            self.set_position(initial_position);
772            return None;
773        };
774
775        let right = expression_parser(ParserContext::Global);
776        if right.has_error() {
777            self.set_position(initial_position);
778            return None;
779        };
780
781        let TokenKind::Bracket(right_bracket) = &self.current()?.kind else {
782            self.set_position(initial_position);
783            return None;
784        };
785
786        self.next();
787
788        let interval_node = self.node(
789            Node::Interval {
790                left,
791                right,
792                left_bracket: *left_bracket,
793                right_bracket: *right_bracket,
794            },
795            |_| NodeMetadata {
796                span: (initial_position as u32, self.position() as u32),
797            },
798        );
799
800        Some(self.with_postfix(interval_node, expression_parser))
801    }
802
803    /// Array nodes
804    pub(crate) fn array<F>(&self, expression_parser: F) -> &'arena Node<'arena>
805    where
806        F: Fn(ParserContext) -> &'arena Node<'arena>,
807    {
808        let Some(current_token) = self.current() else {
809            return self.error(AstNodeError::MissingToken {
810                expected: afmt!(self, "Array"),
811                position: self.position(),
812            });
813        };
814
815        if current_token.kind != TokenKind::Bracket(Bracket::LeftSquareBracket) {
816            return self.error(AstNodeError::UnexpectedToken {
817                expected: afmt!(self, "{}", TokenKind::Bracket(Bracket::LeftSquareBracket)),
818                received: afmt!(self, "{}", current_token.kind),
819                span: current_token.span,
820            });
821        }
822
823        self.next();
824        let mut nodes = BumpVec::new_in(self.bump);
825        while !(self.current().map(|t| t.kind)
826            == Some(TokenKind::Bracket(Bracket::RightSquareBracket)))
827        {
828            if !nodes.is_empty() {
829                expect!(self, TokenKind::Operator(Operator::Comma));
830                if self.current().map(|t| t.kind)
831                    == Some(TokenKind::Bracket(Bracket::RightSquareBracket))
832                {
833                    break;
834                }
835            }
836
837            nodes.push(expression_parser(ParserContext::Global));
838        }
839
840        expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
841
842        let node = Node::Array(nodes.into_bump_slice());
843
844        self.with_postfix(
845            self.node(node, |_| NodeMetadata {
846                span: (current_token.span.0, self.prev_token_end()),
847            }),
848            expression_parser,
849        )
850    }
851
852    pub(crate) fn object<F>(&self, expression_parser: F) -> &'arena Node<'arena>
853    where
854        F: Fn(ParserContext) -> &'arena Node<'arena>,
855    {
856        let span_start = self.token_start();
857        expect!(self, TokenKind::Bracket(Bracket::LeftCurlyBracket));
858
859        let mut key_value_pairs = BumpVec::new_in(self.bump);
860        if let Some(TokenKind::Bracket(Bracket::RightCurlyBracket)) = self.current().map(|t| t.kind)
861        {
862            self.next();
863            return self.node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
864                NodeMetadata {
865                    span: (span_start, self.prev_token_end()),
866                }
867            });
868        }
869
870        loop {
871            let key = self.object_key(&expression_parser);
872            expect!(self, TokenKind::Operator(Operator::Slice));
873            let value = expression_parser(ParserContext::Global);
874
875            key_value_pairs.push((key, value));
876
877            let Some(current_token) = self.current() else {
878                break;
879            };
880
881            match current_token.kind {
882                TokenKind::Operator(Operator::Comma) => {
883                    expect!(self, TokenKind::Operator(Operator::Comma));
884                }
885                TokenKind::Bracket(Bracket::RightCurlyBracket) => break,
886                _ => {
887                    return self.error(AstNodeError::Custom {
888                        message: afmt!(self, "Invalid object syntax"),
889                        span: current_token.span,
890                    })
891                }
892            }
893        }
894
895        if let Some(error) = self.expect(TokenKind::Bracket(Bracket::RightCurlyBracket)) {
896            key_value_pairs.push((
897                self.node(Node::Null, |_| NodeMetadata {
898                    span: error.span().unwrap_or_default(),
899                }),
900                error,
901            ));
902        };
903
904        self.node(Node::Object(key_value_pairs.into_bump_slice()), |_| {
905            NodeMetadata {
906                span: (span_start, self.prev_token_end()),
907            }
908        })
909    }
910
911    pub(crate) fn object_key<F>(&self, expression_parser: F) -> &'arena Node<'arena>
912    where
913        F: Fn(ParserContext) -> &'arena Node<'arena>,
914    {
915        let Some(key_token) = self.current() else {
916            return self.error(AstNodeError::Custom {
917                message: afmt!(self, "Expected an object key"),
918                span: (self.prev_token_end(), self.prev_token_end()),
919            });
920        };
921
922        let key = match key_token.kind {
923            TokenKind::Identifier(identifier) => {
924                self.next();
925                self.node(Node::String(identifier.into()), |_| NodeMetadata {
926                    span: key_token.span,
927                })
928            }
929            TokenKind::Boolean(boolean) => match boolean {
930                true => {
931                    self.next();
932                    self.node(Node::String("true"), |_| NodeMetadata {
933                        span: key_token.span,
934                    })
935                }
936                false => {
937                    self.next();
938                    self.node(Node::String("false"), |_| NodeMetadata {
939                        span: key_token.span,
940                    })
941                }
942            },
943            TokenKind::Number => {
944                self.next();
945                self.node(Node::String(key_token.value), |_| NodeMetadata {
946                    span: key_token.span,
947                })
948            }
949            TokenKind::Literal => {
950                self.next();
951                self.node(Node::String(key_token.value), |_| NodeMetadata {
952                    span: key_token.span,
953                })
954            }
955            TokenKind::Bracket(bracket) => match bracket {
956                Bracket::LeftSquareBracket => {
957                    expect!(self, TokenKind::Bracket(Bracket::LeftSquareBracket));
958                    let token = expression_parser(ParserContext::Global);
959                    expect!(self, TokenKind::Bracket(Bracket::RightSquareBracket));
960
961                    token
962                }
963                _ => {
964                    return self.error(AstNodeError::Custom {
965                        message: afmt!(self, "Operator is not supported as object key"),
966                        span: key_token.span,
967                    })
968                }
969            },
970            TokenKind::QuotationMark(qm) => match qm {
971                QuotationMark::SingleQuote => self.simple_string(&QuotationMark::SingleQuote),
972                QuotationMark::DoubleQuote => self.simple_string(&QuotationMark::DoubleQuote),
973                QuotationMark::Backtick => {
974                    return self.error(AstNodeError::Custom {
975                        message: afmt!(
976                            self,
977                            "TemplateString expression not supported as object key"
978                        ),
979                        span: key_token.span,
980                    })
981                }
982            },
983            TokenKind::TemplateString(_) => {
984                return self.error(AstNodeError::Custom {
985                    message: afmt!(
986                        self,
987                        "TemplateString expression not supported as object key"
988                    ),
989                    span: key_token.span,
990                })
991            }
992            TokenKind::Operator(_) => {
993                return self.error(AstNodeError::Custom {
994                    message: afmt!(self, "Operator is not supported as object key"),
995                    span: key_token.span,
996                })
997            }
998        };
999
1000        key
1001    }
1002
1003    /// Conditional
1004    /// condition_node ? on_true : on_false
1005    pub(crate) fn conditional<F>(
1006        &self,
1007        condition: &'arena Node<'arena>,
1008        expression_parser: F,
1009    ) -> Option<&'arena Node<'arena>>
1010    where
1011        F: Fn(ParserContext) -> &'arena Node<'arena>,
1012    {
1013        let Some(current_token) = self.current() else {
1014            return None;
1015        };
1016        if current_token.kind != TokenKind::Operator(Operator::QuestionMark) {
1017            return None;
1018        }
1019
1020        self.next();
1021
1022        let on_true = expression_parser(ParserContext::Global);
1023        if let Some(error_node) = self.expect(TokenKind::Operator(Operator::Slice)) {
1024            return Some(error_node);
1025        }
1026
1027        let on_false = expression_parser(ParserContext::Global);
1028
1029        let conditional_node = Node::Conditional {
1030            condition,
1031            on_true,
1032            on_false,
1033        };
1034
1035        Some(self.node(conditional_node, |_| NodeMetadata {
1036            span: (current_token.span.0, self.prev_token_end()),
1037        }))
1038    }
1039
1040    /// Literal - number, string, array etc.
1041    pub(crate) fn literal<F>(&self, expression_parser: F) -> &'arena Node<'arena>
1042    where
1043        F: Fn(ParserContext) -> &'arena Node<'arena>,
1044    {
1045        let Some(current_token) = self.current() else {
1046            return self.error(AstNodeError::Custom {
1047                message: afmt!(self, "Expected a literal"),
1048                span: (self.prev_token_end(), self.prev_token_end()),
1049            });
1050        };
1051
1052        match &current_token.kind {
1053            TokenKind::Identifier(identifier) => match identifier {
1054                Identifier::Null => self.null(),
1055                _ => self.identifier(&expression_parser),
1056            },
1057            TokenKind::Literal => self.identifier(&expression_parser),
1058            TokenKind::Boolean(_) => self.bool(),
1059            TokenKind::Number => self.number(),
1060            TokenKind::QuotationMark(quote_mark) => match quote_mark {
1061                QuotationMark::SingleQuote | QuotationMark::DoubleQuote => {
1062                    self.simple_string(quote_mark)
1063                }
1064                QuotationMark::Backtick => self.template_string(&expression_parser),
1065            },
1066            TokenKind::Bracket(bracket) => match bracket {
1067                Bracket::LeftParenthesis
1068                | Bracket::RightParenthesis
1069                | Bracket::RightSquareBracket => {
1070                    self.interval(&expression_parser).unwrap_or_else(|| {
1071                        self.error(AstNodeError::Custom {
1072                            message: afmt!(self, "Invalid syntax"),
1073                            span: (self.prev_token_end(), self.prev_token_end()),
1074                        })
1075                    })
1076                }
1077                Bracket::LeftSquareBracket => self
1078                    .interval(&expression_parser)
1079                    .unwrap_or_else(|| self.array(&expression_parser)),
1080                Bracket::LeftCurlyBracket => self.object(&expression_parser),
1081                Bracket::RightCurlyBracket => self.error(AstNodeError::Custom {
1082                    message: afmt!(self, "Unexpected RightCurlyBracket token"),
1083                    span: current_token.span,
1084                }),
1085            },
1086            TokenKind::Operator(_) => self.error(AstNodeError::Custom {
1087                message: afmt!(self, "Unexpected Operator token"),
1088                span: current_token.span,
1089            }),
1090            TokenKind::TemplateString(_) => self.error(AstNodeError::Custom {
1091                message: afmt!(self, "Unexpected TemplateString token"),
1092                span: current_token.span,
1093            }),
1094        }
1095    }
1096}
1097
1098fn is_valid_property(token: &Token) -> bool {
1099    match &token.kind {
1100        TokenKind::Identifier(_) => true,
1101        TokenKind::Literal => true,
1102        TokenKind::Operator(operator) => match operator {
1103            Operator::Logical(_) => true,
1104            Operator::Comparison(comparison) => matches!(comparison, ComparisonOperator::In),
1105            _ => false,
1106        },
1107        _ => false,
1108    }
1109}
1110
1111#[derive(Debug)]
1112enum PostfixKind {
1113    MemberAccess,
1114    PropertyAccess,
1115    Other,
1116}
1117
1118impl From<&Token<'_>> for PostfixKind {
1119    fn from(token: &Token) -> Self {
1120        match &token.kind {
1121            TokenKind::Bracket(Bracket::LeftSquareBracket) => Self::PropertyAccess,
1122            TokenKind::Operator(Operator::Dot) => Self::MemberAccess,
1123            _ => Self::Other,
1124        }
1125    }
1126}
1127
1128pub(crate) struct MetadataHelper<'a, 'arena> {
1129    node_metadata: &'a HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>,
1130    arena: PhantomData<&'arena ()>,
1131}
1132
1133impl<'a, 'arena> MetadataHelper<'a, 'arena> {
1134    pub(crate) fn span(
1135        &self,
1136        left: &'arena Node<'arena>,
1137        right: &'arena Node<'arena>,
1138    ) -> Option<(u32, u32)> {
1139        Some((self.metadata(left)?.span.0, self.metadata(right)?.span.1))
1140    }
1141
1142    pub(crate) fn metadata(&self, n: &'arena Node<'arena>) -> Option<&NodeMetadata> {
1143        self.node_metadata.get(&self.address(n))
1144    }
1145
1146    fn address(&self, n: &'arena Node<'arena>) -> usize {
1147        n as *const Node as usize
1148    }
1149}
1150
1151#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1152pub(crate) enum ParserContext {
1153    Global,
1154    Closure,
1155}