use crate::{
ast::{pat::PatKind, stmt::StmtKind, ty::TyKind},
common::{BodyId, Safety, SpanId, Syncness},
ffi::{FfiOption, FfiSlice},
span::Ident,
};
use super::{CommonExprData, ExprKind};
#[repr(C)]
#[derive(Debug)]
pub struct BlockExpr<'ast> {
data: CommonExprData<'ast>,
stmts: FfiSlice<'ast, StmtKind<'ast>>,
expr: FfiOption<ExprKind<'ast>>,
label: FfiOption<Ident<'ast>>,
safety: Safety,
syncness: Syncness,
capture_kind: CaptureKind,
}
impl<'ast> BlockExpr<'ast> {
pub fn stmts(&self) -> &[StmtKind<'ast>] {
self.stmts.get()
}
pub fn expr(&self) -> Option<ExprKind<'ast>> {
self.expr.copy()
}
pub fn label(&self) -> Option<&Ident<'ast>> {
self.label.get()
}
pub fn safety(&self) -> Safety {
self.safety
}
pub fn syncness(&self) -> Syncness {
self.syncness
}
pub fn capture_kind(&self) -> CaptureKind {
self.capture_kind
}
}
super::impl_expr_data!(BlockExpr<'ast>, Block);
#[cfg(feature = "driver-api")]
impl<'ast> BlockExpr<'ast> {
pub fn new(
data: CommonExprData<'ast>,
stmts: &'ast [StmtKind<'ast>],
expr: Option<ExprKind<'ast>>,
label: Option<Ident<'ast>>,
safety: Safety,
syncness: Syncness,
capture_kind: CaptureKind,
) -> Self {
Self {
data,
stmts: stmts.into(),
expr: expr.into(),
label: label.into(),
safety,
syncness,
capture_kind,
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct ClosureExpr<'ast> {
data: CommonExprData<'ast>,
capture_kind: CaptureKind,
params: FfiSlice<'ast, ClosureParam<'ast>>,
return_ty: FfiOption<TyKind<'ast>>,
body_id: BodyId,
}
impl<'ast> ClosureExpr<'ast> {
pub fn capture_kind(&self) -> CaptureKind {
self.capture_kind
}
pub fn params(&self) -> &'ast [ClosureParam<'ast>] {
self.params.get()
}
pub fn return_ty(&self) -> Option<TyKind<'_>> {
self.return_ty.copy()
}
pub fn body_id(&self) -> BodyId {
self.body_id
}
}
super::impl_expr_data!(ClosureExpr<'ast>, Closure);
#[cfg(feature = "driver-api")]
impl<'ast> ClosureExpr<'ast> {
pub fn new(
data: CommonExprData<'ast>,
capture_kind: CaptureKind,
params: &'ast [ClosureParam<'ast>],
return_ty: Option<TyKind<'ast>>,
body_id: BodyId,
) -> Self {
Self {
data,
capture_kind,
params: params.into(),
return_ty: return_ty.into(),
body_id,
}
}
}
#[repr(C)]
#[non_exhaustive]
#[derive(Debug, Clone, Copy)]
pub enum CaptureKind {
Default,
Move,
}
#[repr(C)]
#[derive(Debug)]
pub struct ClosureParam<'ast> {
span: SpanId,
pat: PatKind<'ast>,
ty: FfiOption<TyKind<'ast>>,
}
impl<'ast> ClosureParam<'ast> {
pub fn pat(&self) -> PatKind<'ast> {
self.pat
}
pub fn ty(&self) -> Option<TyKind<'ast>> {
self.ty.copy()
}
}
crate::span::impl_has_span_via_field!(ClosureParam<'ast>);
#[cfg(feature = "driver-api")]
impl<'ast> ClosureParam<'ast> {
pub fn new(span: SpanId, pat: PatKind<'ast>, ty: Option<TyKind<'ast>>) -> Self {
Self {
span,
pat,
ty: ty.into(),
}
}
}