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 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 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 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 }
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 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 pub(crate) fn interval<F>(&self, expression_parser: F) -> Option<&'arena Node<'arena>>
745 where
746 F: Fn(ParserContext) -> &'arena Node<'arena>,
747 {
748 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 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 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 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 ¤t_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}