Update to proc-macro2 0.3 and tweak apis
diff --git a/tests/common/respan.rs b/tests/common/respan.rs
index 6d1e75a..a969ae2 100644
--- a/tests/common/respan.rs
+++ b/tests/common/respan.rs
@@ -186,6 +186,7 @@
 
     fn fold_attribute(&mut self, mut at: Attribute) -> Option<Attribute> {
         at.id.0 = 0;
+        at.is_sugared_doc = false;
         fold::noop_fold_attribute(at, self)
     }
 
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index a9fe242..bd25652 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -12,7 +12,8 @@
 extern crate syn;
 
 use syn::*;
-use proc_macro2::{Delimiter, Literal, Spacing, Span, Term, TokenNode, TokenStream, TokenTree};
+use proc_macro2::{Delimiter, Literal, Spacing, Span, Term, Op, TokenStream, TokenTree};
+use proc_macro2::Group;
 use proc_macro2::Delimiter::{Brace, Parenthesis};
 
 use std::iter::FromIterator;
@@ -21,31 +22,19 @@
 mod macros;
 
 fn op(c: char) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Op(c, Spacing::Alone),
-    }
+    Op::new(c, Spacing::Alone).into()
 }
 
 fn lit<T: Into<Literal>>(t: T) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Literal(t.into()),
-    }
+    t.into().into()
 }
 
 fn word(sym: &str) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Term(Term::intern(sym)),
-    }
+    Term::new(sym, Span::call_site()).into()
 }
 
 fn delimited(delim: Delimiter, tokens: Vec<TokenTree>) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Group(delim, tokens.into_iter().collect()),
-    }
+    Group::new(delim, tokens.into_iter().collect()).into()
 }
 
 #[test]
@@ -284,7 +273,7 @@
                         Default::default(),
                         Expr::Lit(ExprLit {
                             attrs: Vec::new(),
-                            lit: Lit::Int(LitInt::new(0, IntSuffix::Isize, Span::def_site())),
+                            lit: Lit::Int(LitInt::new(0, IntSuffix::Isize, Span::call_site())),
                         }),
                     )),
                 },
@@ -305,19 +294,19 @@
                                         lit: Lit::Int(LitInt::new(
                                             0,
                                             IntSuffix::None,
-                                            Span::def_site()
+                                            Span::call_site()
                                         )),
                                     }),
                                     Expr::Lit(ExprLit {
                                         attrs: Vec::new(),
-                                        lit: Lit::Str(LitStr::new("data", Span::def_site())),
+                                        lit: Lit::Str(LitStr::new("data", Span::call_site())),
                                     }),
                                 ],
                             })),
                             dot_token: Default::default(),
                             member: Member::Unnamed(Index {
                                 index: 0,
-                                span: Span::def_site(),
+                                span: Span::call_site(),
                             }),
                         }),
                     )),
