luau_parser/impl/block/
numerical_for.rs

1//! All `impl` blocks for [`NumericalFor`].
2
3use luau_lexer::prelude::{Error, Keyword, Lexer, Symbol, Token, TokenType};
4
5use crate::{
6    types::{DoBlock, Expression, Name, NumericalFor, Parse, Pointer, TryParse},
7    utils::get_token_type_display_extended,
8};
9
10impl Parse for NumericalFor {
11    fn parse(for_keyword: Token, lexer: &mut Lexer, errors: &mut Vec<Error>) -> Option<Self> {
12        if for_keyword != TokenType::Keyword(Keyword::For) {
13            return None;
14        }
15
16        let variable = Name::try_parse(lexer, errors).unwrap_or(Name::ERROR);
17
18        next_token_recoverable!(
19            lexer,
20            equal_keyword,
21            TokenType::Symbol(Symbol::Equal),
22            TokenType::Symbol(Symbol::Equal),
23            errors,
24            "Expected ".to_string()
25                + get_token_type_display_extended(&TokenType::Symbol(Symbol::Equal))
26        );
27
28        let start = Pointer::<Expression>::try_parse(lexer, errors).unwrap_or_default();
29        next_token_recoverable!(
30            lexer,
31            start_comma,
32            TokenType::Symbol(Symbol::Comma),
33            TokenType::Symbol(Symbol::Comma),
34            errors,
35            "Expected ".to_string()
36                + get_token_type_display_extended(&TokenType::Symbol(Symbol::Comma))
37        );
38
39        let end = Pointer::<Expression>::try_parse(lexer, errors).unwrap_or_default();
40        maybe_next_token!(lexer, end_comma, TokenType::Symbol(Symbol::Comma));
41
42        let step = end_comma
43            .as_ref()
44            .and_then(|_| Pointer::<Expression>::try_parse(lexer, errors));
45        let do_block = DoBlock::try_parse(lexer, errors)?;
46
47        Some(Self {
48            for_keyword,
49            variable,
50            equal_keyword,
51            start,
52            start_comma,
53            end,
54            end_comma,
55            step,
56            do_block,
57        })
58    }
59}