- pub fn mirrored_enum_declared(&mut self, ident: &syn::Ident) {
- self.declared.insert(ident.clone(), DeclType::MirroredEnum);
- }
- pub fn enum_ignored(&mut self, ident: &'crate_lft syn::Ident) {
- self.declared.insert(ident.clone(), DeclType::EnumIgnored);
- }
- pub fn struct_imported(&mut self, ident: &'crate_lft syn::Ident) {
- self.declared.insert(ident.clone(), DeclType::StructImported);
- }
- pub fn struct_ignored(&mut self, ident: &syn::Ident) {
- self.declared.insert(ident.clone(), DeclType::StructIgnored);
- }
- pub fn trait_declared(&mut self, ident: &syn::Ident, t: &'crate_lft syn::ItemTrait) {
- self.declared.insert(ident.clone(), DeclType::Trait(t));
+ pub fn new(module_path: &'mod_lifetime str, contents: &'crate_lft [syn::Item]) -> Self {
+ let mut imports = HashMap::new();
+ // Add primitives to the "imports" list:
+ imports.insert(syn::Ident::new("bool", Span::call_site()), "bool".to_string());
+ imports.insert(syn::Ident::new("u64", Span::call_site()), "u64".to_string());
+ imports.insert(syn::Ident::new("u32", Span::call_site()), "u32".to_string());
+ imports.insert(syn::Ident::new("u16", Span::call_site()), "u16".to_string());
+ imports.insert(syn::Ident::new("u8", Span::call_site()), "u8".to_string());
+ imports.insert(syn::Ident::new("usize", Span::call_site()), "usize".to_string());
+ imports.insert(syn::Ident::new("str", Span::call_site()), "str".to_string());
+ imports.insert(syn::Ident::new("String", Span::call_site()), "String".to_string());
+
+ // These are here to allow us to print native Rust types in trait fn impls even if we don't
+ // have C mappings:
+ imports.insert(syn::Ident::new("Result", Span::call_site()), "Result".to_string());
+ imports.insert(syn::Ident::new("Vec", Span::call_site()), "Vec".to_string());
+ imports.insert(syn::Ident::new("Option", Span::call_site()), "Option".to_string());
+
+ let mut declared = HashMap::new();
+
+ for item in contents.iter() {
+ match item {
+ syn::Item::Use(u) => Self::process_use(&mut imports, &u),
+ syn::Item::Struct(s) => {
+ if let syn::Visibility::Public(_) = s.vis {
+ match export_status(&s.attrs) {
+ ExportStatus::Export => { declared.insert(s.ident.clone(), DeclType::StructImported); },
+ ExportStatus::NoExport => { declared.insert(s.ident.clone(), DeclType::StructIgnored); },
+ ExportStatus::TestOnly => continue,
+ }
+ }
+ },
+ syn::Item::Enum(e) => {
+ if let syn::Visibility::Public(_) = e.vis {
+ match export_status(&e.attrs) {
+ ExportStatus::Export if is_enum_opaque(e) => { declared.insert(e.ident.clone(), DeclType::EnumIgnored); },
+ ExportStatus::Export => { declared.insert(e.ident.clone(), DeclType::MirroredEnum); },
+ _ => continue,
+ }
+ }
+ },
+ syn::Item::Trait(t) if export_status(&t.attrs) == ExportStatus::Export => {
+ if let syn::Visibility::Public(_) = t.vis {
+ declared.insert(t.ident.clone(), DeclType::Trait(t));
+ }
+ },
+ _ => {},
+ }
+ }
+
+ Self { module_path, imports, declared }