Emit fields as a json map of name to type
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index f852308..931a30a 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -11,6 +11,7 @@
 //! 3. The path to `syn` is hardcoded.
 
 use crate::types;
+use indexmap::IndexMap;
 use proc_macro2::TokenStream;
 
 use std::fs::File;
@@ -516,21 +517,21 @@
             types::Node::Struct(ref v) => {
                 let mut fold_fields = TokenStream::new();
 
-                for field in v.fields() {
-                    let id = Ident::new(field.ident(), Span::call_site());
+                for (field, ty) in v.fields() {
+                    let id = Ident::new(field, Span::call_site());
                     let ref_toks = Owned(quote!(_i.#id));
-                    let visit_field = visit(field.ty(), v.features(), defs, Visit, &ref_toks)
+                    let visit_field = visit(ty, v.features(), defs, Visit, &ref_toks)
                         .unwrap_or_else(|| noop_visit(Visit, &ref_toks));
                     visit_impl.append_all(quote! {
                         #visit_field;
                     });
                     let visit_mut_field =
-                        visit(field.ty(), v.features(), defs, VisitMut, &ref_toks)
+                        visit(ty, v.features(), defs, VisitMut, &ref_toks)
                             .unwrap_or_else(|| noop_visit(VisitMut, &ref_toks));
                     visit_mut_impl.append_all(quote! {
                         #visit_mut_field;
                     });
-                    let fold = visit(field.ty(), v.features(), defs, Fold, &ref_toks)
+                    let fold = visit(ty, v.features(), defs, Fold, &ref_toks)
                         .unwrap_or_else(|| noop_visit(Fold, &ref_toks));
 
                     fold_fields.append_all(quote! {
@@ -645,7 +646,7 @@
         defs.insert(types::Node::Struct(types::Struct::new(
                     tt.to_string(),
                     types::Features::default(),
-                    vec![],
+                    IndexMap::new(),
                     true)
         ));
     }