Fix compatibility with --no-default-features
diff --git a/src/data.rs b/src/data.rs
index 4821a7a..0f98116 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -213,7 +213,7 @@
             self.ident.to_tokens(tokens);
             self.data.to_tokens(tokens);
             if let Some(ref disc) = self.discriminant {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 disc.to_tokens(tokens);
             }
         }
@@ -243,7 +243,7 @@
             self.vis.to_tokens(tokens);
             if let Some(ref ident) = self.ident {
                 ident.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.ty.to_tokens(tokens);
         }
diff --git a/src/expr.rs b/src/expr.rs
index 3d4fbb3..f0e456b 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -2351,10 +2351,10 @@
             self.dot_token.to_tokens(tokens);
             self.method.to_tokens(tokens);
             if !self.typarams.is_empty() {
-                self.colon2_token.unwrap_or_default().to_tokens(tokens);
-                self.lt_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon2_token).to_tokens(tokens);
+                TokensOrDefault(&self.lt_token).to_tokens(tokens);
                 self.typarams.to_tokens(tokens);
-                self.gt_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.gt_token).to_tokens(tokens);
             }
             self.paren_token.surround(tokens, |tokens| {
                 self.args.to_tokens(tokens);
@@ -2418,7 +2418,7 @@
                        if_false: &Option<Box<Expr>>)
     {
         if let Some(ref if_false) = *if_false {
-            else_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&else_token).to_tokens(tokens);
 
             // If we are not one of the valid expressions to exist in an else
             // clause, wrap ourselves in a block.
@@ -2465,7 +2465,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.while_token.to_tokens(tokens);
             wrap_bare_struct(tokens, &self.cond);
@@ -2478,7 +2478,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.while_token.to_tokens(tokens);
             self.let_token.to_tokens(tokens);
@@ -2494,7 +2494,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.for_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
@@ -2509,7 +2509,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             if self.label.is_some() {
                 self.label.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.loop_token.to_tokens(tokens);
             self.body.to_tokens(tokens);
@@ -2683,7 +2683,7 @@
             self.brace_token.surround(tokens, |tokens| {
                 self.fields.to_tokens(tokens);
                 if self.rest.is_some() {
-                    self.dot2_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.dot2_token).to_tokens(tokens);
                     self.rest.to_tokens(tokens);
                 }
             })
@@ -2732,8 +2732,7 @@
             // XXX: Override self.is_shorthand if expr is not an IdentExpr with
             // the ident self.ident?
             if !self.is_shorthand {
-                self.colon_token.unwrap_or_default()
-                    .to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.expr.to_tokens(tokens);
             }
         }
@@ -2745,7 +2744,7 @@
             tokens.append_all(&self.attrs);
             self.pats.to_tokens(tokens);
             if self.guard.is_some() {
-                self.if_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.if_token).to_tokens(tokens);
                 self.guard.to_tokens(tokens);
             }
             self.rocket_token.to_tokens(tokens);
@@ -2767,7 +2766,7 @@
             self.mode.to_tokens(tokens);
             self.ident.to_tokens(tokens);
             if self.subpat.is_some() {
-                self.at_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.at_token).to_tokens(tokens);
                 self.subpat.to_tokens(tokens);
             }
         }
@@ -2809,8 +2808,8 @@
             self.paren_token.surround(tokens, |tokens| {
                 for (i, token) in self.pats.iter().enumerate() {
                     if Some(i) == self.dots_pos {
-                        self.dot2_token.unwrap_or_default().to_tokens(tokens);
-                        self.comma_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&self.dot2_token).to_tokens(tokens);
+                        TokensOrDefault(&self.comma_token).to_tokens(tokens);
                     }
                     token.to_tokens(tokens);
                 }
@@ -2878,14 +2877,14 @@
                 // If we have an identifier, we always need a .. token.
                 if self.middle.is_some() {
                     self.middle.to_tokens(tokens);
-                    self.dot2_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.dot2_token).to_tokens(tokens);
                 } else if self.dot2_token.is_some() {
                     self.dot2_token.to_tokens(tokens);
                 }
 
                 // Make sure we have a comma before the back half.
                 if !self.back.is_empty() {
-                    self.comma_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.comma_token).to_tokens(tokens);
                     self.back.to_tokens(tokens);
                 } else {
                     self.comma_token.to_tokens(tokens);
@@ -2910,7 +2909,7 @@
             // XXX: Override is_shorthand if it was wrong?
             if !self.is_shorthand {
                 self.ident.to_tokens(tokens);
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
             }
             self.pat.to_tokens(tokens);
         }
