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