Function to peek any ident
diff --git a/src/ext.rs b/src/ext.rs
index 8d679e7..91eec34 100644
--- a/src/ext.rs
+++ b/src/ext.rs
@@ -4,7 +4,10 @@
use proc_macro2::Ident;
-use parse::{ParseStream, Result};
+use buffer::Cursor;
+use parse::{ParseStream, Peek, Result};
+use sealed::lookahead;
+use token::CustomToken;
/// Additional methods for `Ident` not provided by proc-macro2 or libproc_macro.
///
@@ -15,7 +18,7 @@
pub trait IdentExt: Sized + private::Sealed {
/// Parses any identifier including keywords.
///
- /// This is useful when parsing a DSL which allows Rust keywords as
+ /// This is useful when parsing macro input which allows Rust keywords as
/// identifiers.
///
/// # Example
@@ -25,6 +28,10 @@
/// use syn::ext::IdentExt;
/// use syn::parse::ParseStream;
///
+ /// mod kw {
+ /// syn::custom_keyword!(name);
+ /// }
+ ///
/// // Parses input that looks like `name = NAME` where `NAME` can be
/// // any identifier.
/// //
@@ -33,10 +40,7 @@
/// // name = anything
/// // name = impl
/// fn parse_dsl(input: ParseStream) -> Result<Ident> {
- /// let name_token: Ident = input.parse()?;
- /// if name_token != "name" {
- /// return Err(Error::new(name_token.span(), "expected `name`"));
- /// }
+ /// input.parse::<kw::name>()?;
/// input.parse::<Token![=]>()?;
/// let name = input.call(Ident::parse_any)?;
/// Ok(name)
@@ -44,6 +48,14 @@
/// ```
fn parse_any(input: ParseStream) -> Result<Self>;
+ /// Peeks any identifier including keywords. Usage:
+ /// `input.peek(Ident::peek_any)`
+ ///
+ /// This is different from `input.peek(Ident)` which only returns true in
+ /// the case of an ident which is not a Rust keyword.
+ #[allow(non_upper_case_globals)]
+ const peek_any: private::PeekFn = private::PeekFn;
+
/// Strips the raw marker `r#`, if any, from the beginning of an ident.
///
/// - unraw(`x`) = `x`
@@ -92,10 +104,30 @@
}
}
+impl Peek for private::PeekFn {
+ type Token = private::IdentAny;
+}
+
+impl CustomToken for private::IdentAny {
+ fn peek(cursor: Cursor) -> bool {
+ cursor.ident().is_some()
+ }
+
+ fn display() -> &'static str {
+ "identifier"
+ }
+}
+
+impl lookahead::Sealed for private::PeekFn {}
+
mod private {
use proc_macro2::Ident;
pub trait Sealed {}
impl Sealed for Ident {}
+
+ #[derive(Copy, Clone)]
+ pub struct PeekFn;
+ pub struct IdentAny;
}
diff --git a/src/lib.rs b/src/lib.rs
index 85f44b2..dce314f 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -540,6 +540,7 @@
mod custom_keyword;
mod custom_punctuation;
+mod sealed;
#[cfg(feature = "parsing")]
mod lookahead;
diff --git a/src/lookahead.rs b/src/lookahead.rs
index 8ee1554..0f5afe1 100644
--- a/src/lookahead.rs
+++ b/src/lookahead.rs
@@ -4,6 +4,7 @@
use buffer::Cursor;
use error::{self, Error};
+use sealed::lookahead::Sealed;
use span::IntoSpans;
use token::Token;
@@ -94,7 +95,8 @@
///
/// - `input.peek(Token![struct])`
/// - `input.peek(Token![==])`
- /// - `input.peek(Ident)`
+ /// - `input.peek(Ident)` *(does not accept keywords)*
+ /// - `input.peek(Ident::peek_any)`
/// - `input.peek(Lifetime)`
/// - `input.peek(token::Brace)`
pub fn peek<T: Peek>(&self, token: T) -> bool {
@@ -141,7 +143,7 @@
/// This trait is sealed and cannot be implemented for types outside of Syn.
///
/// [`ParseStream::peek`]: struct.ParseBuffer.html#method.peek
-pub trait Peek: private::Sealed {
+pub trait Peek: Sealed {
// Not public API.
#[doc(hidden)]
type Token: Token;
@@ -163,8 +165,4 @@
cursor.group(delimiter).is_some()
}
-mod private {
- use super::{Token, TokenMarker};
- pub trait Sealed: Copy {}
- impl<F: Copy + FnOnce(TokenMarker) -> T, T: Token> Sealed for F {}
-}
+impl<F: Copy + FnOnce(TokenMarker) -> T, T: Token> Sealed for F {}
diff --git a/src/parse.rs b/src/parse.rs
index 36f1caf..e651d15 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -469,7 +469,8 @@
///
/// - `input.peek(Token![struct])`
/// - `input.peek(Token![==])`
- /// - `input.peek(Ident)`
+ /// - `input.peek(Ident)` *(does not accept keywords)*
+ /// - `input.peek(Ident::peek_any)`
/// - `input.peek(Lifetime)`
/// - `input.peek(token::Brace)`
///
diff --git a/src/sealed.rs b/src/sealed.rs
new file mode 100644
index 0000000..0b11bc9
--- /dev/null
+++ b/src/sealed.rs
@@ -0,0 +1,4 @@
+#[cfg(feature = "parsing")]
+pub mod lookahead {
+ pub trait Sealed: Copy {}
+}