Move extension traits into top level ext module
diff --git a/src/data.rs b/src/data.rs
index 242dc7f..fff1c84 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -185,8 +185,8 @@
pub mod parsing {
use super::*;
+ use ext::IdentExt;
use parse::{Parse, ParseStream, Result};
- use synom::ext::IdentExt;
impl Parse for Variant {
fn parse(input: ParseStream) -> Result<Self> {
diff --git a/src/expr.rs b/src/expr.rs
index eaae23f..27b9eb5 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -1025,11 +1025,11 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
- use path;
- use parse::{Parse, ParseStream, Result};
#[cfg(feature = "full")]
- use synom::ext::IdentExt;
+ use ext::IdentExt;
+ use parse::{Parse, ParseStream, Result};
+ use path;
// When we're parsing expressions which occur before blocks, like in an if
// statement's condition, we cannot parse a struct literal.
diff --git a/src/ext.rs b/src/ext.rs
new file mode 100644
index 0000000..d45fc26
--- /dev/null
+++ b/src/ext.rs
@@ -0,0 +1,60 @@
+//! Extension traits that are made available within the `call!` parser.
+//!
+//! *This module is available if Syn is built with the `"parsing"` feature.*
+
+use proc_macro2::Ident;
+
+use parse::{ParseStream, Result};
+
+/// Additional parsing methods for `Ident`.
+///
+/// This trait is sealed and cannot be implemented for types outside of Syn.
+///
+/// *This trait is available if Syn is built with the `"parsing"` feature.*
+pub trait IdentExt: Sized + private::Sealed {
+ /// Parses any identifier including keywords.
+ ///
+ /// This is useful when parsing a DSL which allows Rust keywords as
+ /// identifiers.
+ ///
+ /// ```rust
+ /// #[macro_use]
+ /// extern crate syn;
+ ///
+ /// use syn::Ident;
+ ///
+ /// // Parses input that looks like `name = NAME` where `NAME` can be
+ /// // any identifier.
+ /// //
+ /// // Examples:
+ /// //
+ /// // name = anything
+ /// // name = impl
+ /// named!(parse_dsl -> Ident, do_parse!(
+ /// custom_keyword!(name) >>
+ /// punct!(=) >>
+ /// name: call!(Ident::parse_any) >>
+ /// (name)
+ /// ));
+ /// #
+ /// # fn main() {}
+ /// ```
+ fn parse_any(input: ParseStream) -> Result<Self>;
+}
+
+impl IdentExt for Ident {
+ fn parse_any(input: ParseStream) -> Result<Self> {
+ input.step(|cursor| match cursor.ident() {
+ Some((ident, rest)) => Ok((ident, rest)),
+ None => Err(cursor.error("expected ident")),
+ })
+ }
+}
+
+mod private {
+ use proc_macro2::Ident;
+
+ pub trait Sealed {}
+
+ impl Sealed for Ident {}
+}
diff --git a/src/item.rs b/src/item.rs
index 3fe7c70..d95019d 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -768,8 +768,8 @@
pub mod parsing {
use super::*;
+ use ext::IdentExt;
use parse::{Parse, ParseStream, Result};
- use synom::ext::IdentExt;
impl Parse for Item {
fn parse(input: ParseStream) -> Result<Self> {
diff --git a/src/lib.rs b/src/lib.rs
index 5c60a70..6c8e915 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -438,6 +438,8 @@
#[cfg(feature = "parsing")]
pub mod buffer;
+#[cfg(feature = "parsing")]
+pub mod ext;
pub mod punctuated;
#[cfg(feature = "parsing")]
pub mod synom;
diff --git a/src/lifetime.rs b/src/lifetime.rs
index 6a039c6..e62d6d0 100644
--- a/src/lifetime.rs
+++ b/src/lifetime.rs
@@ -118,8 +118,9 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
+
+ use ext::IdentExt;
use parse::{Error, Parse, ParseStream, Result};
- use synom::ext::IdentExt;
impl Parse for Lifetime {
fn parse(input: ParseStream) -> Result<Self> {
diff --git a/src/path.rs b/src/path.rs
index 4a63b65..3c4ce07 100644
--- a/src/path.rs
+++ b/src/path.rs
@@ -227,10 +227,11 @@
#[cfg(feature = "parsing")]
pub mod parsing {
use super::*;
+
#[cfg(feature = "full")]
use expr;
+ use ext::IdentExt;
use parse::{Parse, ParseStream, Result};
- use synom::ext::IdentExt;
impl Parse for Path {
fn parse(input: ParseStream) -> Result<Self> {
diff --git a/src/synom.rs b/src/synom.rs
index f08c7d0..4dabe38 100644
--- a/src/synom.rs
+++ b/src/synom.rs
@@ -269,65 +269,3 @@
}
}
}
-
-/// Extension traits that are made available within the `call!` parser.
-///
-/// *This module is available if Syn is built with the `"parsing"` feature.*
-pub mod ext {
- use proc_macro2::Ident;
-
- use parse::{ParseStream, Result};
-
- /// Additional parsing methods for `Ident`.
- ///
- /// This trait is sealed and cannot be implemented for types outside of Syn.
- ///
- /// *This trait is available if Syn is built with the `"parsing"` feature.*
- pub trait IdentExt: Sized + private::Sealed {
- /// Parses any identifier including keywords.
- ///
- /// This is useful when parsing a DSL which allows Rust keywords as
- /// identifiers.
- ///
- /// ```rust
- /// #[macro_use]
- /// extern crate syn;
- ///
- /// use syn::Ident;
- ///
- /// // Parses input that looks like `name = NAME` where `NAME` can be
- /// // any identifier.
- /// //
- /// // Examples:
- /// //
- /// // name = anything
- /// // name = impl
- /// named!(parse_dsl -> Ident, do_parse!(
- /// custom_keyword!(name) >>
- /// punct!(=) >>
- /// name: call!(Ident::parse_any) >>
- /// (name)
- /// ));
- /// #
- /// # fn main() {}
- /// ```
- fn parse_any(input: ParseStream) -> Result<Self>;
- }
-
- impl IdentExt for Ident {
- fn parse_any(input: ParseStream) -> Result<Self> {
- input.step(|cursor| match cursor.ident() {
- Some((ident, rest)) => Ok((ident, rest)),
- None => Err(cursor.error("expected ident")),
- })
- }
- }
-
- mod private {
- use proc_macro2::Ident;
-
- pub trait Sealed {}
-
- impl Sealed for Ident {}
- }
-}