@@ -338,7 +327,7 @@
             eq_token: Default::default(),
             lit: Lit::Str(LitStr::new(
                 "/// See the std::result module documentation for details.",
-                Span::def_site(),
+                Span::call_site(),
             )),
         }.into(),
         Meta::Word("must_use".into()),
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index b96d652..a86a41e 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -32,14 +32,14 @@
         params: punctuated![
             GenericParam::Lifetime(LifetimeDef {
                 attrs: Default::default(),
-                lifetime: Lifetime::new(Term::intern("'a"), Span::def_site()),
+                lifetime: Lifetime::new(Term::new("'a", Span::call_site())),
                 bounds: Default::default(),
                 colon_token: None,
             }),
             GenericParam::Lifetime(LifetimeDef {
                 attrs: Default::default(),
-                lifetime: Lifetime::new(Term::intern("'b"), Span::def_site()),
-                bounds: punctuated![Lifetime::new(Term::intern("'a"), Span::def_site())],
+                lifetime: Lifetime::new(Term::new("'b", Span::call_site())),
+                bounds: punctuated![Lifetime::new(Term::new("'a", Span::call_site()))],
                 colon_token: Some(token::Colon::default()),
             }),
             GenericParam::Type(TypeParam {
@@ -55,7 +55,7 @@
                 ],
                 ident: "T".into(),
                 bounds: punctuated![
-                    TypeParamBound::Lifetime(Lifetime::new(Term::intern("'a"), Span::def_site())),
+                    TypeParamBound::Lifetime(Lifetime::new(Term::new("'a", Span::call_site()))),
                 ],
                 default: Some(
                     TypeTuple {
@@ -111,14 +111,14 @@
 #[test]
 fn test_ty_param_bound() {
     let tokens = quote!('a);
-    let expected = TypeParamBound::Lifetime(Lifetime::new(Term::intern("'a"), Span::def_site()));
+    let expected = TypeParamBound::Lifetime(Lifetime::new(Term::new("'a", Span::call_site())));
     assert_eq!(
         expected,
         common::parse::syn::<TypeParamBound>(tokens.into())
     );
 
     let tokens = quote!('_);
-    let expected = TypeParamBound::Lifetime(Lifetime::new(Term::intern("'_"), Span::def_site()));
+    let expected = TypeParamBound::Lifetime(Lifetime::new(Term::new("'_", Span::call_site())));
     assert_eq!(
         expected,
         common::parse::syn::<TypeParamBound>(tokens.into())
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
index 8e00068..ca686f6 100644
--- a/tests/test_grouping.rs
+++ b/tests/test_grouping.rs
@@ -22,13 +22,6 @@
 
 mod common;
 
-fn tt(k: TokenNode) -> TokenTree {
-    TokenTree {
-        span: Span::def_site(),
-        kind: k,
-    }
-}
-
 fn expr<T: Into<Expr>>(t: T) -> Expr {
     t.into()
 }
@@ -36,26 +29,26 @@
 fn lit<T: Into<Literal>>(t: T) -> Expr {
     Expr::Lit(ExprLit {
         attrs: Vec::new(),
-        lit: Lit::new(t.into(), Span::def_site()),
+        lit: Lit::new(t.into()),
     })
 }
 
 #[test]
 fn test_grouping() {
     let raw: TokenStream = vec![
-        tt(TokenNode::Literal(Literal::i32(1))),
-        tt(TokenNode::Op('+', Spacing::Alone)),
-        tt(TokenNode::Group(
+        TokenTree::Literal(Literal::i32_suffixed(1)),
+        TokenTree::Op(Op::new('+', Spacing::Alone)),
+        TokenTree::Group(proc_macro2::Group::new(
             Delimiter::None,
             vec![
-                tt(TokenNode::Literal(Literal::i32(2))),
-                tt(TokenNode::Op('+', Spacing::Alone)),
-                tt(TokenNode::Literal(Literal::i32(3))),
+                TokenTree::Literal(Literal::i32_suffixed(2)),
+                TokenTree::Op(Op::new('+', Spacing::Alone)),
+                TokenTree::Literal(Literal::i32_suffixed(3)),
             ].into_iter()
                 .collect(),
         )),
-        tt(TokenNode::Op('*', Spacing::Alone)),
-        tt(TokenNode::Literal(Literal::i32(4))),
+        TokenTree::Op(Op::new('*', Spacing::Alone)),
+        TokenTree::Literal(Literal::i32_suffixed(4)),
     ].into_iter()
         .collect();
 
@@ -65,7 +58,7 @@
         common::parse::syn::<Expr>(raw),
         expr(ExprBinary {
             attrs: Vec::new(),
-            left: Box::new(lit(Literal::i32(1))),
+            left: Box::new(lit(Literal::i32_suffixed(1))),
             op: BinOp::Add(<Token![+]>::default()),
             right: Box::new(expr(ExprBinary {
                 attrs: Vec::new(),
@@ -74,13 +67,13 @@
                     group_token: Group::default(),
                     expr: Box::new(expr(ExprBinary {
                         attrs: Vec::new(),
-                        left: Box::new(lit(Literal::i32(2))),
+                        left: Box::new(lit(Literal::i32_suffixed(2))),
                         op: BinOp::Add(<Token![+]>::default()),
-                        right: Box::new(lit(Literal::i32(3))),
+                        right: Box::new(lit(Literal::i32_suffixed(3))),
                     })),
                 })),
                 op: BinOp::Mul(<Token![*]>::default()),
-                right: Box::new(lit(Literal::i32(4))),
+                right: Box::new(lit(Literal::i32_suffixed(4))),
             })),
         })
     );
@@ -89,19 +82,19 @@
 #[test]
 fn test_invalid_grouping() {
     let raw: TokenStream = vec![
-        tt(TokenNode::Literal(Literal::i32(1))),
-        tt(TokenNode::Op('+', Spacing::Alone)),
-        tt(TokenNode::Group(
+        TokenTree::Literal(Literal::i32_suffixed(1)),
+        TokenTree::Op(Op::new('+', Spacing::Alone)),
+        TokenTree::Group(proc_macro2::Group::new(
             Delimiter::None,
             vec![
-                tt(TokenNode::Literal(Literal::i32(2))),
-                tt(TokenNode::Op('+', Spacing::Alone)),
+                TokenTree::Literal(Literal::i32_suffixed(2)),
+                TokenTree::Op(Op::new('+', Spacing::Alone)),
             ].into_iter()
                 .collect(),
         )),
-        tt(TokenNode::Literal(Literal::i32(3))),
-        tt(TokenNode::Op('*', Spacing::Alone)),
-        tt(TokenNode::Literal(Literal::i32(4))),
+        TokenTree::Literal(Literal::i32_suffixed(3)),
+        TokenTree::Op(Op::new('*', Spacing::Alone)),
+        TokenTree::Literal(Literal::i32_suffixed(4)),
     ].into_iter()
         .collect();
 
@@ -113,16 +106,16 @@
             attrs: Vec::new(),
             left: Box::new(expr(ExprBinary {
                 attrs: Vec::new(),
-                left: Box::new(lit(Literal::i32(1))),
+                left: Box::new(lit(Literal::i32_suffixed(1))),
                 op: BinOp::Add(<Token![+]>::default()),
-                right: Box::new(lit(Literal::i32(2))),
+                right: Box::new(lit(Literal::i32_suffixed(2))),
             })),
             op: BinOp::Add(<Token![+]>::default()),
             right: Box::new(expr(ExprBinary {
                 attrs: Vec::new(),
-                left: Box::new(lit(Literal::i32(3))),
+                left: Box::new(lit(Literal::i32_suffixed(3))),
                 op: BinOp::Mul(<Token![*]>::default()),
-                right: Box::new(lit(Literal::i32(4))),
+                right: Box::new(lit(Literal::i32_suffixed(4))),
             })),
         })
     );
diff --git a/tests/test_lit.rs b/tests/test_lit.rs
index ad6f246..79a0606 100644
--- a/tests/test_lit.rs
+++ b/tests/test_lit.rs
@@ -12,7 +12,7 @@
 
 use syn::{FloatSuffix, IntSuffix, Lit};
 use quote::ToTokens;
-use proc_macro2::{Span, TokenNode, TokenStream};
+use proc_macro2::{TokenTree, TokenStream};
 use std::str::FromStr;
 
 fn lit(s: &str) -> Lit {
@@ -21,9 +21,8 @@
         .into_iter()
         .next()
         .unwrap()
-        .kind
     {
-        TokenNode::Literal(lit) => Lit::new(lit, Span::def_site()),
+        TokenTree::Literal(lit) => Lit::new(lit),
         _ => panic!(),
     }
 }
diff --git a/tests/test_meta_item.rs b/tests/test_meta_item.rs
index 0fff6d2..bd2c1a5 100644
--- a/tests/test_meta_item.rs
+++ b/tests/test_meta_item.rs
@@ -19,7 +19,7 @@
 mod macros;
 
 fn lit<T: Into<Literal>>(t: T) -> Lit {
-    Lit::new(t.into(), Span::def_site())
+    Lit::new(t.into())
 }
 
 #[test]
@@ -34,7 +34,7 @@
         MetaNameValue {
             ident: "foo".into(),
             eq_token: Default::default(),
-            lit: lit(Literal::integer(5)),
+            lit: lit(Literal::i32_unsuffixed(5)),
         },
     )
 }
@@ -46,7 +46,7 @@
         MetaNameValue {
             ident: "foo".into(),
             eq_token: Default::default(),
-            lit: Lit::Bool(LitBool { value: true, span: Span::def_site() }),
+            lit: Lit::Bool(LitBool { value: true, span: Span::call_site() }),
         },
     );
     run_test(
@@ -54,7 +54,7 @@
         MetaNameValue {
             ident: "foo".into(),
             eq_token: Default::default(),
-            lit: Lit::Bool(LitBool { value: false, span: Span::def_site() }),
+            lit: Lit::Bool(LitBool { value: false, span: Span::call_site() }),
         },
     )
 }
@@ -66,7 +66,7 @@
         MetaList {
             ident: "foo".into(),
             paren_token: Default::default(),
-            nested: punctuated![NestedMeta::Literal(lit(Literal::integer(5)))],
+            nested: punctuated![NestedMeta::Literal(lit(Literal::i32_unsuffixed(5)))],
         },
     )
 }
@@ -95,7 +95,7 @@
                     MetaNameValue {
                         ident: "bar".into(),
                         eq_token: Default::default(),
-                        lit: lit(Literal::integer(5)),
+                        lit: lit(Literal::i32_unsuffixed(5)),
                     }.into(),
                 ),
             ],
