Limit expression parsing in non-full builds
diff --git a/src/macros.rs b/src/macros.rs
index bd686ac..69a405e 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -1,13 +1,32 @@
macro_rules! ast_struct {
(
$(#[$attr:meta])*
+ pub struct $name:ident #full $($rest:tt)*
+ ) => {
+ #[cfg(feature = "full")]
+ $(#[$attr])*
+ #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+ #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct $name $($rest)*
+
+ #[cfg(not(feature = "full"))]
+ $(#[$attr])*
+ #[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
+ #[cfg_attr(feature = "clone-impls", derive(Clone))]
+ pub struct $name {
+ _noconstruct: (),
+ }
+ };
+
+ (
+ $(#[$attr:meta])*
pub struct $name:ident $($rest:tt)*
) => {
$(#[$attr])*
#[cfg_attr(feature = "extra-traits", derive(Debug, Eq, PartialEq, Hash))]
#[cfg_attr(feature = "clone-impls", derive(Clone))]
pub struct $name $($rest)*
- }
+ };
}
macro_rules! ast_enum {
@@ -61,7 +80,7 @@
generate_to_tokens! {
$($remaining)*
- enum $name { $($variant,)* }
+ enum $name { $($variant [$($rest)*],)* }
}
)
}
@@ -69,18 +88,37 @@
macro_rules! generate_to_tokens {
(do_not_generate_to_tokens $($foo:tt)*) => ();
- (enum $name:ident { $($variant:ident,)* }) => (
+ (enum $name:ident { $($variant:ident [$($rest:tt)*],)* }) => (
#[cfg(feature = "printing")]
impl ::quote::ToTokens for $name {
fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
match *self {
$(
- $name::$variant(ref e) => e.to_tokens(tokens),
+ $name::$variant(ref _e) =>
+ to_tokens_call!(_e, tokens, $($rest)*),
)*
}
}
}
- )
+ );
+}
+
+#[cfg(feature = "full")]
+macro_rules! to_tokens_call {
+ ($e:ident, $tokens:ident, $($rest:tt)*) => {
+ $e.to_tokens($tokens)
+ };
+}
+
+#[cfg(not(feature = "full"))]
+macro_rules! to_tokens_call {
+ // If the variant is marked as #full, don't auto-generate to-tokens for it.
+ ($e:ident, $tokens:ident, #full $($rest:tt)*) => {
+ unreachable!()
+ };
+ ($e:ident, $tokens:ident, $($rest:tt)*) => {
+ $e.to_tokens($tokens)
+ };
}
macro_rules! maybe_ast_struct {