Switch to Cursor in syn
diff --git a/src/attr.rs b/src/attr.rs
index 5bff9be..2a58082 100644
--- a/src/attr.rs
+++ b/src/attr.rs
@@ -382,19 +382,19 @@
}
fn lit_doc_comment(input: Cursor) -> PResult<TokenTree> {
- let mut tokens = input.iter();
- let tok = match tokens.next() {
- Some(tok) => tok,
- None => return parse_error(),
- };
- let literal = match tok.kind {
- TokenKind::Literal(ref l) => l.to_string(),
- _ => return parse_error(),
- };
- if literal.starts_with("//") || literal.starts_with("/*") {
- Ok((tokens.as_slice(), tok.clone()))
- } else {
- parse_error()
+ match input.literal() {
+ Some((rest, span, lit)) => {
+ let literal = lit.to_string();
+ if literal.starts_with("//") || literal.starts_with("/*") {
+ Ok((rest, TokenTree {
+ span: span,
+ kind: TokenKind::Literal(lit)
+ }))
+ } else {
+ parse_error()
+ }
+ }
+ _ => parse_error()
}
}
}
diff --git a/src/generics.rs b/src/generics.rs
index 2ab61bf..2c30a5f 100644
--- a/src/generics.rs
+++ b/src/generics.rs
@@ -213,7 +213,6 @@
use synom::{PResult, Cursor, Synom, parse_error};
use synom::tokens::*;
- use proc_macro2::TokenKind;
impl Synom for Generics {
named!(parse -> Self, map!(
@@ -243,20 +242,18 @@
impl Synom for Lifetime {
fn parse(input: Cursor) -> PResult<Self> {
- let mut tokens = input.iter();
- let token = match tokens.next() {
- Some(token) => token,
- None => return parse_error(),
- };
- if let TokenKind::Word(s) = token.kind {
- if s.as_str().starts_with('\'') {
- return Ok((tokens.as_slice(), Lifetime {
- ident: Ident {
- span: Span(token.span),
- sym: s,
- },
- }))
+ match input.word() {
+ Some((rest, span, sym)) => {
+ if sym.as_str().starts_with('\'') {
+ return Ok((rest, Lifetime {
+ ident: Ident {
+ span: Span(span),
+ sym: sym
+ }
+ }));
+ }
}
+ _ => {}
}
parse_error()
}
diff --git a/src/ident.rs b/src/ident.rs
index 181bac9..afc8a3a 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -108,24 +108,18 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use proc_macro2::TokenKind;
use synom::{Synom, PResult, Cursor, parse_error};
impl Synom for Ident {
fn parse(input: Cursor) -> PResult<Self> {
- let mut tokens = input.iter();
- let token = match tokens.next() {
- Some(token) => token,
- None => return parse_error(),
- };
- let word = match token.kind {
- TokenKind::Word(s) => s,
+ let (rest, span, sym) = match input.word() {
+ Some(word) => word,
_ => return parse_error(),
};
- if word.as_str().starts_with('\'') {
+ if sym.as_str().starts_with('\'') {
return parse_error();
}
- match word.as_str() {
+ match sym.as_str() {
// From https://doc.rust-lang.org/grammar.html#keywords
"abstract" | "alignof" | "as" | "become" | "box" | "break" | "const" | "continue" |
"crate" | "do" | "else" | "enum" | "extern" | "false" | "final" | "fn" | "for" |
@@ -137,9 +131,9 @@
_ => {}
}
- Ok((tokens.as_slice(), Ident {
- span: Span(token.span),
- sym: word,
+ Ok((rest, Ident {
+ span: Span(span),
+ sym: sym,
}))
}
diff --git a/src/lit.rs b/src/lit.rs
index c9b4229..659571e 100644
--- a/src/lit.rs
+++ b/src/lit.rs
@@ -105,21 +105,31 @@
impl Synom for Lit {
fn parse(input: Cursor) -> PResult<Self> {
- let mut tokens = input.iter();
- let token = match tokens.next() {
- Some(token) => token,
- None => return parse_error(),
- };
- let kind = match token.kind {
- TokenKind::Literal(ref l) => LitKind::Other(l.clone()),
- TokenKind::Word(ref s) if s.as_str() == "true" => LitKind::Bool(true),
- TokenKind::Word(ref s) if s.as_str() == "false" => LitKind::Bool(false),
- _ => return parse_error(),
- };
- Ok((tokens.as_slice(), Lit {
- span: Span(token.span),
- value: kind,
- }))
+ match input.literal() {
+ Some((rest, span, lit)) => {
+ Ok((rest, Lit {
+ span: Span(span),
+ value: LitKind::Other(lit)
+ }))
+ }
+ _ => match input.word() {
+ Some((rest, span, sym)) => {
+ let kind = if sym.as_str() == "true" {
+ LitKind::Bool(true)
+ } else if sym.as_str() == "false" {
+ LitKind::Bool(false)
+ } else {
+ return parse_error();
+ };
+
+ Ok((rest, Lit {
+ span: Span(span),
+ value: kind
+ }))
+ }
+ _ => parse_error(),
+ }
+ }
}
}
}
diff --git a/src/mac.rs b/src/mac.rs
index b822051..3517ac8 100644
--- a/src/mac.rs
+++ b/src/mac.rs
@@ -154,14 +154,13 @@
impl ::TokenTree {
pub fn parse_list(input: Cursor) -> PResult<Vec<Self>> {
- Ok((&[], input.iter().cloned().map(::TokenTree).collect()))
+ Ok((Cursor::empty(), input.token_stream().into_iter().map(::TokenTree).collect()))
}
pub fn parse_delimited(input: Cursor) -> PResult<Self> {
- let mut tokens = input.iter();
- match tokens.next() {
- Some(token @ &TokenTree { kind: TokenKind::Sequence(..), .. }) => {
- Ok((tokens.as_slice(), ::TokenTree(token.clone())))
+ match input.token_tree() {
+ Some((rest, token @ TokenTree { kind: TokenKind::Sequence(..), .. })) => {
+ Ok((rest, ::TokenTree(token)))
}
_ => parse_error(),
}