Use proc-macro2's Span instead of our own
diff --git a/src/attr.rs b/src/attr.rs
index 74ed01f..4625fc6 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -46,7 +46,7 @@
                 let tokens = ts.clone().into_iter().collect::<Vec<_>>();
                 if let Some(nested_meta_items) = list_of_nested_meta_items_from_tokens(&tokens) {
                     return Some(MetaItem::List(MetaItemList {
-                        paren_token: tokens::Paren(Span(self.tts[0].0.span)),
+                        paren_token: tokens::Paren(self.tts[0].0.span),
                         ident: *name,
                         nested: nested_meta_items,
                     }));
@@ -59,10 +59,10 @@
                 if let TokenNode::Literal(ref lit) = self.tts[1].0.kind {
                     return Some(MetaItem::NameValue(MetaNameValue {
                         ident: *name,
-                        eq_token: Token![=]([Span(self.tts[0].0.span)]),
+                        eq_token: Token![=]([self.tts[0].0.span]),
                         lit: Lit {
                             value: LitKind::Other(lit.clone()),
-                            span: Span(self.tts[1].0.span),
+                            span: self.tts[1].0.span,
                         },
                     }));
                 }
@@ -82,22 +82,22 @@
         TokenNode::Literal(ref lit) => {
             let lit = Lit {
                 value: LitKind::Other(lit.clone()),
-                span: Span(tts[0].span),
+                span: tts[0].span,
             };
             Some((NestedMetaItem::Literal(lit), &tts[1..]))
         }
 
         TokenNode::Term(sym) => {
-            let ident = Ident::new(sym, Span(tts[0].span));
+            let ident = Ident::new(sym, tts[0].span);
             if tts.len() >= 3 {
                 if let TokenNode::Op('=', Spacing::Alone) = tts[1].kind {
                     if let TokenNode::Literal(ref lit) = tts[2].kind {
                         let pair = MetaNameValue {
-                            ident: Ident::new(sym, Span(tts[0].span)),
-                            eq_token: Token![=]([Span(tts[1].span)]),
+                            ident: Ident::new(sym, tts[0].span),
+                            eq_token: Token![=]([tts[1].span]),
                             lit: Lit {
                                 value: LitKind::Other(lit.clone()),
-                                span: Span(tts[2].span),
+                                span: tts[2].span,
                             },
                         };
                         return Some((MetaItem::NameValue(pair).into(), &tts[3..]));
@@ -112,7 +112,7 @@
                         Some(nested_meta_items) => {
                             let list = MetaItemList {
                                 ident: ident,
-                                paren_token: tokens::Paren(Span(tts[1].span)),
+                                paren_token: tokens::Paren(tts[1].span),
                                 nested: nested_meta_items,
                             };
                             Some((MetaItem::List(list).into(), &tts[2..]))
@@ -141,7 +141,7 @@
             first = false;
             None
         } else if let TokenNode::Op(',', Spacing::Alone) = tts[0].kind {
-            let tok = Token![,]([Span(tts[0].span)]);
+            let tok = Token![,]([tts[0].span]);
             tts = &tts[1..];
             if tts.is_empty() {
                 break
diff --git a/src/expr.rs b/src/expr.rs
index a0505a4..dbf6ea0 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -659,7 +659,7 @@
     use ty::parsing::qpath;
 
     #[cfg(feature = "full")]
-    use proc_macro2::{TokenStream, TokenNode, Delimiter, Term};
+    use proc_macro2::{Span, TokenStream, TokenNode, Delimiter, Term};
     use synom::Synom;
     use cursor::Cursor;
     #[cfg(feature = "full")]
@@ -1848,7 +1848,7 @@
                 path: what,
                 bang_token: bang,
                 tokens: vec![TokenTree(proc_macro2::TokenTree {
-                    span: ((data.1).0).0,
+                    span: (data.1).0,
                     kind: TokenNode::Group(Delimiter::Brace, data.0),
                 })],
             },
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 9fc80a7..0d944e6 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -10,6 +10,7 @@
 
 use *;
 use delimited::Delimited;
+use proc_macro2::Span;
 
 trait FoldHelper {
     type Item;
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index a478b64..a688f33 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -9,6 +9,7 @@
 #![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
 
 use *;
+use proc_macro2::Span;
 
 
 #[cfg(feature = "full")]
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 6d7e616..2ad540d 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -9,6 +9,7 @@
 #![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
 
 use *;
+use proc_macro2::Span;
 
 
 #[cfg(feature = "full")]
diff --git a/src/ident.rs b/src/ident.rs
index 2555a72..0c51209 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -6,7 +6,7 @@
 use proc_macro2::Term;
 use unicode_xid::UnicodeXID;
 
-use Span;
+use proc_macro2::Span;
 
 /// A word of Rust code, such as a keyword or variable name.
 ///
@@ -252,7 +252,7 @@
             }
 
             Ok((rest, Ident {
-                span: Span(span),
+                span: span,
                 sym: sym,
             }))
         }
@@ -272,7 +272,7 @@
     impl ToTokens for Ident {
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append(TokenTree {
-                span: self.span.0,
+                span: self.span,
                 kind: TokenNode::Term(self.sym),
             })
         }
diff --git a/src/lib.rs b/src/lib.rs
index 3f150b7..d850b2d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -111,9 +111,6 @@
 pub mod synom;
 pub mod delimited;
 
-mod span;
-pub use span::Span;
-
 mod gen {
     #[cfg(feature = "visit")]
     pub mod visit;
diff --git a/src/lifetime.rs b/src/lifetime.rs
index 31af27d..5d3c191 100644
--- a/src/lifetime.rs
+++ b/src/lifetime.rs
@@ -2,11 +2,9 @@
 use std::fmt::{self, Display};
 use std::hash::{Hash, Hasher};
 
-use proc_macro2::Term;
+use proc_macro2::{Span, Term};
 use unicode_xid::UnicodeXID;
 
-use Span;
-
 #[cfg_attr(feature = "extra-traits", derive(Debug))]
 #[cfg_attr(feature = "clone-impls", derive(Clone))]
 pub struct Lifetime {
@@ -108,7 +106,7 @@
 
             Ok((rest, Lifetime {
                 sym: sym,
-                span: Span(span),
+                span: span,
             }))
         }
     }
@@ -123,7 +121,7 @@
     impl ToTokens for Lifetime {
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append(TokenTree {
-                span: self.span.0,
+                span: self.span,
                 kind: TokenNode::Term(self.sym),
             })
         }
diff --git a/src/lit.rs b/src/lit.rs
index 850a8b0..f55e398 100644
--- a/src/lit.rs
+++ b/src/lit.rs
@@ -1,9 +1,9 @@
 use std::fmt;
 use std::hash::{Hash, Hasher};
 
-use proc_macro2::{self, Literal, TokenNode, Term};
+use proc_macro2::{self, Span, Literal, TokenNode, Term};
 
-use {Span, TokenTree};
+use TokenTree;
 
 #[derive(Clone)]
 pub struct Lit {
@@ -25,7 +25,7 @@
             LitKind::Other(l) => TokenNode::Literal(l),
         };
         TokenTree(proc_macro2::TokenTree {
-            span: self.span.0,
+            span: self.span,
             kind: kind,
         })
     }
@@ -110,7 +110,7 @@
             match input.literal() {
                 Some((rest, span, lit)) => {
                     Ok((rest, Lit {
-                        span: Span(span),
+                        span: span,
                         value: LitKind::Other(lit)
                     }))
                 }
@@ -125,7 +125,7 @@
                         };
 
                         Ok((rest, Lit {
-                            span: Span(span),
+                            span: span,
                             value: kind
                         }))
                     }
diff --git a/src/span.rs b/src/span.rs
deleted file mode 100644
index f78cff7..0000000
--- a/src/span.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-use std::hash::{Hash, Hasher};
-use std::fmt::{self, Debug};
-
-use proc_macro2;
-
-#[derive(Clone, Copy, Default)]
-pub struct Span(pub proc_macro2::Span);
-
-impl Debug for Span {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        self.0.fmt(f)
-    }
-}
-
-impl PartialEq for Span {
-    fn eq(&self, _other: &Span) -> bool {
-        true
-    }
-}
-
-impl Eq for Span {}
-
-impl Hash for Span {
-    fn hash<H: Hasher>(&self, _hasher: &mut H) {
-    }
-}
diff --git a/src/tokens.rs b/src/tokens.rs
index a40bd60..955b01d 100644
--- a/src/tokens.rs
+++ b/src/tokens.rs
@@ -5,7 +5,7 @@
 //! of these tokens and all implment the `ToTokens` and `Synom` traits when the
 //! corresponding feature is activated.
 
-use Span;
+use proc_macro2::Span;
 
 macro_rules! tokens {
     (
@@ -28,21 +28,33 @@
 macro_rules! op {
     (pub struct $name:ident($($contents:tt)*) => $s:expr) => {
         #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
-        #[cfg_attr(feature = "extra-traits", derive(Eq, PartialEq, Hash))]
         #[derive(Default)]
         pub struct $name(pub $($contents)*);
 
         #[cfg(feature = "extra-traits")]
         impl ::std::fmt::Debug for $name {
             fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
-                let mut t = f.debug_tuple(stringify!($name));
-                for span in &self.0 {
-                    t.field(span);
-                }
-                t.finish()
+                f.write_str(stringify!($name))
             }
         }
 
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::Eq for $name {}
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::PartialEq for $name {
+            fn eq(&self, _other: &$name) -> bool {
+                true
+            }
+        }
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::hash::Hash for $name {
+            fn hash<H>(&self, _state: &mut H)
+                where H: ::std::hash::Hasher
+            {}
+        }
+
         #[cfg(feature = "printing")]
         impl ::quote::ToTokens for $name {
             fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
@@ -62,10 +74,33 @@
 macro_rules! sym {
     (pub struct $name:ident => $s:expr) => {
         #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
-        #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
         #[derive(Default)]
         pub struct $name(pub Span);
 
+        #[cfg(feature = "extra-traits")]
+        impl ::std::fmt::Debug for $name {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                f.write_str(stringify!($name))
+            }
+        }
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::Eq for $name {}
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::PartialEq for $name {
+            fn eq(&self, _other: &$name) -> bool {
+                true
+            }
+        }
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::hash::Hash for $name {
+            fn hash<H>(&self, _state: &mut H)
+                where H: ::std::hash::Hasher
+            {}
+        }
+
         #[cfg(feature = "printing")]
         impl ::quote::ToTokens for $name {
             fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
@@ -85,10 +120,33 @@
 macro_rules! delim {
     (pub struct $name:ident => $s:expr) => {
         #[cfg_attr(feature = "clone-impls", derive(Copy, Clone))]
-        #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
         #[derive(Default)]
         pub struct $name(pub Span);
 
+        #[cfg(feature = "extra-traits")]
+        impl ::std::fmt::Debug for $name {
+            fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
+                f.write_str(stringify!($name))
+            }
+        }
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::Eq for $name {}
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::cmp::PartialEq for $name {
+            fn eq(&self, _other: &$name) -> bool {
+                true
+            }
+        }
+
+        #[cfg(feature = "extra-traits")]
+        impl ::std::hash::Hash for $name {
+            fn hash<H>(&self, _state: &mut H)
+                where H: ::std::hash::Hasher
+            {}
+        }
+
         impl $name {
             #[cfg(feature = "printing")]
             pub fn surround<F>(&self,
@@ -399,10 +457,10 @@
 
 #[cfg(feature = "parsing")]
 mod parsing {
-    use proc_macro2::{Delimiter, Spacing};
+    use proc_macro2::{Span, Delimiter, Spacing};
 
     use cursor::Cursor;
-    use {PResult, Span, parse_error};
+    use {PResult, parse_error};
 
     pub trait FromSpans: Sized {
         fn from_spans(spans: &[Span]) -> Self;
@@ -445,7 +503,7 @@
                             _ => return parse_error(),
                         }
                     }
-                    *slot = Span(span);
+                    *slot = span;
                     tokens = rest;
                 }
                 _ => return parse_error()
@@ -461,7 +519,7 @@
     {
         if let Some((rest, span, s)) = tokens.word() {
             if s.as_str() == sym {
-                return Ok((rest, new(Span(span))));
+                return Ok((rest, new(span)));
             }
         }
         parse_error()
@@ -487,7 +545,7 @@
             match f(seqinfo.inside) {
                 Ok((remaining, ret)) => {
                     if remaining.eof() {
-                        return Ok((seqinfo.outside, (ret, new(Span(seqinfo.span)))));
+                        return Ok((seqinfo.outside, (ret, new(seqinfo.span))));
                     }
                 }
                 Err(err) => return Err(err),
@@ -499,11 +557,9 @@
 
 #[cfg(feature = "printing")]
 mod printing {
-    use proc_macro2::{TokenTree, TokenNode, Spacing, Term};
+    use proc_macro2::{Span, TokenTree, TokenNode, Spacing, Term};
     use quote::Tokens;
 
-    use Span;
-
     pub fn op(s: &str, spans: &[Span], tokens: &mut Tokens) {
         assert_eq!(s.len(), spans.len());
 
@@ -513,20 +569,20 @@
         let span = spans.next_back().unwrap();
         for (ch, span) in chars.zip(spans) {
             tokens.append(TokenTree {
-                span: span.0,
+                span: *span,
                 kind: TokenNode::Op(ch, Spacing::Joint),
             });
         }
 
         tokens.append(TokenTree {
-            span: span.0,
+            span: *span,
             kind: TokenNode::Op(ch, Spacing::Alone),
         });
     }
 
     pub fn sym(s: &str, span: &Span, tokens: &mut Tokens) {
         tokens.append(TokenTree {
-            span: span.0,
+            span: *span,
             kind: TokenNode::Term(Term::intern(s)),
         });
     }
@@ -534,6 +590,6 @@
     pub fn delim<F>(s: &str, span: &Span, tokens: &mut Tokens, f: F)
         where F: FnOnce(&mut Tokens)
     {
-        tokens.append_delimited(s, span.0, f)
+        tokens.append_delimited(s, *span, f)
     }
 }