Handle codegen features in one place
diff --git a/codegen/src/fold.rs b/codegen/src/fold.rs
index 9d55384..7cadf20 100644
--- a/codegen/src/fold.rs
+++ b/codegen/src/fold.rs
@@ -96,17 +96,7 @@
}
}
-fn visit_features(features: &Features) -> TokenStream {
- let features = &features.any;
- match features.len() {
- 0 => quote!(),
- 1 => quote!(#[cfg(feature = #(#features)*)]),
- _ => quote!(#[cfg(any(#(feature = #features),*))]),
- }
-}
-
fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
- let features = visit_features(&s.features);
let under_name = gen::under_name(&s.ident);
let ty = Ident::new(&s.ident, Span::call_site());
let fold_fn = Ident::new(&format!("fold_{}", under_name), Span::call_site());
@@ -221,14 +211,12 @@
}
traits.extend(quote! {
- #features
fn #fold_fn(&mut self, i: #ty) -> #ty {
#fold_fn(self, i)
}
});
impls.extend(quote! {
- #features
pub fn #fold_fn<V: Fold + ?Sized>(
_visitor: &mut V, _i: #ty
) -> #ty {
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index 62de202..db033f9 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -1,5 +1,6 @@
use inflections::Inflect;
use proc_macro2::{Ident, Span, TokenStream};
+use quote::quote;
use syn_codegen::{Data, Features, Definitions, Node};
pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"];
@@ -15,6 +16,14 @@
let mut traits = TokenStream::new();
let mut impls = TokenStream::new();
for s in &defs.types {
+ let features = &s.features.any;
+ let features = match features.len() {
+ 0 => quote!(),
+ 1 => quote!(#[cfg(feature = #(#features)*)]),
+ _ => quote!(#[cfg(any(#(feature = #features),*))]),
+ };
+ traits.extend(features.clone());
+ impls.extend(features);
node(&mut traits, &mut impls, s, defs);
}
for tt in TERMINAL_TYPES {
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index 6d47d47..988045d 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -112,17 +112,7 @@
}
}
-fn visit_features(features: &Features) -> TokenStream {
- let features = &features.any;
- match features.len() {
- 0 => quote!(),
- 1 => quote!(#[cfg(feature = #(#features)*)]),
- _ => quote!(#[cfg(any(#(feature = #features),*))]),
- }
-}
-
fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
- let features = visit_features(&s.features);
let under_name = gen::under_name(&s.ident);
let ty = Ident::new(&s.ident, Span::call_site());
let visit_fn = Ident::new(&format!("visit_{}", under_name), Span::call_site());
@@ -191,14 +181,12 @@
}
traits.extend(quote! {
- #features
fn #visit_fn(&mut self, i: &'ast #ty) {
#visit_fn(self, i)
}
});
impls.extend(quote! {
- #features
pub fn #visit_fn<'ast, V: Visit<'ast> + ?Sized>(
_visitor: &mut V, _i: &'ast #ty
) {
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index 7355349..2202aad 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -112,17 +112,7 @@
}
}
-fn visit_features(features: &Features) -> TokenStream {
- let features = &features.any;
- match features.len() {
- 0 => quote!(),
- 1 => quote!(#[cfg(feature = #(#features)*)]),
- _ => quote!(#[cfg(any(#(feature = #features),*))]),
- }
-}
-
fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
- let features = visit_features(&s.features);
let under_name = gen::under_name(&s.ident);
let ty = Ident::new(&s.ident, Span::call_site());
let visit_mut_fn = Ident::new(&format!("visit_{}_mut", under_name), Span::call_site());
@@ -191,14 +181,12 @@
}
traits.extend(quote! {
- #features
fn #visit_mut_fn(&mut self, i: &mut #ty) {
#visit_mut_fn(self, i)
}
});
impls.extend(quote! {
- #features
pub fn #visit_mut_fn<V: VisitMut + ?Sized>(
_visitor: &mut V, _i: &mut #ty
) {