luau_parser/impl/block/
repeat_block.rs

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