133d722a9Sopenharmony_ciuse self::ImproperCtype::*; 233d722a9Sopenharmony_ciuse crate::syntax::atom::Atom::{self, *}; 333d722a9Sopenharmony_ciuse crate::syntax::{Type, Types}; 433d722a9Sopenharmony_ciuse proc_macro2::Ident; 533d722a9Sopenharmony_ci 633d722a9Sopenharmony_cipub enum ImproperCtype<'a> { 733d722a9Sopenharmony_ci Definite(bool), 833d722a9Sopenharmony_ci Depends(&'a Ident), 933d722a9Sopenharmony_ci} 1033d722a9Sopenharmony_ci 1133d722a9Sopenharmony_ciimpl<'a> Types<'a> { 1233d722a9Sopenharmony_ci // yes, no, maybe 1333d722a9Sopenharmony_ci pub fn determine_improper_ctype(&self, ty: &Type) -> ImproperCtype<'a> { 1433d722a9Sopenharmony_ci match ty { 1533d722a9Sopenharmony_ci Type::Ident(ident) => { 1633d722a9Sopenharmony_ci let ident = &ident.rust; 1733d722a9Sopenharmony_ci if let Some(atom) = Atom::from(ident) { 1833d722a9Sopenharmony_ci Definite(atom == RustString) 1933d722a9Sopenharmony_ci } else if let Some(strct) = self.structs.get(ident) { 2033d722a9Sopenharmony_ci Depends(&strct.name.rust) // iterate to fixed-point 2133d722a9Sopenharmony_ci } else { 2233d722a9Sopenharmony_ci Definite(self.rust.contains(ident) || self.aliases.contains_key(ident)) 2333d722a9Sopenharmony_ci } 2433d722a9Sopenharmony_ci } 2533d722a9Sopenharmony_ci Type::RustBox(_) 2633d722a9Sopenharmony_ci | Type::RustVec(_) 2733d722a9Sopenharmony_ci | Type::Str(_) 2833d722a9Sopenharmony_ci | Type::Fn(_) 2933d722a9Sopenharmony_ci | Type::Void(_) 3033d722a9Sopenharmony_ci | Type::SliceRef(_) => Definite(true), 3133d722a9Sopenharmony_ci Type::UniquePtr(_) | Type::SharedPtr(_) | Type::WeakPtr(_) | Type::CxxVector(_) => { 3233d722a9Sopenharmony_ci Definite(false) 3333d722a9Sopenharmony_ci } 3433d722a9Sopenharmony_ci Type::Ref(ty) => self.determine_improper_ctype(&ty.inner), 3533d722a9Sopenharmony_ci Type::Ptr(ty) => self.determine_improper_ctype(&ty.inner), 3633d722a9Sopenharmony_ci Type::Array(ty) => self.determine_improper_ctype(&ty.inner), 3733d722a9Sopenharmony_ci } 3833d722a9Sopenharmony_ci } 3933d722a9Sopenharmony_ci} 40