luau_parser/impl/block/
repeat_block.rs

1//! All `impl` blocks for [`RepeatBlock`].
2
3use 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}