use crate::types::{Namespace, TypeName};
use proc_macro2::TokenStream;
use std::collections::HashSet;
use syn::{ForeignItemFn, Ident, ImplItem, Item, ItemConst, ItemType, ItemUse};
use super::{codegen_cpp::AdditionalNeed, parse::type_converter::TypeConverter};
#[derive(Copy, Clone, Eq, PartialEq)]
pub(crate) enum TypeKind {
Pod, NonPod, ForwardDeclaration, }
#[derive(Clone)]
pub(crate) enum Use {
Unused,
Used,
UsedWithAlias(Ident),
UsedFromBindgen,
}
pub(crate) struct TypeApiDetails {
pub(crate) fulltypath: Vec<Ident>,
pub(crate) final_ident: Ident,
pub(crate) tynamestring: String,
}
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<TypeName>,
pub(crate) self_ty: Option<TypeName>,
}
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> {
ConcreteType {
ty_details: TypeApiDetails,
additional_cpp: AdditionalNeed,
},
StringConstructor,
Function {
fun: FuncToConvert,
analysis: T::FunAnalysis,
},
Const { const_item: ItemConst },
Typedef { payload: TypedefKind },
Type {
ty_details: TypeApiDetails,
for_extern_c_ts: TokenStream,
is_forward_declaration: bool,
bindgen_mod_item: Option<Item>,
analysis: T::TypeAnalysis,
},
CType { typename: TypeName },
OpaqueTypedef,
IgnoredItem,
}
pub(crate) struct Api<T: ApiAnalysis> {
pub(crate) ns: Namespace,
pub(crate) id: Ident,
pub(crate) deps: HashSet<TypeName>,
pub(crate) detail: ApiDetail<T>,
}
pub(crate) type UnanalyzedApi = Api<NullAnalysis>;
impl<T: ApiAnalysis> Api<T> {
pub(crate) fn typename(&self) -> TypeName {
TypeName::new(&self.ns, &self.id.to_string())
}
}
pub(crate) struct ParseResults {
pub(crate) apis: Vec<UnanalyzedApi>,
pub(crate) type_converter: TypeConverter,
}