Check type name duplication more compactly
diff --git a/syntax/set.rs b/syntax/set.rs
index ca816cf..688d1c0 100644
--- a/syntax/set.rs
+++ b/syntax/set.rs
@@ -18,10 +18,12 @@
}
}
- pub fn insert(&mut self, value: &'a T) {
- if self.set.insert(value) {
+ pub fn insert(&mut self, value: &'a T) -> bool {
+ let new = self.set.insert(value);
+ if new {
self.vec.push(value);
}
+ new
}
pub fn contains(&self, value: &T) -> bool {
diff --git a/syntax/types.rs b/syntax/types.rs
index bb5a843..11db1b7 100644
--- a/syntax/types.rs
+++ b/syntax/types.rs
@@ -3,7 +3,7 @@
use crate::syntax::{Api, Derive, Enum, ExternType, Struct, Type};
use proc_macro2::Ident;
use quote::quote;
-use std::collections::BTreeMap as Map;
+use std::collections::{BTreeMap as Map, HashSet as UnorderedSet};
use syn::{Error, Result};
pub struct Types<'a> {
@@ -43,16 +43,12 @@
}
}
+ let mut type_names = UnorderedSet::new();
for api in apis {
match api {
Api::Include(_) => {}
Api::Struct(strct) => {
- let ident = &strct.ident;
- if structs.contains_key(ident)
- || enums.contains_key(ident)
- || cxx.contains(ident)
- || rust.contains(ident)
- {
+ if !type_names.insert(&strct.ident) {
return Err(duplicate_struct(strct));
}
structs.insert(strct.ident.clone(), strct);
@@ -61,37 +57,22 @@
}
}
Api::Enum(enm) => {
- let ident = &enm.ident;
- if structs.contains_key(ident)
- || enums.contains_key(ident)
- || cxx.contains(ident)
- || rust.contains(ident)
- {
+ if !type_names.insert(&enm.ident) {
return Err(duplicate_enum(enm));
}
enums.insert(enm.ident.clone(), enm);
}
Api::CxxType(ety) => {
- let ident = &ety.ident;
- if structs.contains_key(ident)
- || enums.contains_key(ident)
- || cxx.contains(ident)
- || rust.contains(ident)
- {
+ if !type_names.insert(&ety.ident) {
return Err(duplicate_type(ety));
}
- cxx.insert(ident);
+ cxx.insert(&ety.ident);
}
Api::RustType(ety) => {
- let ident = &ety.ident;
- if structs.contains_key(ident)
- || enums.contains_key(ident)
- || cxx.contains(ident)
- || rust.contains(ident)
- {
+ if !type_names.insert(&ety.ident) {
return Err(duplicate_type(ety));
}
- rust.insert(ident);
+ rust.insert(&ety.ident);
}
Api::CxxFunction(efn) | Api::RustFunction(efn) => {
for arg in &efn.args {