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