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());
}