Allow peeking delimiters
diff --git a/src/lookahead.rs b/src/lookahead.rs
index 433cbaf..d1162c0 100644
--- a/src/lookahead.rs
+++ b/src/lookahead.rs
@@ -1,6 +1,6 @@
use std::cell::RefCell;
-use proc_macro2::Span;
+use proc_macro2::{Delimiter, Span};
use buffer::Cursor;
use error::{self, Error};
@@ -90,6 +90,12 @@
}
}
+// Not public API.
+#[doc(hidden)]
+pub fn is_delimiter(lookahead: &Lookahead1, delimiter: Delimiter) -> bool {
+ lookahead.cursor.group(delimiter).is_some()
+}
+
mod private {
use super::{Token, TokenMarker};
pub trait Sealed {}
diff --git a/src/token.rs b/src/token.rs
index 1d355a3..27a49d9 100644
--- a/src/token.rs
+++ b/src/token.rs
@@ -105,6 +105,8 @@
#[cfg(feature = "extra-traits")]
use std::hash::{Hash, Hasher};
+#[cfg(feature = "parsing")]
+use proc_macro2::Delimiter;
#[cfg(any(feature = "printing", feature = "parsing"))]
use proc_macro2::Spacing;
use proc_macro2::{Ident, Span};
@@ -371,6 +373,9 @@
parsing::delim($token, tokens, $name, f)
}
}
+
+ #[cfg(feature = "parsing")]
+ impl private::Sealed for $name {}
)*
};
}
@@ -437,6 +442,39 @@
}
}
+#[cfg(feature = "parsing")]
+impl Token for Paren {
+ fn peek(lookahead: &Lookahead1) -> bool {
+ lookahead::is_delimiter(lookahead, Delimiter::Parenthesis)
+ }
+
+ fn display() -> String {
+ "parentheses".to_owned()
+ }
+}
+
+#[cfg(feature = "parsing")]
+impl Token for Brace {
+ fn peek(lookahead: &Lookahead1) -> bool {
+ lookahead::is_delimiter(lookahead, Delimiter::Brace)
+ }
+
+ fn display() -> String {
+ "curly braces".to_owned()
+ }
+}
+
+#[cfg(feature = "parsing")]
+impl Token for Bracket {
+ fn peek(lookahead: &Lookahead1) -> bool {
+ lookahead::is_delimiter(lookahead, Delimiter::Bracket)
+ }
+
+ fn display() -> String {
+ "square brackets".to_owned()
+ }
+}
+
define_keywords! {
"as" pub struct As /// `as`
"async" pub struct Async /// `async`