use luau_lexer::prelude::Token;
use luau_parser_derive::{Print, Range};
use crate::types::{
CompoundSetExpression, DoBlock, EndOfFile, Expression, FunctionCall, GenericFor,
GlobalFunction, IfStatement, List, LocalAssignment, LocalFunction, NumericalFor, Pointer,
RepeatBlock, SetExpression, TypeDefinition, TypeFunction, WhileLoop,
};
macro_rules! generate_statement {
($(
$( #[$meta:meta] )*
$name:ident($ty:ty)
),* $(,)?) => {
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq, PartialOrd, Ord, Range, Print)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum Statement {
#[default]
ERROR,
$( $( #[$meta] )* $name(Pointer<$ty>) ,)*
}
impl Statement {
pub(crate) fn __parse(
token: luau_lexer::prelude::Token,
lexer: &mut luau_lexer::prelude::Lexer,
errors: &mut Vec<luau_lexer::prelude::Error>
) -> Option<Self> {
use $crate::types::Parse as _;
$( if let Some(value) = <$ty>::parse(token.clone(), lexer, errors) {
Some(Self::$name(Pointer::new(value)))
} else )* {
None
}
}
}
};
}
generate_statement! {
LocalFunction(LocalFunction),
LocalAssignment(LocalAssignment),
TypeDefinition(TypeDefinition),
IfStatement(IfStatement),
DoBlock(DoBlock),
GenericFor(GenericFor),
NumericalFor(NumericalFor),
RepeatBlock(RepeatBlock),
WhileLoop(WhileLoop),
SetExpression(SetExpression),
CompoundSetExpression(CompoundSetExpression),
FunctionCall(FunctionCall),
GlobalFunction(GlobalFunction),
TypeFunction(TypeFunction),
EndOfFile(EndOfFile),
}
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Range)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum TerminationStatement {
Break(Token),
Continue(Token),
Return {
return_keyword: Token,
#[range_or = "return_keyword"]
expressions: Option<List<Pointer<Expression>>>,
},
}