Code review comments on namespace work.
diff --git a/gen/src/namespace_organizer.rs b/gen/src/namespace_organizer.rs
index c54e784..ee7408e 100644
--- a/gen/src/namespace_organizer.rs
+++ b/gen/src/namespace_organizer.rs
@@ -2,39 +2,49 @@
use proc_macro2::Ident;
use std::collections::BTreeMap;
-pub(crate) struct NamespaceEntries<'a> {
- pub(crate) entries: Vec<&'a Api>,
- pub(crate) children: BTreeMap<&'a Ident, NamespaceEntries<'a>>,
+pub struct NamespaceEntries<'a> {
+ entries: Vec<&'a Api>,
+ children: BTreeMap<&'a Ident, NamespaceEntries<'a>>,
}
-pub(crate) fn sort_by_namespace(apis: &[Api]) -> NamespaceEntries {
- let api_refs = apis.iter().collect::<Vec<_>>();
- sort_by_inner_namespace(api_refs, 0)
-}
+impl<'a> NamespaceEntries<'a> {
+ pub fn new(apis: &'a [Api]) -> Self {
+ let api_refs = apis.iter().collect::<Vec<_>>();
+ Self::sort_by_inner_namespace(api_refs, 0)
+ }
-fn sort_by_inner_namespace(apis: Vec<&Api>, depth: usize) -> NamespaceEntries {
- let mut root = NamespaceEntries {
- entries: Vec::new(),
- children: BTreeMap::new(),
- };
+ pub fn entries(&self) -> &[&'a Api] {
+ &self.entries
+ }
- let mut kids_by_child_ns = BTreeMap::new();
- for api in apis {
- if let Some(ns) = api.get_namespace() {
- let first_ns_elem = ns.iter().nth(depth);
- if let Some(first_ns_elem) = first_ns_elem {
- let list = kids_by_child_ns.entry(first_ns_elem).or_insert(Vec::new());
- list.push(api);
- continue;
+ pub fn children(&self) -> impl Iterator<Item = (&&Ident, &NamespaceEntries)> {
+ self.children.iter()
+ }
+
+ fn sort_by_inner_namespace(apis: Vec<&'a Api>, depth: usize) -> Self {
+ let mut root = NamespaceEntries {
+ entries: Vec::new(),
+ children: BTreeMap::new(),
+ };
+
+ let mut kids_by_child_ns = BTreeMap::new();
+ for api in apis {
+ if let Some(ns) = api.get_namespace() {
+ let first_ns_elem = ns.iter().nth(depth);
+ if let Some(first_ns_elem) = first_ns_elem {
+ let list = kids_by_child_ns.entry(first_ns_elem).or_insert(Vec::new());
+ list.push(api);
+ continue;
+ }
}
+ root.entries.push(api);
}
- root.entries.push(api);
- }
- for (k, v) in kids_by_child_ns.into_iter() {
- root.children
- .insert(k, sort_by_inner_namespace(v, depth + 1));
- }
+ for (k, v) in kids_by_child_ns.into_iter() {
+ root.children
+ .insert(k, Self::sort_by_inner_namespace(v, depth + 1));
+ }
- root
+ root
+ }
}
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 967d4ff..7e7a9ea 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -1,4 +1,4 @@
-use crate::gen::namespace_organizer::{sort_by_namespace, NamespaceEntries};
+use crate::gen::namespace_organizer::NamespaceEntries;
use crate::gen::out::OutFile;
use crate::gen::{include, Opt};
use crate::syntax::atom::Atom::{self, *};
@@ -30,7 +30,7 @@
out.next_section();
- let apis_by_namespace = sort_by_namespace(apis);
+ let apis_by_namespace = NamespaceEntries::new(apis);
gen_namespace_contents(&apis_by_namespace, types, opt, header, out);
@@ -51,10 +51,10 @@
header: bool,
out: &mut OutFile,
) {
- let apis = &ns_entries.entries;
+ let apis = ns_entries.entries();
out.next_section();
- for api in apis {
+ for api in apis.into_iter() {
match api {
Api::Struct(strct) => write_struct_decl(out, &strct.ident.cxx.ident),
Api::CxxType(ety) => write_struct_using(out, &ety.ident.cxx),
@@ -64,7 +64,7 @@
}
let mut methods_for_type = HashMap::new();
- for api in apis {
+ for api in apis.into_iter() {
if let Api::RustFunction(efn) = api {
if let Some(receiver) = &efn.sig.receiver {
methods_for_type
@@ -134,7 +134,7 @@
out.next_section();
- for (child_ns, child_ns_entries) in &ns_entries.children {
+ for (child_ns, child_ns_entries) in ns_entries.children() {
writeln!(out, "namespace {} {{", child_ns);
gen_namespace_contents(&child_ns_entries, types, opt, header, out);
writeln!(out, "}} // namespace {}", child_ns);