use crate::{
ast::generic::Lifetime,
common::{Abi, Mutability, Safety, SpanId},
ffi::{FfiOption, FfiSlice},
span::Ident,
};
use super::{CommonSynTyData, TyKind};
#[repr(C)]
#[derive(Debug)]
pub struct RefTy<'ast> {
data: CommonSynTyData<'ast>,
lifetime: FfiOption<Lifetime<'ast>>,
mutability: Mutability,
inner_ty: TyKind<'ast>,
}
impl<'ast> RefTy<'ast> {
pub fn has_lifetime(&self) -> bool {
self.lifetime.get().is_some()
}
pub fn mutability(&self) -> Mutability {
self.mutability
}
pub fn inner_ty(&self) -> TyKind<'ast> {
self.inner_ty
}
}
super::impl_ty_data!(RefTy<'ast>, Ref);
#[cfg(feature = "driver-api")]
impl<'ast> RefTy<'ast> {
pub fn new(
data: CommonSynTyData<'ast>,
lifetime: Option<Lifetime<'ast>>,
mutability: Mutability,
inner_ty: TyKind<'ast>,
) -> Self {
Self {
data,
lifetime: lifetime.into(),
mutability,
inner_ty,
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct RawPtrTy<'ast> {
data: CommonSynTyData<'ast>,
mutability: Mutability,
inner_ty: TyKind<'ast>,
}
impl<'ast> RawPtrTy<'ast> {
pub fn mutability(&self) -> Mutability {
self.mutability
}
pub fn inner_ty(&self) -> TyKind<'ast> {
self.inner_ty
}
}
super::impl_ty_data!(RawPtrTy<'ast>, RawPtr);
#[cfg(feature = "driver-api")]
impl<'ast> RawPtrTy<'ast> {
pub fn new(data: CommonSynTyData<'ast>, mutability: Mutability, inner_ty: TyKind<'ast>) -> Self {
Self {
data,
mutability,
inner_ty,
}
}
}
#[repr(C)]
#[derive(Debug)]
#[cfg_attr(feature = "driver-api", derive(typed_builder::TypedBuilder))]
pub struct FnPtrTy<'ast> {
data: CommonSynTyData<'ast>,
safety: Safety,
abi: Abi,
#[cfg_attr(feature = "driver-api", builder(setter(into)))]
params: FfiSlice<'ast, FnTyParameter<'ast>>,
#[cfg_attr(feature = "driver-api", builder(setter(into)))]
return_ty: FfiOption<TyKind<'ast>>,
}
impl<'ast> FnPtrTy<'ast> {
pub fn safety(&self) -> Safety {
self.safety
}
pub fn abi(&self) -> Abi {
self.abi
}
pub fn params(&self) -> &[FnTyParameter<'ast>] {
self.params.get()
}
pub fn return_ty(&self) -> Option<&TyKind<'ast>> {
self.return_ty.get()
}
}
super::impl_ty_data!(FnPtrTy<'ast>, FnPtr);
#[repr(C)]
#[derive(Debug)]
#[cfg_attr(feature = "driver-api", derive(typed_builder::TypedBuilder))]
pub struct FnTyParameter<'ast> {
#[cfg_attr(feature = "driver-api", builder(setter(into)))]
ident: FfiOption<Ident<'ast>>,
span: SpanId,
ty: TyKind<'ast>,
}
impl<'ast> FnTyParameter<'ast> {
pub fn ident(&self) -> Option<&Ident<'ast>> {
self.ident.get()
}
pub fn ty(&self) -> TyKind<'ast> {
self.ty
}
}
crate::span::impl_has_span_via_field!(FnTyParameter<'ast>);