luau_parser/impl/block/
repeat_block.rs1use luau_lexer::prelude::{Error, Keyword, Lexer, Token, TokenType};
4
5use crate::{
6 safe_unwrap,
7 types::{Block, Expression, Parse, Pointer, RepeatBlock, TryParse, TryParseWithArgs},
8 utils::get_token_type_display_extended,
9};
10
11impl Parse for RepeatBlock {
12 fn parse(repeat_keyword: Token, lexer: &mut Lexer, errors: &mut Vec<Error>) -> Option<Self> {
13 if repeat_keyword != TokenType::Keyword(Keyword::Repeat) {
14 return None;
15 }
16
17 let body = Block::try_parse_with(lexer, errors, TokenType::Keyword(Keyword::Until))
18 .unwrap_or_default();
19
20 next_token_recoverable!(
21 lexer,
22 until_keyword,
23 TokenType::Keyword(Keyword::Until),
24 TokenType::Keyword(Keyword::Until),
25 errors,
26 "Expected ".to_string()
27 + get_token_type_display_extended(&TokenType::Keyword(Keyword::Until))
28 );
29
30 let condition = safe_unwrap!(
31 lexer,
32 errors,
33 "Expected <expr>",
34 Pointer::<Expression>::try_parse(lexer, errors)
35 );
36
37 Some(Self {
38 repeat_keyword,
39 body,
40 until_keyword,
41 condition,
42 })
43 }
44}