diff --git a/gen/src/write.rs b/gen/src/write.rs index f25922239..dfdade22e 100644 --- a/gen/src/write.rs +++ b/gen/src/write.rs @@ -32,6 +32,7 @@ pub(super) fn gen<'a>(apis: &[Api], types: &'a Types, opt: &Opt, header: bool) - let apis_by_namespace = NamespaceEntries::new(apis); + gen_namespace_forward_declarations(&apis_by_namespace, out); gen_namespace_contents(&apis_by_namespace, types, opt, header, out); if !header { @@ -44,13 +45,7 @@ pub(super) fn gen<'a>(apis: &[Api], types: &'a Types, opt: &Opt, header: bool) - out_file } -fn gen_namespace_contents( - ns_entries: &NamespaceEntries, - types: &Types, - opt: &Opt, - header: bool, - out: &mut OutFile, -) { +fn gen_namespace_forward_declarations(ns_entries: &NamespaceEntries, out: &mut OutFile) { let apis = ns_entries.entries(); out.next_section(); @@ -63,6 +58,24 @@ fn gen_namespace_contents( } } + out.next_section(); + + for (child_ns, child_ns_entries) in ns_entries.children() { + writeln!(out, "namespace {} {{", child_ns); + gen_namespace_forward_declarations(&child_ns_entries, out); + writeln!(out, "}} // namespace {}", child_ns); + } +} + +fn gen_namespace_contents( + ns_entries: &NamespaceEntries, + types: &Types, + opt: &Opt, + header: bool, + out: &mut OutFile, +) { + let apis = ns_entries.entries(); + let mut methods_for_type = HashMap::new(); for api in apis.iter() { if let Api::RustFunction(efn) = api { diff --git a/tests/ffi/lib.rs b/tests/ffi/lib.rs index fee5bcb11..c79aff3d1 100644 --- a/tests/ffi/lib.rs +++ b/tests/ffi/lib.rs @@ -101,6 +101,16 @@ pub mod ffi { z: usize, } + #[namespace = "first"] + struct First { + second: Box, + } + + #[namespace = "second"] + struct Second { + i: i32, + } + extern "C" { include!("tests/ffi/tests.h");