use crate::viml_lexer::{CaseFlag, CmpOp};
#[derive(Debug, Clone)]
pub enum Expr {
Number(i64),
Float(f64),
Str(String),
Interp(Vec<Expr>),
List(Vec<Expr>),
Lambda {
params: Vec<String>,
body: Box<Expr>,
},
Dict(Vec<(Expr, Expr)>),
Var(String),
Option(String),
Env(String),
Register(char),
Unary {
op: UnaryOp,
expr: Box<Expr>,
},
Arith {
op: ArithOp,
lhs: Box<Expr>,
rhs: Box<Expr>,
},
Compare {
op: CmpOp,
case: CaseFlag,
lhs: Box<Expr>,
rhs: Box<Expr>,
},
And(Box<Expr>, Box<Expr>),
Or(Box<Expr>, Box<Expr>),
Ternary {
cond: Box<Expr>,
then: Box<Expr>,
otherwise: Box<Expr>,
},
Coalesce(Box<Expr>, Box<Expr>),
Index {
base: Box<Expr>,
index: Box<Expr>,
},
Slice {
base: Box<Expr>,
from: Option<Box<Expr>>,
to: Option<Box<Expr>>,
},
Member {
base: Box<Expr>,
key: String,
},
Call {
name: String,
args: Vec<Expr>,
},
CallExpr {
callee: Box<Expr>,
args: Vec<Expr>,
},
Method {
base: Box<Expr>,
name: String,
args: Vec<Expr>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnaryOp {
Neg,
Plus,
Not,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ArithOp {
Add,
Sub,
Mul,
Div,
Mod,
Concat,
}
#[derive(Debug, Clone)]
pub enum LetTarget {
Var(String),
Option(String),
Env(String),
Register(char),
Index {
base: Box<Expr>,
index: Box<Expr>,
},
List {
names: Vec<String>,
rest: Option<String>,
},
Range {
base: Box<Expr>,
idx1: Option<Box<Expr>>,
idx2: Option<Box<Expr>>,
},
}
#[derive(Debug, Clone)]
pub enum UnletArg {
Name(String),
Item {
base: Box<Expr>,
index: Box<Expr>,
},
}
#[derive(Debug, Clone)]
pub enum ForVars {
One(String),
List(Vec<String>),
}
#[derive(Debug, Clone)]
pub enum Stmt {
Echo(Vec<Expr>),
Echon(Vec<Expr>),
Let {
target: LetTarget,
expr: Expr,
},
Call(Expr),
Expr(Expr),
If {
arms: Vec<(Expr, Vec<Stmt>)>,
else_body: Option<Vec<Stmt>>,
},
While {
cond: Expr,
body: Vec<Stmt>,
},
For {
vars: ForVars,
iter: Expr,
body: Vec<Stmt>,
},
Break,
Continue,
Finish,
Return(Option<Expr>),
Function {
name: String,
args: Vec<String>,
defaults: Vec<(usize, Expr)>,
body: Vec<Stmt>,
bang: bool,
vim9: bool,
},
Try {
body: Vec<Stmt>,
catches: Vec<(Option<String>, Vec<Stmt>)>,
finally: Option<Vec<Stmt>>,
},
Throw(Expr),
Execute(Vec<Expr>),
Set(String),
Source(String),
Unlet(Vec<UnletArg>),
Map(String),
CommandDef(String),
CommandDel(String),
DelFunction(String),
UserCmd(String),
Autocmd(String),
Augroup(String),
Doautocmd(String),
ExCmd(String),
Colorscheme(String),
Highlight(String),
Syntax(String),
Filetype(String),
}