luau_parser/impl/block/
repeat_block.rs1use luau_lexer::prelude::{Keyword, Lexer, ParseError, 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(
13 repeat_keyword: Token,
14 lexer: &mut Lexer,
15 errors: &mut Vec<ParseError>,
16 ) -> Option<Self> {
17 if repeat_keyword != TokenType::Keyword(Keyword::Repeat) {
18 return None;
19 }
20
21 let body = Block::try_parse_with(lexer, errors, TokenType::Keyword(Keyword::End))
22 .unwrap_or_default();
23
24 next_token_recoverable!(
25 lexer,
26 until_keyword,
27 TokenType::Keyword(Keyword::Until),
28 TokenType::Keyword(Keyword::Until),
29 errors,
30 "Expected ".to_string()
31 + get_token_type_display_extended(&TokenType::Keyword(Keyword::Until))
32 );
33
34 let condition = safe_unwrap!(
35 lexer,
36 errors,
37 "Expected <expr>",
38 Pointer::<Expression>::try_parse(lexer, errors)
39 );
40
41 Some(Self {
42 repeat_keyword,
43 body,
44 until_keyword,
45 condition,
46 })
47 }
48}