Enforce that Ident and Lifetime are well formed
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 9f4f9cb..4ca3dde 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -400,6 +400,16 @@
}
+pub fn fold_ident<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Ident) -> Ident {
+ _i.span = _visitor.fold_span(_i.span);
+ _i
+}
+
+pub fn fold_lifetime<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Lifetime) -> Lifetime {
+ _i.span = _visitor.fold_span(_i.span);
+ _i
+}
+
pub fn fold_abi<V: Folder + ?Sized>(_visitor: &mut V, _i: Abi) -> Abi {
Abi {
@@ -1568,13 +1578,6 @@
where_clause: (_i . where_clause).map(|it| { _visitor.fold_where_clause(it) }),
}
}
-
-pub fn fold_ident<V: Folder + ?Sized>(_visitor: &mut V, _i: Ident) -> Ident {
- Ident {
- sym: _i . sym,
- span: _visitor.fold_span(_i . span),
- }
-}
# [ cfg ( feature = "full" ) ]
pub fn fold_impl_item<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItem) -> ImplItem {
use ::ImplItem::*;
@@ -1960,13 +1963,6 @@
}
}
-pub fn fold_lifetime<V: Folder + ?Sized>(_visitor: &mut V, _i: Lifetime) -> Lifetime {
- Lifetime {
- sym: _i . sym,
- span: _visitor.fold_span(_i . span),
- }
-}
-
pub fn fold_lifetime_def<V: Folder + ?Sized>(_visitor: &mut V, _i: LifetimeDef) -> LifetimeDef {
LifetimeDef {
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
diff --git a/src/ident.rs b/src/ident.rs
index 5d85b48..f93fb43 100644
--- a/src/ident.rs
+++ b/src/ident.rs
@@ -87,7 +87,7 @@
/// ```
#[derive(Copy, Clone, Debug)]
pub struct Ident {
- pub sym: Term,
+ sym: Term,
pub span: Span,
}
diff --git a/src/lifetime.rs b/src/lifetime.rs
index bfa59fd..44359de 100644
--- a/src/lifetime.rs
+++ b/src/lifetime.rs
@@ -8,7 +8,7 @@
#[cfg_attr(feature = "extra-traits", derive(Debug))]
#[cfg_attr(feature = "clone-impls", derive(Clone))]
pub struct Lifetime {
- pub sym: Term,
+ sym: Term,
pub span: Span,
}
diff --git a/syn_codegen/src/main.rs b/syn_codegen/src/main.rs
index 4307886..ab10134 100644
--- a/syn_codegen/src/main.rs
+++ b/syn_codegen/src/main.rs
@@ -714,6 +714,7 @@
under_name = under_name,
ty = s.ast.ident,
));
+ let before_fold_impl_len = state.fold_impl.len();
state.fold_impl.push_str(&format!(
"{features}\n\
pub fn fold_{under_name}<V: Folder + ?Sized>(\
@@ -916,6 +917,12 @@
state.visit_impl.push_str("}\n");
state.visit_mut_impl.push_str("}\n");
state.fold_impl.push_str("}\n");
+
+ if s.ast.ident == "Ident" || s.ast.ident == "Lifetime" {
+ // Discard the generated impl. These have private fields and are
+ // handwritten.
+ state.fold_impl.truncate(before_fold_impl_len);
+ }
}
}
@@ -1003,6 +1010,16 @@
{fold_trait}
}}
+pub fn fold_ident<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Ident) -> Ident {{
+ _i.span = _visitor.fold_span(_i.span);
+ _i
+}}
+
+pub fn fold_lifetime<V: Folder + ?Sized>(_visitor: &mut V, mut _i: Lifetime) -> Lifetime {{
+ _i.span = _visitor.fold_span(_i.span);
+ _i
+}}
+
{fold_impl}
",
full_macro = full_macro,