133d722a9Sopenharmony_ciuse crate::syntax::Type; 233d722a9Sopenharmony_ciuse proc_macro2::Ident; 333d722a9Sopenharmony_ciuse std::fmt::{self, Display}; 433d722a9Sopenharmony_ci 533d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq)] 633d722a9Sopenharmony_cipub enum Atom { 733d722a9Sopenharmony_ci Bool, 833d722a9Sopenharmony_ci Char, // C char, not Rust char 933d722a9Sopenharmony_ci U8, 1033d722a9Sopenharmony_ci U16, 1133d722a9Sopenharmony_ci U32, 1233d722a9Sopenharmony_ci U64, 1333d722a9Sopenharmony_ci Usize, 1433d722a9Sopenharmony_ci I8, 1533d722a9Sopenharmony_ci I16, 1633d722a9Sopenharmony_ci I32, 1733d722a9Sopenharmony_ci I64, 1833d722a9Sopenharmony_ci Isize, 1933d722a9Sopenharmony_ci F32, 2033d722a9Sopenharmony_ci F64, 2133d722a9Sopenharmony_ci CxxString, 2233d722a9Sopenharmony_ci RustString, 2333d722a9Sopenharmony_ci} 2433d722a9Sopenharmony_ci 2533d722a9Sopenharmony_ciimpl Atom { 2633d722a9Sopenharmony_ci pub fn from(ident: &Ident) -> Option<Self> { 2733d722a9Sopenharmony_ci Self::from_str(ident.to_string().as_str()) 2833d722a9Sopenharmony_ci } 2933d722a9Sopenharmony_ci 3033d722a9Sopenharmony_ci pub fn from_str(s: &str) -> Option<Self> { 3133d722a9Sopenharmony_ci use self::Atom::*; 3233d722a9Sopenharmony_ci match s { 3333d722a9Sopenharmony_ci "bool" => Some(Bool), 3433d722a9Sopenharmony_ci "c_char" => Some(Char), 3533d722a9Sopenharmony_ci "u8" => Some(U8), 3633d722a9Sopenharmony_ci "u16" => Some(U16), 3733d722a9Sopenharmony_ci "u32" => Some(U32), 3833d722a9Sopenharmony_ci "u64" => Some(U64), 3933d722a9Sopenharmony_ci "usize" => Some(Usize), 4033d722a9Sopenharmony_ci "i8" => Some(I8), 4133d722a9Sopenharmony_ci "i16" => Some(I16), 4233d722a9Sopenharmony_ci "i32" => Some(I32), 4333d722a9Sopenharmony_ci "i64" => Some(I64), 4433d722a9Sopenharmony_ci "isize" => Some(Isize), 4533d722a9Sopenharmony_ci "f32" => Some(F32), 4633d722a9Sopenharmony_ci "f64" => Some(F64), 4733d722a9Sopenharmony_ci "CxxString" => Some(CxxString), 4833d722a9Sopenharmony_ci "String" => Some(RustString), 4933d722a9Sopenharmony_ci _ => None, 5033d722a9Sopenharmony_ci } 5133d722a9Sopenharmony_ci } 5233d722a9Sopenharmony_ci} 5333d722a9Sopenharmony_ci 5433d722a9Sopenharmony_ciimpl Display for Atom { 5533d722a9Sopenharmony_ci fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 5633d722a9Sopenharmony_ci formatter.write_str(self.as_ref()) 5733d722a9Sopenharmony_ci } 5833d722a9Sopenharmony_ci} 5933d722a9Sopenharmony_ci 6033d722a9Sopenharmony_ciimpl AsRef<str> for Atom { 6133d722a9Sopenharmony_ci fn as_ref(&self) -> &str { 6233d722a9Sopenharmony_ci use self::Atom::*; 6333d722a9Sopenharmony_ci match self { 6433d722a9Sopenharmony_ci Bool => "bool", 6533d722a9Sopenharmony_ci Char => "c_char", 6633d722a9Sopenharmony_ci U8 => "u8", 6733d722a9Sopenharmony_ci U16 => "u16", 6833d722a9Sopenharmony_ci U32 => "u32", 6933d722a9Sopenharmony_ci U64 => "u64", 7033d722a9Sopenharmony_ci Usize => "usize", 7133d722a9Sopenharmony_ci I8 => "i8", 7233d722a9Sopenharmony_ci I16 => "i16", 7333d722a9Sopenharmony_ci I32 => "i32", 7433d722a9Sopenharmony_ci I64 => "i64", 7533d722a9Sopenharmony_ci Isize => "isize", 7633d722a9Sopenharmony_ci F32 => "f32", 7733d722a9Sopenharmony_ci F64 => "f64", 7833d722a9Sopenharmony_ci CxxString => "CxxString", 7933d722a9Sopenharmony_ci RustString => "String", 8033d722a9Sopenharmony_ci } 8133d722a9Sopenharmony_ci } 8233d722a9Sopenharmony_ci} 8333d722a9Sopenharmony_ci 8433d722a9Sopenharmony_ciimpl PartialEq<Atom> for Type { 8533d722a9Sopenharmony_ci fn eq(&self, atom: &Atom) -> bool { 8633d722a9Sopenharmony_ci match self { 8733d722a9Sopenharmony_ci Type::Ident(ident) => ident.rust == atom, 8833d722a9Sopenharmony_ci _ => false, 8933d722a9Sopenharmony_ci } 9033d722a9Sopenharmony_ci } 9133d722a9Sopenharmony_ci} 9233d722a9Sopenharmony_ci 9333d722a9Sopenharmony_ciimpl PartialEq<Atom> for &Ident { 9433d722a9Sopenharmony_ci fn eq(&self, atom: &Atom) -> bool { 9533d722a9Sopenharmony_ci *self == atom 9633d722a9Sopenharmony_ci } 9733d722a9Sopenharmony_ci} 9833d722a9Sopenharmony_ci 9933d722a9Sopenharmony_ciimpl PartialEq<Atom> for &Type { 10033d722a9Sopenharmony_ci fn eq(&self, atom: &Atom) -> bool { 10133d722a9Sopenharmony_ci *self == atom 10233d722a9Sopenharmony_ci } 10333d722a9Sopenharmony_ci} 104