use crate::syn::Spanned; pub type SpBody = Spanned; pub type Body = Vec; #[derive(Debug, Clone)] pub enum Stmt { Assign(SpAssignLhs, SpExpr), Expr(SpExpr), If { if_true: SpCondBody, elseif: Vec, else_body: Option, }, Def { name: String, params: Vec, body: Vec, }, Import { target: String, from: Option, }, } pub type SpAssignLhs = Spanned; #[derive(Debug, Clone)] pub enum AssignLhs { /// A simple assignment. /// /// `x = foo` Name(String), /// A more complex assignment. /// /// `x().bar = foo` Complex(SpExpr, String), } pub type SpStmt = Spanned; #[derive(Debug, Clone)] pub struct CondBody { pub cond: SpExpr, pub body: SpBody, } pub type SpCondBody = Spanned; #[derive(Debug, Clone)] pub struct Param { pub name: String, pub ty: Option, } pub type SpParam = Spanned; #[derive(Debug, Clone)] pub enum Expr { Call(Box, Vec), Get(Box, String), Atom(SpAtom), } pub type SpExpr = Spanned; #[derive(Debug, Clone)] pub enum Atom { Int(i64), Float(f64), Str(String), Sym(String), Name(String), } pub type SpAtom = Spanned;