@@ -115,7 +115,7 @@
                     MetaNameValue {
                         ident: "bar".into(),
                         eq_token: Default::default(),
-                        lit: Lit::Bool(LitBool { value: true, span: Span::def_site() }),
+                        lit: Lit::Bool(LitBool { value: true, span: Span::call_site() }),
                     }.into(),
                 ),
             ],
@@ -136,7 +136,7 @@
                     MetaNameValue {
                         ident: "name".into(),
                         eq_token: Default::default(),
-                        lit: lit(Literal::integer(5)),
+                        lit: lit(Literal::i32_unsuffixed(5)),
                     }.into(),
                 ),
                 NestedMeta::Meta(
@@ -148,7 +148,7 @@
                                 MetaNameValue {
                                     ident: "name2".into(),
                                     eq_token: Default::default(),
-                                    lit: lit(Literal::integer(6)),
+                                    lit: lit(Literal::i32_unsuffixed(6)),
                                 }.into(),
                             ),
                         ],
diff --git a/tests/test_round_trip.rs b/tests/test_round_trip.rs
index 3313acb..a6013ce 100644
--- a/tests/test_round_trip.rs
+++ b/tests/test_round_trip.rs
@@ -79,7 +79,7 @@
             };
             let back = quote!(#krate).to_string();
 
-            let equal = panic::catch_unwind(|| {
+            let equal = panic::catch_unwind(|| syntax::with_globals(|| {
                 let sess = ParseSess::new(FilePathMapping::empty());
                 let before = match libsyntax_parse(content, &sess) {
                     Ok(before) => before,
@@ -125,7 +125,7 @@
                     );
                     false
                 }
-            });
+            }));
             match equal {
                 Err(_) => errorf!("=== {}: ignoring libsyntax panic\n", path.display()),
                 Ok(true) => {}
@@ -146,7 +146,5 @@
 
 fn libsyntax_parse(content: String, sess: &ParseSess) -> PResult<ast::Crate> {
     let name = FileName::Custom("test_round_trip".to_string());
-    syntax::with_globals(|| {
-        parse::parse_crate_from_source_str(name, content, sess).map(common::respan::respan_crate)
-    })
+    parse::parse_crate_from_source_str(name, content, sess).map(common::respan::respan_crate)
 }
diff --git a/tests/test_token_trees.rs b/tests/test_token_trees.rs
index 0047ae2..6fbb4ae 100644
--- a/tests/test_token_trees.rs
+++ b/tests/test_token_trees.rs
@@ -14,35 +14,23 @@
 extern crate syn;
 
 use syn::{AttrStyle, Attribute, Lit};
-use proc_macro2::{Delimiter, Spacing, Span, Term, TokenNode, TokenStream, TokenTree};
+use proc_macro2::{Delimiter, Spacing, Span, Term, Op, Group, TokenStream, TokenTree};
 use proc_macro2::Delimiter::*;
 
 fn alone(c: char) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Op(c, Spacing::Alone),
-    }
+    Op::new(c, Spacing::Alone).into()
 }
 
 fn joint(c: char) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Op(c, Spacing::Joint),
-    }
+    Op::new(c, Spacing::Joint).into()
 }
 
 fn delimited(delim: Delimiter, tokens: Vec<TokenTree>) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Group(delim, tokens.into_iter().collect()),
-    }
+    Group::new(delim, tokens.into_iter().collect()).into()
 }
 
 fn word(sym: &str) -> TokenTree {
-    proc_macro2::TokenTree {
-        span: Span::def_site(),
-        kind: TokenNode::Term(Term::intern(sym)),
-    }
+    Term::new(sym, Span::call_site()).into()
 }
 
 #[test]