| use self::ImproperCtype::*; |
| use crate::syntax::atom::Atom::{self, *}; |
| use crate::syntax::{Type, Types}; |
| use proc_macro2::Ident; |
| |
| pub enum ImproperCtype<'a> { |
| Definite(bool), |
| Depends(&'a Ident), |
| } |
| |
| impl<'a> Types<'a> { |
| // yes, no, maybe |
| pub fn determine_improper_ctype(&self, ty: &Type) -> ImproperCtype<'a> { |
| match ty { |
| Type::Ident(ident) => { |
| let ident = &ident.rust; |
| if let Some(atom) = Atom::from(ident) { |
| Definite(atom == RustString) |
| } else if let Some(strct) = self.structs.get(ident) { |
| Depends(&strct.name.rust) // iterate to fixed-point |
| } else { |
| Definite(self.rust.contains(ident) || self.aliases.contains_key(ident)) |
| } |
| } |
| Type::RustBox(_) |
| | Type::RustVec(_) |
| | Type::Str(_) |
| | Type::Fn(_) |
| | Type::Void(_) |
| | Type::SliceRef(_) => Definite(true), |
| Type::UniquePtr(_) | Type::SharedPtr(_) | Type::WeakPtr(_) | Type::CxxVector(_) => { |
| Definite(false) |
| } |
| Type::Ref(ty) => self.determine_improper_ctype(&ty.inner), |
| Type::Ptr(ty) => self.determine_improper_ctype(&ty.inner), |
| Type::Array(ty) => self.determine_improper_ctype(&ty.inner), |
| } |
| } |
| } |