@@ -2985,11 +2984,11 @@
             self.let_token.to_tokens(tokens);
             self.pat.to_tokens(tokens);
             if self.ty.is_some() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.ty.to_tokens(tokens);
             }
             if self.init.is_some() {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 self.init.to_tokens(tokens);
             }
             self.semi_token.to_tokens(tokens);
diff --git a/src/generics.rs b/src/generics.rs
index b169f8a..08f4619 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -379,11 +379,11 @@
                 return;
             }
 
-            self.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.lt_token).to_tokens(tokens);
             self.lifetimes.to_tokens(tokens);
             maybe_add_lifetime_params_comma(tokens, self);
             self.ty_params.to_tokens(tokens);
-            self.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.gt_token).to_tokens(tokens);
         }
     }
 
@@ -393,7 +393,7 @@
                 return;
             }
 
-            self.0.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.lt_token).to_tokens(tokens);
             self.0.lifetimes.to_tokens(tokens);
             maybe_add_lifetime_params_comma(tokens, &self.0);
             for param in self.0.ty_params.iter() {
@@ -402,12 +402,12 @@
                 tokens.append_all(item.attrs.outer());
                 item.ident.to_tokens(tokens);
                 if !item.bounds.is_empty() {
-                    item.colon_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&item.colon_token).to_tokens(tokens);
                     item.bounds.to_tokens(tokens);
                 }
                 param.delimiter().to_tokens(tokens);
             }
-            self.0.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.gt_token).to_tokens(tokens);
         }
     }
 
@@ -417,7 +417,7 @@
                 return;
             }
 
-            self.0.lt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.lt_token).to_tokens(tokens);
             // Leave off the lifetime bounds and attributes
             for param in self.0.lifetimes.iter() {
                 param.item().lifetime.to_tokens(tokens);
@@ -429,7 +429,7 @@
                 param.item().ident.to_tokens(tokens);
                 param.delimiter().to_tokens(tokens);
             }
-            self.0.gt_token.unwrap_or_default().to_tokens(tokens);
+            TokensOrDefault(&self.0.gt_token).to_tokens(tokens);
         }
     }
 
@@ -456,7 +456,7 @@
             tokens.append_all(self.attrs.outer());
             self.lifetime.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
         }
@@ -467,11 +467,11 @@
             tokens.append_all(self.attrs.outer());
             self.ident.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
             if self.default.is_some() {
-                self.eq_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.eq_token).to_tokens(tokens);
                 self.default.to_tokens(tokens);
             }
         }
@@ -501,7 +501,7 @@
     impl ToTokens for WhereClause {
         fn to_tokens(&self, tokens: &mut Tokens) {
             if !self.predicates.is_empty() {
-                self.where_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.where_token).to_tokens(tokens);
                 self.predicates.to_tokens(tokens);
             }
         }
@@ -520,7 +520,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.lifetime.to_tokens(tokens);
             if !self.bounds.is_empty() {
-                self.colon_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.colon_token).to_tokens(tokens);
                 self.bounds.to_tokens(tokens);
             }
         }
