use crate::types::QualifiedName;
use std::collections::HashSet;
use syn::{ForeignItemFn, Ident, ImplItem, Item, ItemConst, ItemType, ItemUse, Type};
use super::{convert_error::ErrorContext, parse::type_converter::TypeConverter, ConvertError};
#[derive(Copy, Clone, Eq, PartialEq)]
pub(crate) enum TypeKind {
Pod, NonPod, Abstract, }
impl TypeKind {
pub(crate) fn can_be_instantiated(&self) -> bool {
match self {
TypeKind::Pod | TypeKind::NonPod => true,
TypeKind::Abstract => false,
}
}
}
pub(crate) struct ImplBlockDetails {
pub(crate) item: ImplItem,
pub(crate) ty: Ident,
}
#[derive(Clone)]
pub(crate) struct FuncToConvert {
pub(crate) item: ForeignItemFn,
pub(crate) virtual_this_type: Option<QualifiedName>,
pub(crate) self_ty: Option<QualifiedName>,
}
pub(crate) trait ApiAnalysis {
type TypeAnalysis;
type FunAnalysis;
}
pub(crate) struct NullAnalysis;
impl ApiAnalysis for NullAnalysis {
type TypeAnalysis = ();
type FunAnalysis = ();
}
pub(crate) enum TypedefKind {
Type(ItemType),
Use(ItemUse),
}
pub(crate) enum ApiDetail<T: ApiAnalysis> {
ForwardDeclaration,
ConcreteType { rs_definition: Box<Type> },
StringConstructor,
Function {
fun: Box<FuncToConvert>,
analysis: T::FunAnalysis,
},
Const { const_item: ItemConst },
Typedef { payload: TypedefKind },
Type {
bindgen_mod_item: Option<Item>,
analysis: T::TypeAnalysis,
},
CType { typename: QualifiedName },
OpaqueTypedef,
IgnoredItem {
err: ConvertError,
ctx: ErrorContext,
},
}
pub(crate) struct Api<T: ApiAnalysis> {
pub(crate) name: QualifiedName,
pub(crate) deps: HashSet<QualifiedName>,
pub(crate) detail: ApiDetail<T>,
}
pub(crate) type UnanalyzedApi = Api<NullAnalysis>;
impl<T: ApiAnalysis> Api<T> {
pub(crate) fn typename(&self) -> QualifiedName {
self.name.clone()
}
}
pub(crate) struct ParseResults<'a> {
pub(crate) apis: Vec<UnanalyzedApi>,
pub(crate) type_converter: TypeConverter<'a>,
}