luau_parser/impl/
bracketed.rs1use luau_lexer::prelude::{Lexer, ParseError, State, Symbol, Token, TokenType};
4use std::ops::{Deref, DerefMut};
5
6use crate::{
7 types::{Bracketed, List, Parse, ParseWithArgs, Print, TryParse, TryParseWithArgs},
8 utils::get_token_type_display_extended,
9};
10
11impl<T: Default> Bracketed<T> {
12 fn parse<F>(
14 previous_state: State,
15 parse: F,
16 opening_bracket: Token,
17 lexer: &mut Lexer,
18 errors: &mut Vec<ParseError>,
19 (error_message, stop_at): (&str, Symbol),
20 ) -> Option<Self>
21 where
22 F: FnOnce(Token, &mut Lexer, &mut Vec<ParseError>) -> Option<T>,
23 {
24 let token = lexer.next_token();
25 if token == TokenType::Symbol(stop_at) {
26 return Some(Self {
27 opening_bracket,
28 item: T::default(),
29 closing_bracket: token,
30 });
31 }
32
33 let Some(item) = parse(token, lexer, errors) else {
34 let state = lexer.save_state();
35 errors.push(ParseError::new(
36 state.lexer_position(),
37 error_message.to_string(),
38 Some(state.lexer_position()),
39 ));
40
41 return None;
42 };
43
44 next_token_recoverable_with_condition!(
45 lexer,
46 closing_bracket,
47 closing_bracket.token_type == TokenType::Symbol(stop_at),
48 TokenType::Symbol(stop_at),
49 errors,
50 format!(
51 "Expected {}",
52 get_token_type_display_extended(&TokenType::Symbol(stop_at))
53 )
54 );
55
56 Some(Self {
57 opening_bracket,
58 item,
59 closing_bracket,
60 })
61 }
62}
63
64impl<T: Parse + Default> ParseWithArgs<(&str, Symbol)> for Bracketed<T> {
65 #[inline]
66 fn parse_with(
67 opening_bracket: Token,
68 lexer: &mut Lexer,
69 errors: &mut Vec<ParseError>,
70 (error_message, stop_at): (&str, Symbol),
71 ) -> Option<Self> {
72 Self::parse(
73 lexer.save_state(),
74 |token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>| {
75 T::parse(token, lexer, errors)
76 },
77 opening_bracket,
78 lexer,
79 errors,
80 (error_message, stop_at),
81 )
82 }
83}
84impl<A, T> ParseWithArgs<(&str, Symbol, A)> for Bracketed<T>
85where
86 T: ParseWithArgs<A> + Default,
87{
88 #[inline]
89 fn parse_with(
90 opening_bracket: Token,
91 lexer: &mut Lexer,
92 errors: &mut Vec<ParseError>,
93 (error_message, stop_at, args): (&str, Symbol, A),
94 ) -> Option<Self> {
95 Self::parse(
96 lexer.save_state(),
97 |token: Token, lexer: &mut Lexer, errors: &mut Vec<ParseError>| {
98 T::parse_with(token, lexer, errors, args)
99 },
100 opening_bracket,
101 lexer,
102 errors,
103 (error_message, stop_at),
104 )
105 }
106}
107
108impl<T> Deref for Bracketed<T> {
109 type Target = T;
110
111 fn deref(&self) -> &Self::Target {
112 &self.item
113 }
114}
115
116impl<T> DerefMut for Bracketed<T> {
117 fn deref_mut(&mut self) -> &mut Self::Target {
118 &mut self.item
119 }
120}
121
122impl<T: Print> Print for Bracketed<T> {
123 fn print_final_trivia(&self) -> String {
124 self.closing_bracket.print_final_trivia()
125 }
126
127 fn print_without_final_trivia(&self) -> String {
128 self.opening_bracket.print_without_final_trivia()
129 + &self.item.print_without_final_trivia()
130 + &self.closing_bracket.print_without_final_trivia()
131 }
132}