Pare down the Synom trait

I would like to make it clearer that parsing a string is second-class
functionality compared to parsing tokens.
diff --git a/tests/common/mod.rs b/tests/common/mod.rs
index fcb8c61..5ffeb84 100644
--- a/tests/common/mod.rs
+++ b/tests/common/mod.rs
@@ -1,9 +1,12 @@
+#![allow(dead_code)]
+
 extern crate walkdir;
 
-use walkdir::DirEntry;
 use std::env;
 use std::u32;
 
+use self::walkdir::DirEntry;
+
 macro_rules! errorf {
     ($($tt:tt)*) => {
         {
diff --git a/tests/common/parse.rs b/tests/common/parse.rs
index 15c2faf..a0c54e5 100644
--- a/tests/common/parse.rs
+++ b/tests/common/parse.rs
@@ -1,4 +1,6 @@
+extern crate proc_macro2;
 extern crate syn;
+extern crate synom;
 extern crate syntex_syntax;
 
 use self::syntex_syntax::ast;
@@ -8,6 +10,8 @@
 
 use std::panic;
 
+use self::synom::{Synom, SynomBuffer};
+
 pub fn syntex_expr(input: &str) -> Option<P<ast::Expr>> {
     match panic::catch_unwind(|| {
         let sess = ParseSess::new(FilePathMapping::empty());
@@ -37,7 +41,7 @@
 }
 
 pub fn syn_expr(input: &str) -> Option<syn::Expr> {
-    match input.parse::<syn::Expr>() {
+    match syn::parse_str(input) {
         Ok(e) => Some(e),
         Err(msg) => {
             errorf!("syn failed to parse\n{:?}\n", msg);
@@ -45,3 +49,20 @@
         }
     }
 }
+
+pub fn syn<T: Synom>(tokens: proc_macro2::TokenStream) -> T {
+    let buf = SynomBuffer::new(tokens);
+    let result = T::parse(buf.begin());
+    match result {
+        Ok((rest, t)) => {
+            if rest.eof() {
+                t
+            } else if rest == buf.begin() {
+                panic!("failed to parse anything")
+            } else {
+                panic!("failed to parse all tokens")
+            }
+        }
+        Err(err) => panic!("failed to parse: {}", err),
+    }
+}
diff --git a/tests/common/respan.rs b/tests/common/respan.rs
index c9d12f5..0d5eeb3 100644
--- a/tests/common/respan.rs
+++ b/tests/common/respan.rs
@@ -1,19 +1,22 @@
+extern crate syntex_syntax;
+extern crate syntex_pos;
+
 use std::rc::Rc;
-use syntex_syntax::ast::{Attribute, Expr, ExprKind, Field, FnDecl, FunctionRetTy, ImplItem,
+use self::syntex_syntax::ast::{Attribute, Expr, ExprKind, Field, FnDecl, FunctionRetTy, ImplItem,
                          ImplItemKind, ItemKind, Mac, MetaItem, MetaItemKind, MethodSig,
                          NestedMetaItem, NestedMetaItemKind, TraitItem, TraitItemKind, TyParam,
                          Visibility};
-use syntex_syntax::codemap::{self, Spanned};
-use syntex_syntax::fold::{self, Folder};
-use syntex_syntax::parse::token::{Lit, Token};
-use syntex_syntax::ptr::P;
-use syntex_syntax::symbol::Symbol;
-use syntex_syntax::tokenstream::{Delimited, TokenTree};
-use syntex_syntax::util::move_map::MoveMap;
-use syntex_syntax::util::small_vector::SmallVector;
+use self::syntex_syntax::codemap::{self, Spanned};
+use self::syntex_syntax::fold::{self, Folder};
+use self::syntex_syntax::parse::token::{Lit, Token};
+use self::syntex_syntax::ptr::P;
+use self::syntex_syntax::symbol::Symbol;
+use self::syntex_syntax::tokenstream::{Delimited, TokenTree};
+use self::syntex_syntax::util::move_map::MoveMap;
+use self::syntex_syntax::util::small_vector::SmallVector;
 
-use syntex_pos::{Span, DUMMY_SP};
-use syntex_syntax::ast;
+use self::syntex_pos::{Span, DUMMY_SP};
+use self::syntex_syntax::ast;
 
 struct Respanner;
 
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 1437e3b..bd56825 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -51,7 +51,7 @@
         }),
     };
 
-    assert_eq!(expected, raw.parse().unwrap());
+    assert_eq!(expected, syn::parse_str(raw).unwrap());
 }
 
 #[test]
@@ -136,7 +136,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 
@@ -309,7 +309,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 
@@ -378,7 +378,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 
@@ -420,7 +420,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 
@@ -459,7 +459,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 
@@ -510,7 +510,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 }
@@ -537,7 +537,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 }
@@ -565,7 +565,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 }
@@ -593,7 +593,7 @@
         }),
     };
 
-    let actual = raw.parse().unwrap();
+    let actual = syn::parse_str(raw).unwrap();
 
     assert_eq!(expected, actual);
 }
diff --git a/tests/test_expr.rs b/tests/test_expr.rs
index 0e4b574..14c0cae 100644
--- a/tests/test_expr.rs
+++ b/tests/test_expr.rs
@@ -86,7 +86,7 @@
         }
     "#;
 
