use super::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CaptureBy {
Value,
Ref,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Expr {
pub id: NodeId,
pub kind: ExprKind,
pub span: Span,
pub attrs: AttrVec,
pub tokens: Option<TokenStream>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum ExprKind {
MacCall(MacCall),
Lit(Lit),
Path(Option<QSelf>, Path),
If {
cond: Box<Expr>,
then_branch: Block,
else_branch: Option<Box<Expr>>,
},
Match {
expr: Box<Expr>,
arms: Vec<Arm>,
},
While {
label: Option<Label>,
cond: Box<Expr>,
body: Block,
},
ForLoop {
label: Option<Label>,
pat: Pat,
iter: Box<Expr>,
body: Block,
},
Loop {
label: Option<Label>,
body: Block,
},
Binary {
left: Box<Expr>,
op: BinOp,
right: Box<Expr>,
},
Unary {
op: UnOp,
expr: Box<Expr>,
},
Call {
func: Box<Expr>,
args: Vec<Expr>,
},
MethodCall {
receiver: Box<Expr>,
method: Ident,
args: Vec<Expr>,
},
Array(Vec<Expr>),
Tuple(Vec<Expr>),
Field {
expr: Box<Expr>,
field: Ident,
},
Index {
expr: Box<Expr>,
index: Box<Expr>,
},
Assign {
left: Box<Expr>,
right: Box<Expr>,
},
Struct {
path: Path,
fields: Vec<ExprField>,
},
Closure {
params: Vec<Param>,
body: Box<Expr>,
},
Range {
start: Option<Box<Expr>>,
end: Option<Box<Expr>>,
inclusive: bool,
},
Paren(Box<Expr>),
Try(Box<Expr>),
Cast {
expr: Box<Expr>,
ty: Box<Ty>,
},
Break {
label: Option<Label>,
value: Option<Box<Expr>>,
},
Continue {
label: Option<Label>,
},
Return {
value: Option<Box<Expr>>,
},
Async {
capture: CaptureBy,
body: Block,
},
Await {
expr: Box<Expr>,
},
Let {
pat: Pat,
expr: Box<Expr>,
},
Repeat {
expr: Box<Expr>,
count: Box<Expr>,
},
Unsafe {
body: Block,
},
Yield {
value: Option<Box<Expr>>,
},
Const {
body: Block,
},
}
#[derive(Debug, Clone, PartialEq)]
pub struct MacCall {
pub path: Path,
pub args: MacArgs,
pub prior_type_ascription: Option<(usize, bool)>,
}
impl MacCall {
pub fn new(path: Path, args: MacArgs) -> Self {
Self { path, args, prior_type_ascription: None }
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum MacArgs {
Empty,
Delimited { dspan: DelSpan, delim: Delimiter, tokens: TokenStream },
Eq { eq_span: Span, tokens: TokenStream },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Delimiter {
Paren,
Brace,
Bracket,
Invisible,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Lit {
pub kind: LitKind,
pub span: Span,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LitKind {
Str(String),
Int(i128),
Bool(bool),
Float(String),
Char(char),
Byte(u8),
ByteStr(Vec<u8>),
CStr(Vec<u8>),
Verbatim(String),
}
#[derive(Debug, Clone, PartialEq)]
pub struct Arm {
pub attrs: AttrVec,
pub pat: Pat,
pub guard: Option<Box<Expr>>,
pub body: Box<Expr>,
pub span: Span,
pub id: NodeId,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Label {
pub ident: Ident,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BinOp {
Add, Sub, Mul, Div, Rem, And, Or, BitAnd, BitOr, BitXor, Shl, Shr, Eq, Ne, Lt, Le, Gt, Ge, }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnOp {
Not, Neg, Deref, Ref, RefMut, }
#[derive(Debug, Clone, PartialEq)]
pub struct ExprField {
pub attrs: AttrVec,
pub ident: Ident,
pub expr: Expr,
pub is_shorthand: bool, pub span: Span,
}