use crate::{
ast::AstQPath,
common::SpanId,
context::with_cx,
ffi::{FfiOption, FfiSlice},
span::{Ident, Span},
};
use super::{CommonExprData, ConstExpr, ExprKind, ExprPrecedence};
#[repr(C)]
#[derive(Debug)]
pub struct ArrayExpr<'ast> {
data: CommonExprData<'ast>,
elements: FfiSlice<'ast, ExprKind<'ast>>,
len: FfiOption<ConstExpr<'ast>>,
}
impl<'ast> ArrayExpr<'ast> {
pub fn elements(&self) -> &[ExprKind<'ast>] {
self.elements.get()
}
pub fn len(&self) -> Option<&ConstExpr<'ast>> {
self.len.get()
}
}
super::impl_expr_data!(
ArrayExpr<'ast>,
Array,
fn precedence(&self) -> ExprPrecedence {
ExprPrecedence::Ctor
}
);
#[cfg(feature = "driver-api")]
impl<'ast> ArrayExpr<'ast> {
pub fn new(data: CommonExprData<'ast>, elem_exprs: &'ast [ExprKind<'ast>], len: Option<ConstExpr<'ast>>) -> Self {
Self {
data,
elements: elem_exprs.into(),
len: len.into(),
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct TupleExpr<'ast> {
data: CommonExprData<'ast>,
elements: FfiSlice<'ast, ExprKind<'ast>>,
}
impl<'ast> TupleExpr<'ast> {
pub fn elements(&self) -> &[ExprKind<'ast>] {
self.elements.get()
}
}
super::impl_expr_data!(
TupleExpr<'ast>,
Tuple,
fn precedence(&self) -> ExprPrecedence {
ExprPrecedence::Ctor
}
);
#[cfg(feature = "driver-api")]
impl<'ast> TupleExpr<'ast> {
pub fn new(data: CommonExprData<'ast>, elements: &'ast [ExprKind<'ast>]) -> Self {
Self {
data,
elements: elements.into(),
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct CtorExpr<'ast> {
data: CommonExprData<'ast>,
path: AstQPath<'ast>,
fields: FfiSlice<'ast, CtorField<'ast>>,
base: FfiOption<ExprKind<'ast>>,
}
impl<'ast> CtorExpr<'ast> {
pub fn path(&self) -> &AstQPath<'ast> {
&self.path
}
pub fn fields(&self) -> &'ast [CtorField<'ast>] {
self.fields.get()
}
pub fn base(&self) -> Option<ExprKind<'ast>> {
self.base.copy()
}
}
super::impl_expr_data!(
CtorExpr<'ast>,
Ctor,
fn precedence(&self) -> ExprPrecedence {
ExprPrecedence::Ctor
}
);
#[cfg(feature = "driver-api")]
impl<'ast> CtorExpr<'ast> {
pub fn new(
data: CommonExprData<'ast>,
path: AstQPath<'ast>,
fields: &'ast [CtorField<'ast>],
base: Option<ExprKind<'ast>>,
) -> Self {
Self {
data,
path,
fields: fields.into(),
base: base.into(),
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct CtorField<'ast> {
span: SpanId,
ident: Ident<'ast>,
expr: ExprKind<'ast>,
}
impl<'ast> CtorField<'ast> {
pub fn span(&self) -> &Span<'ast> {
with_cx(self, |cx| cx.span(self.span))
}
pub fn ident(&self) -> &Ident<'ast> {
&self.ident
}
pub fn expr(&self) -> ExprKind<'ast> {
self.expr
}
}
#[cfg(feature = "driver-api")]
impl<'ast> CtorField<'ast> {
pub fn new(span: SpanId, ident: Ident<'ast>, expr: ExprKind<'ast>) -> Self {
Self { span, ident, expr }
}
}
#[repr(C)]
#[derive(Debug)]
pub struct RangeExpr<'ast> {
data: CommonExprData<'ast>,
start: FfiOption<ExprKind<'ast>>,
end: FfiOption<ExprKind<'ast>>,
is_inclusive: bool,
}
impl<'ast> RangeExpr<'ast> {
pub fn start(&self) -> Option<ExprKind<'ast>> {
self.start.copy()
}
pub fn end(&self) -> Option<ExprKind<'ast>> {
self.end.copy()
}
pub fn is_inclusive(&self) -> bool {
self.is_inclusive
}
}
super::impl_expr_data!(RangeExpr<'ast>, Range);
#[cfg(feature = "driver-api")]
impl<'ast> RangeExpr<'ast> {
pub fn new(
data: CommonExprData<'ast>,
start: Option<ExprKind<'ast>>,
end: Option<ExprKind<'ast>>,
is_inclusive: bool,
) -> Self {
Self {
data,
start: start.into(),
end: end.into(),
is_inclusive,
}
}
}