luau-parser 0.2.68

A blazingly fast Luau parser with robust error recovery.
Documentation
//! All `impl` blocks for [`NumericalFor`].

use luau_lexer::prelude::{Error, Keyword, Lexer, Symbol, Token, TokenType};

use crate::{
    types::{DoBlock, Expression, Name, NumericalFor, Parse, Pointer, TryParse},
    utils::get_token_type_display_extended,
};

impl Parse for NumericalFor {
    fn parse(for_keyword: Token, lexer: &mut Lexer, errors: &mut Vec<Error>) -> Option<Self> {
        if for_keyword != TokenType::Keyword(Keyword::For) {
            return None;
        }

        let variable = Name::try_parse(lexer, errors).unwrap_or(Name::ERROR);

        next_token_recoverable!(
            lexer,
            equal_keyword,
            TokenType::Symbol(Symbol::Equal),
            TokenType::Symbol(Symbol::Equal),
            errors,
            "Expected ".to_string()
                + get_token_type_display_extended(&TokenType::Symbol(Symbol::Equal))
        );

        let start = Pointer::<Expression>::try_parse(lexer, errors).unwrap_or_default();
        next_token_recoverable!(
            lexer,
            start_comma,
            TokenType::Symbol(Symbol::Comma),
            TokenType::Symbol(Symbol::Comma),
            errors,
            "Expected ".to_string()
                + get_token_type_display_extended(&TokenType::Symbol(Symbol::Comma))
        );

        let end = Pointer::<Expression>::try_parse(lexer, errors).unwrap_or_default();
        maybe_next_token!(lexer, end_comma, TokenType::Symbol(Symbol::Comma));

        let step = end_comma
            .as_ref()
            .and_then(|_| Pointer::<Expression>::try_parse(lexer, errors));
        let do_block = DoBlock::try_parse(lexer, errors)?;

        Some(Self {
            for_keyword,
            variable,
            equal_keyword,
            start,
            start_comma,
            end,
            end_comma,
            step,
            do_block,
        })
    }
}