Implement set_namespace helper for OutFile
diff --git a/gen/src/alphasort.rs b/gen/src/alphasort.rs
index 95b49a6..5c21bc4 100644
--- a/gen/src/alphasort.rs
+++ b/gen/src/alphasort.rs
@@ -1,9 +1,11 @@
+use crate::syntax::namespace::Namespace;
use crate::syntax::Api;
use proc_macro2::Ident;
use std::collections::BTreeMap;
use std::iter::FromIterator;
pub struct NamespaceEntries<'a> {
+ pub namespace: Namespace,
direct: Vec<&'a Api>,
nested: BTreeMap<&'a Ident, NamespaceEntries<'a>>,
}
@@ -45,7 +47,17 @@
.map(|(k, apis)| (k, sort_by_inner_namespace(apis, depth + 1)))
.collect();
- NamespaceEntries { direct, nested }
+ let namespace = apis
+ .first()
+ .copied()
+ .and_then(Api::namespace)
+ .map_or(Namespace::ROOT, |ns| ns.iter().take(depth).collect());
+
+ NamespaceEntries {
+ namespace,
+ direct,
+ nested,
+ }
}
#[cfg(test)]
diff --git a/gen/src/out.rs b/gen/src/out.rs
index 2733c32..bf880cc 100644
--- a/gen/src/out.rs
+++ b/gen/src/out.rs
@@ -2,6 +2,7 @@
use crate::gen::builtin::Builtins;
use crate::gen::include::Includes;
use crate::gen::Opt;
+use crate::syntax::namespace::Namespace;
use crate::syntax::Types;
use std::cell::RefCell;
use std::fmt::{self, Arguments, Write};
@@ -18,6 +19,7 @@
#[derive(Default)]
pub struct Content<'a> {
bytes: String,
+ namespace: &'a Namespace,
blocks: Vec<BlockBoundary<'a>>,
section_pending: bool,
blocks_pending: usize,
@@ -54,6 +56,10 @@
self.content.get_mut().end_block(block);
}
+ pub fn set_namespace(&mut self, namespace: &'a Namespace) {
+ self.content.get_mut().set_namespace(namespace);
+ }
+
pub fn write_fmt(&self, args: Arguments) {
let content = &mut *self.content.borrow_mut();
Write::write_fmt(content, args).unwrap();
@@ -118,6 +124,16 @@
self.push_block_boundary(BlockBoundary::End(block));
}
+ pub fn set_namespace(&mut self, namespace: &'a Namespace) {
+ for name in self.namespace.iter().rev() {
+ self.end_block(Block::UserDefinedNamespace(name));
+ }
+ for name in namespace {
+ self.begin_block(Block::UserDefinedNamespace(name));
+ }
+ self.namespace = namespace;
+ }
+
pub fn write_fmt(&mut self, args: Arguments) {
Write::write_fmt(self, args).unwrap();
}
@@ -147,6 +163,7 @@
}
fn flush(&mut self) {
+ self.set_namespace(Default::default());
if self.blocks_pending > 0 {
self.flush_blocks();
}
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 0b6a5aa..352d643 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -57,7 +57,8 @@
}
}
-fn gen_namespace_contents<'a>(out: &mut OutFile<'a>, ns_entries: &NamespaceEntries<'a>) {
+fn gen_namespace_contents<'a>(out: &mut OutFile<'a>, ns_entries: &'a NamespaceEntries<'a>) {
+ out.set_namespace(&ns_entries.namespace);
let apis = ns_entries.direct_content();
let mut methods_for_type = HashMap::new();
@@ -127,11 +128,8 @@
}
}
- for (namespace, nested_ns_entries) in ns_entries.nested_content() {
- let block = Block::UserDefinedNamespace(namespace);
- out.begin_block(block);
+ for (_, nested_ns_entries) in ns_entries.nested_content() {
gen_namespace_contents(out, nested_ns_entries);
- out.end_block(block);
}
}
@@ -974,6 +972,7 @@
}
fn write_generic_instantiations(out: &mut OutFile) {
+ out.set_namespace(Default::default());
out.begin_block(Block::ExternC);
for ty in out.types {
if let Type::RustBox(ty) = ty {