Emit all data structures before all functions
diff --git a/gen/src/write.rs b/gen/src/write.rs
index 0369ef5..8a4133c 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -20,7 +20,8 @@
 
     let apis_by_namespace = NamespaceEntries::new(apis);
     write_namespace_forward_declarations(out, &apis_by_namespace);
-    write_namespace_contents(out, &apis_by_namespace);
+    write_namespace_data_structures(out, &apis_by_namespace);
+    write_namespace_functions(out, &apis_by_namespace);
 
     if !header {
         out.next_section();
@@ -53,7 +54,10 @@
     }
 }
 
-fn write_namespace_contents<'a>(out: &mut OutFile<'a>, ns_entries: &'a NamespaceEntries<'a>) {
+fn write_namespace_data_structures<'a>(
+    out: &mut OutFile<'a>,
+    ns_entries: &'a NamespaceEntries<'a>,
+) {
     let apis = ns_entries.direct_content();
 
     let mut methods_for_type = HashMap::new();
@@ -103,6 +107,14 @@
         }
     }
 
+    for (_, nested_ns_entries) in ns_entries.nested_content() {
+        write_namespace_data_structures(out, nested_ns_entries);
+    }
+}
+
+fn write_namespace_functions<'a>(out: &mut OutFile<'a>, ns_entries: &'a NamespaceEntries<'a>) {
+    let apis = ns_entries.direct_content();
+
     if !out.header {
         for api in apis {
             match api {
@@ -121,7 +133,7 @@
     }
 
     for (_, nested_ns_entries) in ns_entries.nested_content() {
-        write_namespace_contents(out, nested_ns_entries);
+        write_namespace_functions(out, nested_ns_entries);
     }
 }