-    let actual = raw.parse::<Crate>().unwrap();
+    let actual: File = syn::parse_str(raw).unwrap();
 
     assert_let!(ItemKind::Struct(ItemStruct { ref ident, .. }) = actual.items[0].node; {
         assert_eq!(ident, "catch");
diff --git a/tests/test_generics.rs b/tests/test_generics.rs
index f743b78..148b879 100644
--- a/tests/test_generics.rs
+++ b/tests/test_generics.rs
@@ -9,6 +9,8 @@
 extern crate proc_macro2;
 use proc_macro2::Term;
 
+mod common;
+
 #[test]
 fn test_split_for_impl() {
     // <'a, 'b: 'a, #[may_dangle] T: 'a = ()> where T: Debug
@@ -96,7 +98,7 @@
 fn test_ty_param_bound() {
     let tokens = quote!('a);
     let expected = TyParamBound::Region(Lifetime::new(Term::intern("'a"), Span::default()));
-    assert_eq!(expected, tokens.to_string().parse().unwrap());
+    assert_eq!(expected, common::parse::syn::<TyParamBound>(tokens.into()));
 
     let tokens = quote!(Debug);
     let expected = TyParamBound::Trait(
@@ -105,7 +107,7 @@
             trait_ref: "Debug".into(),
         },
         TraitBoundModifier::None);
-    assert_eq!(expected, tokens.to_string().parse().unwrap());
+    assert_eq!(expected, common::parse::syn::<TyParamBound>(tokens.into()));
 
     let tokens = quote!(?Sized);
     let expected = TyParamBound::Trait(
@@ -114,5 +116,5 @@
             trait_ref: "Sized".into(),
         },
         TraitBoundModifier::Maybe(Default::default()));
-    assert_eq!(expected, tokens.to_string().parse().unwrap());
+    assert_eq!(expected, common::parse::syn::<TyParamBound>(tokens.into()));
 }
diff --git a/tests/test_grouping.rs b/tests/test_grouping.rs
index f41f9ce..d010462 100644
--- a/tests/test_grouping.rs
+++ b/tests/test_grouping.rs
@@ -4,11 +4,13 @@
 use syn::{Expr, ExprKind, ExprGroup, ExprBinary, Lit, LitKind, BinOp};
 
 extern crate synom;
-use synom::{tokens, Synom};
+use synom::tokens;
 
 extern crate proc_macro2;
 use proc_macro2::*;
 
+mod common;
+
 fn tt(k: TokenNode) -> TokenTree {
     TokenTree {
         span: Span::default(),
@@ -43,7 +45,7 @@
 
     assert_eq!(raw.to_string(), "1i32 +  2i32 + 3i32  * 4i32");
 
-    assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
+    assert_eq!(common::parse::syn::<Expr>(raw), expr(ExprBinary {
         left: Box::new(lit(Literal::i32(1))),
         op: BinOp::Add(tokens::Add::default()),
         right: Box::new(expr(ExprBinary {
@@ -77,7 +79,7 @@
 
     assert_eq!(raw.to_string(), "1i32 +  2i32 +  3i32 * 4i32");
 
-    assert_eq!(Expr::parse_all(raw).unwrap(), expr(ExprBinary {
+    assert_eq!(common::parse::syn::<Expr>(raw.into()), expr(ExprBinary {
         left: Box::new(expr(ExprBinary {
             left: Box::new(lit(Literal::i32(1))),
             op: BinOp::Add(tokens::Add::default()),
diff --git a/tests/test_precedence.rs b/tests/test_precedence.rs
index a97f622..a5128fc 100644
--- a/tests/test_precedence.rs
+++ b/tests/test_precedence.rs
@@ -95,9 +95,9 @@
         let mut content = String::new();
         file.read_to_string(&mut content).unwrap();
 
-        let (l_passed, l_failed) = match content.parse::<syn::Crate>() {
-            Ok(krate) => {
-                let exprs = collect_exprs(krate);
+        let (l_passed, l_failed) = match syn::parse_file(&content) {
+            Ok(file) => {
+                let exprs = collect_exprs(file);
                 test_expressions(exprs)
             }
             Err(msg) => {
@@ -351,7 +351,7 @@
 }
 
 /// Walk through a crate collecting all expressions we can find in it.
-fn collect_exprs(krate: syn::Crate) -> Vec<syn::Expr> {
+fn collect_exprs(file: syn::File) -> Vec<syn::Expr> {
     use synom::delimited::Delimited;
     use syn::*;
     use syn::fold::*;
@@ -373,6 +373,6 @@
     }
 
     let mut folder = CollectExprsFolder(vec![]);
-    folder.fold_crate(krate);
+    folder.fold_file(file);
     folder.0
 }
diff --git a/tests/test_round_trip.rs b/tests/test_round_trip.rs
index c07d5f9..6bab10f 100644
--- a/tests/test_round_trip.rs
+++ b/tests/test_round_trip.rs
@@ -47,7 +47,7 @@
         file.read_to_string(&mut content).unwrap();
 
         let start = Instant::now();
-        let (krate, elapsed) = match content.parse::<syn::Crate>() {
+        let (krate, elapsed) = match syn::parse_file(&content) {
             Ok(krate) => (krate, start.elapsed()),
             Err(msg) => {
                 errorf!("syn failed to parse\n{:?}\n", msg);
diff --git a/tests/test_token_trees.rs b/tests/test_token_trees.rs
index de9eb0b..d644d52 100644
--- a/tests/test_token_trees.rs
+++ b/tests/test_token_trees.rs
@@ -90,6 +90,6 @@
 #[test]
 fn test_literal_mangling() {
     let raw = "0_4";
-    let parsed = raw.parse::<Lit>().unwrap();
+    let parsed: Lit = syn::parse_str(raw).unwrap();
     assert_eq!(raw, quote!(#parsed).to_string());
 }