More useful literal api
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 7a94df8..c9f349e 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -255,6 +255,22 @@
 fn fold_lifetime_def(&mut self, i: LifetimeDef) -> LifetimeDef { fold_lifetime_def(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn fold_lit(&mut self, i: Lit) -> Lit { fold_lit(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_bool(&mut self, i: LitBool) -> LitBool { fold_lit_bool(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_byte(&mut self, i: LitByte) -> LitByte { fold_lit_byte(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_byte_str(&mut self, i: LitByteStr) -> LitByteStr { fold_lit_byte_str(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_char(&mut self, i: LitChar) -> LitChar { fold_lit_char(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_float(&mut self, i: LitFloat) -> LitFloat { fold_lit_float(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_int(&mut self, i: LitInt) -> LitInt { fold_lit_int(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_str(&mut self, i: LitStr) -> LitStr { fold_lit_str(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn fold_lit_verbatim(&mut self, i: LitVerbatim) -> LitVerbatim { fold_lit_verbatim(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 fn fold_local(&mut self, i: Local) -> Local { fold_local(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
@@ -406,15 +422,29 @@
 
 }
 
-pub fn fold_ident<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Ident) -> Ident {
-    _i.span = _visitor.fold_span(_i.span);
-    _i
+macro_rules! fold_span_only {
+    ($f:ident : $t:ident) => {
+        pub fn $f<V: Folder + ?Sized>(_visitor: &mut V, mut _i: $t) -> $t {
+            _i.span = _visitor.fold_span(_i.span);
+            _i
+        }
+    }
 }
 
-pub fn fold_lifetime<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Lifetime) -> Lifetime {
-    _i.span = _visitor.fold_span(_i.span);
-    _i
-}
+fold_span_only!(fold_ident: Ident);
+fold_span_only!(fold_lifetime: Lifetime);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_byte: LitByte);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_byte_str: LitByteStr);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_char: LitChar);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_float: LitFloat);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_int: LitInt);
+#[cfg(any(feature = "full", feature = "derive"))]
+fold_span_only!(fold_lit_str: LitStr);
 
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn fold_abi<V: Folder + ?Sized>(_visitor: &mut V, _i: Abi) -> Abi {
@@ -1959,11 +1989,63 @@
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn fold_lit<V: Folder + ?Sized>(_visitor: &mut V, _i: Lit) -> Lit {
-    Lit {
+    match _i {
+        Lit::Str(_binding_0, ) => {
+            Lit::Str (
+                _visitor.fold_lit_str(_binding_0),
+            )
+        }
+        Lit::ByteStr(_binding_0, ) => {
+            Lit::ByteStr (
+                _visitor.fold_lit_byte_str(_binding_0),
+            )
+        }
+        Lit::Byte(_binding_0, ) => {
+            Lit::Byte (
+                _visitor.fold_lit_byte(_binding_0),
+            )
+        }
+        Lit::Char(_binding_0, ) => {
+            Lit::Char (
+                _visitor.fold_lit_char(_binding_0),
+            )
+        }
+        Lit::Int(_binding_0, ) => {
+            Lit::Int (
+                _visitor.fold_lit_int(_binding_0),
+            )
+        }
+        Lit::Float(_binding_0, ) => {
+            Lit::Float (
+                _visitor.fold_lit_float(_binding_0),
+            )
+        }
+        Lit::Bool(_binding_0, ) => {
+            Lit::Bool (
+                _visitor.fold_lit_bool(_binding_0),
+            )
+        }
+        Lit::Verbatim(_binding_0, ) => {
+            Lit::Verbatim (
+                _visitor.fold_lit_verbatim(_binding_0),
+            )
+        }
+    }
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn fold_lit_bool<V: Folder + ?Sized>(_visitor: &mut V, _i: LitBool) -> LitBool {
+    LitBool {
         value: _i . value,
         span: _visitor.fold_span(_i . span),
     }
 }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn fold_lit_verbatim<V: Folder + ?Sized>(_visitor: &mut V, _i: LitVerbatim) -> LitVerbatim {
+    LitVerbatim {
+        token: _i . token,
+        span: _visitor.fold_span(_i . span),
+    }
+}
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 pub fn fold_local<V: Folder + ?Sized>(_visitor: &mut V, _i: Local) -> Local {
     Local {
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index b9338a5..aaf9377 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -252,6 +252,22 @@
 fn visit_lifetime_def(&mut self, i: &'ast LifetimeDef) { visit_lifetime_def(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_lit(&mut self, i: &'ast Lit) { visit_lit(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_bool(&mut self, i: &'ast LitBool) { visit_lit_bool(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_byte(&mut self, i: &'ast LitByte) { visit_lit_byte(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_byte_str(&mut self, i: &'ast LitByteStr) { visit_lit_byte_str(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_char(&mut self, i: &'ast LitChar) { visit_lit_char(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_float(&mut self, i: &'ast LitFloat) { visit_lit_float(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_int(&mut self, i: &'ast LitInt) { visit_lit_int(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_str(&mut self, i: &'ast LitStr) { visit_lit_str(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_verbatim(&mut self, i: &'ast LitVerbatim) { visit_lit_verbatim(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 fn visit_local(&mut self, i: &'ast Local) { visit_local(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
@@ -1542,9 +1558,73 @@
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn visit_lit<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Lit) {
+    match *_i {
+        Lit::Str(ref _binding_0, ) => {
+            _visitor.visit_lit_str(_binding_0);
+        }
+        Lit::ByteStr(ref _binding_0, ) => {
+            _visitor.visit_lit_byte_str(_binding_0);
+        }
+        Lit::Byte(ref _binding_0, ) => {
+            _visitor.visit_lit_byte(_binding_0);
+        }
+        Lit::Char(ref _binding_0, ) => {
+            _visitor.visit_lit_char(_binding_0);
+        }
+        Lit::Int(ref _binding_0, ) => {
+            _visitor.visit_lit_int(_binding_0);
+        }
+        Lit::Float(ref _binding_0, ) => {
+            _visitor.visit_lit_float(_binding_0);
+        }
+        Lit::Bool(ref _binding_0, ) => {
+            _visitor.visit_lit_bool(_binding_0);
+        }
+        Lit::Verbatim(ref _binding_0, ) => {
+            _visitor.visit_lit_verbatim(_binding_0);
+        }
+    }
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_bool<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitBool) {
     // Skipped field _i . value;
     _visitor.visit_span(& _i . span);
 }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_byte<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitByte) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_byte_str<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitByteStr) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_char<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitChar) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_float<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitFloat) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_int<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitInt) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_str<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitStr) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_verbatim<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast LitVerbatim) {
+    // Skipped field _i . token;
+    _visitor.visit_span(& _i . span);
+}
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 pub fn visit_local<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Local) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 77556bd..a15936d 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -252,6 +252,22 @@
 fn visit_lifetime_def_mut(&mut self, i: &mut LifetimeDef) { visit_lifetime_def_mut(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_lit_mut(&mut self, i: &mut Lit) { visit_lit_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_bool_mut(&mut self, i: &mut LitBool) { visit_lit_bool_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_byte_mut(&mut self, i: &mut LitByte) { visit_lit_byte_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_byte_str_mut(&mut self, i: &mut LitByteStr) { visit_lit_byte_str_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_char_mut(&mut self, i: &mut LitChar) { visit_lit_char_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_float_mut(&mut self, i: &mut LitFloat) { visit_lit_float_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_int_mut(&mut self, i: &mut LitInt) { visit_lit_int_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_str_mut(&mut self, i: &mut LitStr) { visit_lit_str_mut(self, i) }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+fn visit_lit_verbatim_mut(&mut self, i: &mut LitVerbatim) { visit_lit_verbatim_mut(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 fn visit_local_mut(&mut self, i: &mut Local) { visit_local_mut(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
@@ -1542,9 +1558,73 @@
 }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 pub fn visit_lit_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Lit) {
+    match *_i {
+        Lit::Str(ref mut _binding_0, ) => {
+            _visitor.visit_lit_str_mut(_binding_0);
+        }
+        Lit::ByteStr(ref mut _binding_0, ) => {
+            _visitor.visit_lit_byte_str_mut(_binding_0);
+        }
+        Lit::Byte(ref mut _binding_0, ) => {
+            _visitor.visit_lit_byte_mut(_binding_0);
+        }
+        Lit::Char(ref mut _binding_0, ) => {
+            _visitor.visit_lit_char_mut(_binding_0);
+        }
+        Lit::Int(ref mut _binding_0, ) => {
+            _visitor.visit_lit_int_mut(_binding_0);
+        }
+        Lit::Float(ref mut _binding_0, ) => {
+            _visitor.visit_lit_float_mut(_binding_0);
+        }
+        Lit::Bool(ref mut _binding_0, ) => {
+            _visitor.visit_lit_bool_mut(_binding_0);
+        }
+        Lit::Verbatim(ref mut _binding_0, ) => {
+            _visitor.visit_lit_verbatim_mut(_binding_0);
+        }
+    }
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_bool_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitBool) {
     // Skipped field _i . value;
     _visitor.visit_span_mut(& mut _i . span);
 }
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_byte_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitByte) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_byte_str_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitByteStr) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_char_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitChar) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_float_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitFloat) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_int_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitInt) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_str_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitStr) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
+# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+pub fn visit_lit_verbatim_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut LitVerbatim) {
+    // Skipped field _i . token;
+    _visitor.visit_span_mut(& mut _i . span);
+}
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ] # [ cfg ( feature = "full" ) ]
 pub fn visit_local_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Local) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };