use crate::{
ast::{generic::GenericParams, pat::PatKind, ty::TyKind},
common::{Abi, BodyId, Constness, Safety, SpanId, Syncness},
ffi::{FfiOption, FfiSlice},
};
use super::CommonItemData;
#[repr(C)]
#[derive(Debug)]
pub struct FnItem<'ast> {
data: CommonItemData<'ast>,
generics: GenericParams<'ast>,
constness: Constness,
syncness: Syncness,
safety: Safety,
is_extern: bool,
has_self: bool,
abi: Abi,
params: FfiSlice<'ast, FnParam<'ast>>,
return_ty: FfiOption<TyKind<'ast>>,
body_id: FfiOption<BodyId>,
}
super::impl_item_data!(FnItem, Fn);
impl<'ast> FnItem<'ast> {
pub fn generics(&self) -> &GenericParams<'ast> {
&self.generics
}
pub fn body_id(&self) -> Option<BodyId> {
self.body_id.copy()
}
pub fn constness(&self) -> Constness {
self.constness
}
pub fn syncness(&self) -> Syncness {
self.syncness
}
pub fn safety(&self) -> Safety {
self.safety
}
pub fn is_extern(&self) -> bool {
self.is_extern
}
pub fn abi(&self) -> Abi {
self.abi
}
pub fn has_self(&self) -> bool {
self.has_self
}
pub fn params(&self) -> &[FnParam<'ast>] {
self.params.get()
}
pub fn return_ty(&self) -> Option<&TyKind<'ast>> {
self.return_ty.get()
}
}
#[cfg(feature = "driver-api")]
impl<'ast> FnItem<'ast> {
#[allow(clippy::too_many_arguments)]
pub fn new(
data: CommonItemData<'ast>,
generics: GenericParams<'ast>,
constness: Constness,
syncness: Syncness,
safety: Safety,
is_extern: bool,
has_self: bool,
abi: Abi,
params: &'ast [FnParam<'ast>],
return_ty: Option<TyKind<'ast>>,
body: Option<BodyId>,
) -> Self {
Self {
data,
generics,
constness,
syncness,
safety,
is_extern,
has_self,
abi,
params: params.into(),
return_ty: return_ty.into(),
body_id: body.into(),
}
}
}
#[repr(C)]
#[derive(Debug)]
pub struct FnParam<'ast> {
span: SpanId,
pat: PatKind<'ast>,
ty: TyKind<'ast>,
}
impl<'ast> FnParam<'ast> {
pub fn pat(&self) -> PatKind<'ast> {
self.pat
}
pub fn ty(&self) -> TyKind<'ast> {
self.ty
}
}
crate::span::impl_has_span_via_field!(FnParam<'ast>);
#[cfg(feature = "driver-api")]
impl<'ast> FnParam<'ast> {
pub fn new(span: SpanId, pat: PatKind<'ast>, ty: TyKind<'ast>) -> Self {
Self { span, pat, ty }
}
}