luau_parser/impl/block/
numerical_for.rs1use 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}