Preserve syn::Ident as a re-export
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index ccfdf56..8bf9d4e 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -22,9 +22,9 @@
 extern crate syn;
 
 use quote::ToTokens;
-use syn::{Attribute, Data, DataStruct, DeriveInput, Item};
+use syn::{Attribute, Data, DataStruct, DeriveInput, Ident, Item};
 use failure::{err_msg, Error};
-use proc_macro2::{Ident, Span, TokenStream};
+use proc_macro2::{Span, TokenStream};
 
 use std::io::{Read, Write};
 use std::fmt::{self, Debug};
@@ -189,7 +189,7 @@
     use syn;
     use syn::synom::*;
     use syn::*;
-    use proc_macro2::{TokenStream, Ident};
+    use proc_macro2::TokenStream;
 
     // Parses #full - returns #[cfg(feature = "full")] if it is present, and
     // nothing otherwise.
@@ -335,7 +335,7 @@
     use syn::punctuated::Punctuated;
     use quote::ToTokens;
     use std::fmt::{self, Display};
-    use proc_macro2::{Ident, Span, TokenStream};
+    use proc_macro2::{Span, TokenStream};
 
     #[derive(Default)]
     pub struct State {
@@ -1017,7 +1017,7 @@
 use *;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use token::{{Brace, Bracket, Paren, Group}};
-use proc_macro2::{{Span, Ident}};
+use proc_macro2::Span;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use gen::helper::fold::*;
 
@@ -1078,7 +1078,7 @@
 use *;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use punctuated::Punctuated;
-use proc_macro2::{{Span, Ident}};
+use proc_macro2::Span;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use gen::helper::visit::*;
 
@@ -1116,7 +1116,7 @@
 use *;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use punctuated::Punctuated;
-use proc_macro2::{{Span, Ident}};
+use proc_macro2::Span;
 #[cfg(any(feature = \"full\", feature = \"derive\"))]
 use gen::helper::visit_mut::*;
 
diff --git a/src/attr.rs b/src/attr.rs
index 7b788cb..6f50e0a 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -11,7 +11,7 @@
 
 use std::iter;
 
-use proc_macro2::{Delimiter, Spacing, TokenStream, TokenTree, Ident};
+use proc_macro2::{Delimiter, Spacing, TokenStream, TokenTree};
 
 #[cfg(feature = "extra-traits")]
 use std::hash::{Hash, Hasher};
diff --git a/src/data.rs b/src/data.rs
index 93a66a1..fbbdb70 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -6,8 +6,6 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use proc_macro2::Ident;
-
 use super::*;
 use punctuated::Punctuated;
 
diff --git a/src/derive.rs b/src/derive.rs
index 7964178..ba60f8d 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -7,7 +7,6 @@
 // except according to those terms.
 
 use super::*;
-use proc_macro2::Ident;
 use punctuated::Punctuated;
 
 ast_struct! {
diff --git a/src/expr.rs b/src/expr.rs
index 8d94863..ac55c98 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -7,7 +7,7 @@
 // except according to those terms.
 
 use super::*;
-use proc_macro2::{Span, TokenStream, Ident};
+use proc_macro2::{Span, TokenStream};
 use punctuated::Punctuated;
 #[cfg(feature = "extra-traits")]
 use std::hash::{Hash, Hasher};
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index ee7120b..2cd760d 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -10,7 +10,7 @@
 use *;
 #[cfg(any(feature = "full", feature = "derive"))]
 use token::{Brace, Bracket, Paren, Group};
-use proc_macro2::{Span, Ident};
+use proc_macro2::Span;
 #[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::fold::*;
 
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index e363944..3591bb7 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -8,7 +8,7 @@
 use *;
 #[cfg(any(feature = "full", feature = "derive"))]
 use punctuated::Punctuated;
-use proc_macro2::{Span, Ident};
+use proc_macro2::Span;
 #[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::visit::*;
 
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 668f172..848e348 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -8,7 +8,7 @@
 use *;
 #[cfg(any(feature = "full", feature = "derive"))]
 use punctuated::Punctuated;
-use proc_macro2::{Span, Ident};
+use proc_macro2::Span;
 #[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::visit_mut::*;
 
diff --git a/src/generics.rs b/src/generics.rs
index e1e1cc5..4c2858d 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -7,7 +7,6 @@
 // except according to those terms.
 
 use super::*;
-use proc_macro2::Ident;
 use punctuated::{Iter, IterMut, Punctuated};
 
 ast_struct! {
diff --git a/src/item.rs b/src/item.rs
index dcbe142..226e102 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -8,7 +8,7 @@
 
 use super::*;
 use derive::{Data, DeriveInput};
-use proc_macro2::{TokenStream, Ident};
+use proc_macro2::TokenStream;
 use punctuated::Punctuated;
 use token::{Brace, Paren};
 
diff --git a/src/lib.rs b/src/lib.rs
index 1f23701..beababe 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -286,6 +286,8 @@
 #[macro_use]
 pub mod token;
 
+pub use proc_macro2::Ident;
+
 #[cfg(any(feature = "full", feature = "derive"))]
 mod attr;
 #[cfg(any(feature = "full", feature = "derive"))]
diff --git a/src/parsers.rs b/src/parsers.rs
index ebe229c..810a112 100644
--- a/src/parsers.rs
+++ b/src/parsers.rs
@@ -251,10 +251,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
-/// use syn::MacroDelimiter;
+/// use syn::{Ident, MacroDelimiter};
 /// use syn::token::{Paren, Bracket, Brace};
 /// use syn::synom::Synom;
 ///
@@ -418,10 +416,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
-/// use syn::Item;
+/// use syn::{Ident, Item};
 /// use syn::token::Brace;
 /// use syn::synom::Synom;
 ///
@@ -530,9 +526,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
+/// use syn::Ident;
 /// use syn::token::Brace;
 /// use syn::synom::Synom;
 ///
@@ -625,9 +620,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
+/// use syn::Ident;
 /// use syn::token::Brace;
 /// use syn::synom::Synom;
 ///
@@ -1229,10 +1223,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
-/// use syn::Item;
+/// use syn::{Ident, Item};
 /// use syn::token::Brace;
 /// use syn::synom::Synom;
 ///
@@ -1284,9 +1276,8 @@
 /// ```rust
 /// #[macro_use]
 /// extern crate syn;
-/// extern crate proc_macro2;
 ///
-/// use proc_macro2::Ident;
+/// use syn::Ident;
 /// use syn::synom::Synom;
 ///
 /// struct Flag {
@@ -1311,11 +1302,7 @@
 #[macro_export]
 macro_rules! custom_keyword {
     ($i:expr, $keyword:ident) => {
-        match <
-            $crate::parsers::__custom_keyword_inner::Ident
-            as
-            $crate::synom::Synom
-        >::parse($i) {
+        match <$crate::Ident as $crate::synom::Synom>::parse($i) {
             ::std::result::Result::Err(err) => ::std::result::Result::Err(err),
             ::std::result::Result::Ok((token, i)) => {
                 if token.to_string() == stringify!($keyword) {
@@ -1328,11 +1315,6 @@
     };
 }
 
-#[doc(hidden)]
-pub mod __custom_keyword_inner {
-    pub use proc_macro2::Ident;
-}
-
 /// Parse inside of `(` `)` parentheses.
 ///
 /// This macro parses a set of balanced parentheses and invokes a sub-parser on
diff --git a/src/path.rs b/src/path.rs
index 499ad25..7e83daf 100644
--- a/src/path.rs
+++ b/src/path.rs
@@ -7,7 +7,6 @@
 // except according to those terms.
 
 use super::*;
-use proc_macro2::Ident;
 use punctuated::Punctuated;
 
 ast_struct! {
diff --git a/src/token.rs b/src/token.rs
index 292e0da..7e07545 100644
--- a/src/token.rs
+++ b/src/token.rs
@@ -23,10 +23,8 @@
 //! ```
 //! # #[macro_use]
 //! # extern crate syn;
-//! # extern crate proc_macro2;
 //! #
-//! # use proc_macro2::Ident;
-//! # use syn::{Attribute, Visibility, Type, Expr};
+//! # use syn::{Attribute, Visibility, Ident, Type, Expr};
 //! #
 //! pub struct ItemStatic {
 //!     pub attrs: Vec<Attribute>,
@@ -60,11 +58,9 @@
 //! ```
 //! #[macro_use]
 //! extern crate syn;
-//! extern crate proc_macro2;
 //!
-//! use proc_macro2::Ident;
 //! use syn::synom::Synom;
-//! use syn::{Attribute, Visibility, Type, Expr};
+//! use syn::{Attribute, Visibility, Ident, Type, Expr};
 //! #
 //! # struct ItemStatic;
 //! # use syn::ItemStatic as SynItemStatic;
diff --git a/src/ty.rs b/src/ty.rs
index bd6fd06..3ca817b 100644
--- a/src/ty.rs
+++ b/src/ty.rs
@@ -7,7 +7,7 @@
 // except according to those terms.
 
 use super::*;
-use proc_macro2::{TokenStream, Ident};
+use proc_macro2::TokenStream;
 use punctuated::Punctuated;
 #[cfg(feature = "extra-traits")]
 use std::hash::{Hash, Hasher};