diff --git a/src/item.rs b/src/item.rs
index dca8543..978f1ad 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -1367,7 +1367,7 @@
                             tokens.append_all(items);
                         });
                     } else {
-                        item.semi.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.semi).to_tokens(tokens);
                     }
                 }
                 ItemKind::ForeignMod(ref item) => {
@@ -1409,11 +1409,11 @@
                         VariantData::Tuple(..) => {
                             item.data.to_tokens(tokens);
                             item.generics.where_clause.to_tokens(tokens);
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                         VariantData::Unit => {
                             item.generics.where_clause.to_tokens(tokens);
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                     }
                 }
@@ -1434,7 +1434,7 @@
                     item.ident.to_tokens(tokens);
                     item.generics.to_tokens(tokens);
                     if !item.supertraits.is_empty() {
-                        item.colon_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.colon_token).to_tokens(tokens);
                         item.supertraits.to_tokens(tokens);
                     }
                     item.generics.where_clause.to_tokens(tokens);
@@ -1482,7 +1482,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.path.to_tokens(tokens);
             if self.rename.is_some() {
-                self.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.as_token).to_tokens(tokens);
                 self.rename.to_tokens(tokens);
             }
         }
@@ -1510,7 +1510,7 @@
         fn to_tokens(&self, tokens: &mut Tokens) {
             self.name.to_tokens(tokens);
             if self.rename.is_some() {
-                self.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&self.as_token).to_tokens(tokens);
                 self.rename.to_tokens(tokens);
             }
         }
@@ -1541,7 +1541,7 @@
                             });
                         }
                         None => {
-                            item.semi_token.unwrap_or_default().to_tokens(tokens);
+                            TokensOrDefault(&item.semi_token).to_tokens(tokens);
                         }
                     }
                 }
@@ -1549,7 +1549,7 @@
                     item.type_token.to_tokens(tokens);
                     item.ident.to_tokens(tokens);
                     if !item.bounds.is_empty() {
-                        item.colon_token.unwrap_or_default().to_tokens(tokens);
+                        TokensOrDefault(&item.colon_token).to_tokens(tokens);
                         item.bounds.to_tokens(tokens);
                     }
                     if let Some((ref eq_token, ref default)) = item.default {
@@ -1655,7 +1655,7 @@
                     if !self.0.inputs.empty_or_trailing() {
                         tokens::Comma::default().to_tokens(tokens);
                     }
-                    self.0.dot_tokens.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.0.dot_tokens).to_tokens(tokens);
                 }
             });
             self.0.output.to_tokens(tokens);
diff --git a/src/lib.rs b/src/lib.rs
index 7a7055b..9b8ef36 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -275,3 +275,18 @@
     file.shebang = shebang;
     Ok(file)
 }
+
+#[cfg(feature = "printing")]
+struct TokensOrDefault<'a, T: 'a>(&'a Option<T>);
+
+#[cfg(feature = "printing")]
+impl<'a, T> quote::ToTokens for TokensOrDefault<'a, T>
+    where T: quote::ToTokens + Default,
+{
+    fn to_tokens(&self, tokens: &mut quote::Tokens) {
+        match *self.0 {
+            Some(ref t) => t.to_tokens(tokens),
+            None => T::default().to_tokens(tokens),
+        }
+    }
+}
diff --git a/src/ty.rs b/src/ty.rs
index cc9d2c8..4716b6f 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -840,7 +840,7 @@
             match self.ty.mutability {
                 Mutability::Mutable(ref tok) => tok.to_tokens(tokens),
                 Mutability::Immutable => {
-                    self.const_token.unwrap_or_default().to_tokens(tokens);
+                    TokensOrDefault(&self.const_token).to_tokens(tokens);
                 }
             }
             self.ty.ty.to_tokens(tokens);
@@ -901,7 +901,7 @@
             };
             let mut segments = self.1.segments.iter();
             if pos > 0 {
-                qself.as_token.unwrap_or_default().to_tokens(tokens);
+                TokensOrDefault(&qself.as_token).to_tokens(tokens);
                 self.1.leading_colon.to_tokens(tokens);
                 for (i, segment) in (&mut segments).take(pos).enumerate() {
                     if i + 1 == pos {