Skip to main content

rustc_ast/
mut_visit.rs

1//! A `MutVisitor` represents an AST modification; it accepts an AST piece and
2//! mutates it in place. So, for instance, macro expansion is a `MutVisitor`
3//! that walks over an AST and modifies it.
4//!
5//! Note: using a `MutVisitor` (other than the `MacroExpander` `MutVisitor`) on
6//! an AST before macro expansion is probably a bad idea. For instance,
7//! a `MutVisitor` renaming item names in a module will miss all of those
8//! that are created by the expansion of a macro.
9
10use std::ops::DerefMut;
11use std::panic;
12
13use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
14use rustc_span::{Ident, Span, Spanned, Symbol};
15use smallvec::{SmallVec, smallvec};
16use thin_vec::ThinVec;
17
18use crate::ast::*;
19use crate::tokenstream::*;
20use crate::visit::{AssocCtxt, BoundKind, FnCtxt, LifetimeCtxt, VisitorResult, try_visit};
21
22mod sealed {
23    use rustc_ast_ir::visit::VisitorResult;
24
25    /// This is for compatibility with the regular `Visitor`.
26    pub trait MutVisitorResult {
27        type Result: VisitorResult;
28    }
29
30    impl<T> MutVisitorResult for T {
31        type Result = ();
32    }
33}
34
35use sealed::MutVisitorResult;
36
37pub(crate) trait MutVisitable<V: MutVisitor> {
38    type Extra: Copy;
39    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra);
40}
41
42impl<V: MutVisitor, T: ?Sized> MutVisitable<V> for Box<T>
43where
44    T: MutVisitable<V>,
45{
46    type Extra = T::Extra;
47    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
48        (**self).visit_mut(visitor, extra)
49    }
50}
51
52impl<V: MutVisitor, T> MutVisitable<V> for Option<T>
53where
54    T: MutVisitable<V>,
55{
56    type Extra = T::Extra;
57    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
58        if let Some(this) = self {
59            this.visit_mut(visitor, extra)
60        }
61    }
62}
63
64impl<V: MutVisitor, T> MutVisitable<V> for Spanned<T>
65where
66    T: MutVisitable<V>,
67{
68    type Extra = T::Extra;
69    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
70        let Spanned { span, node } = self;
71        span.visit_mut(visitor, ());
72        node.visit_mut(visitor, extra);
73    }
74}
75
76impl<V: MutVisitor, T> MutVisitable<V> for [T]
77where
78    T: MutVisitable<V>,
79{
80    type Extra = T::Extra;
81    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
82        for item in self {
83            item.visit_mut(visitor, extra);
84        }
85    }
86}
87
88impl<V: MutVisitor, T> MutVisitable<V> for Vec<T>
89where
90    T: MutVisitable<V>,
91{
92    type Extra = T::Extra;
93    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
94        for item in self {
95            item.visit_mut(visitor, extra);
96        }
97    }
98}
99
100impl<V: MutVisitor, T1, T2> MutVisitable<V> for (T1, T2)
101where
102    T1: MutVisitable<V, Extra = ()>,
103    T2: MutVisitable<V, Extra = ()>,
104{
105    type Extra = ();
106    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
107        self.0.visit_mut(visitor, extra);
108        self.1.visit_mut(visitor, extra);
109    }
110}
111
112impl<V: MutVisitor, T1, T2, T3> MutVisitable<V> for (T1, T2, T3)
113where
114    T1: MutVisitable<V, Extra = ()>,
115    T2: MutVisitable<V, Extra = ()>,
116    T3: MutVisitable<V, Extra = ()>,
117{
118    type Extra = ();
119    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
120        self.0.visit_mut(visitor, extra);
121        self.1.visit_mut(visitor, extra);
122        self.2.visit_mut(visitor, extra);
123    }
124}
125
126impl<V: MutVisitor, T1, T2, T3, T4> MutVisitable<V> for (T1, T2, T3, T4)
127where
128    T1: MutVisitable<V, Extra = ()>,
129    T2: MutVisitable<V, Extra = ()>,
130    T3: MutVisitable<V, Extra = ()>,
131    T4: MutVisitable<V, Extra = ()>,
132{
133    type Extra = ();
134    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
135        self.0.visit_mut(visitor, extra);
136        self.1.visit_mut(visitor, extra);
137        self.2.visit_mut(visitor, extra);
138        self.3.visit_mut(visitor, extra);
139    }
140}
141
142pub trait MutWalkable<V: MutVisitor> {
143    fn walk_mut(&mut self, visitor: &mut V);
144}
145
146macro_rules! visit_visitable {
147    ($visitor:expr, $($expr:expr),* $(,)?) => {{
148        $(MutVisitable::visit_mut($expr, $visitor, ());)*
149    }};
150}
151
152macro_rules! visit_visitable_with {
153    ($visitor:expr, $expr:expr, $extra:expr $(,)?) => {
154        MutVisitable::visit_mut($expr, $visitor, $extra)
155    };
156}
157
158macro_rules! impl_visitable {
159    (|&mut $self:ident: $self_ty:ty,
160      $vis:ident: &mut $vis_ty:ident,
161      $extra:ident: $extra_ty:ty| $block:block) => {
162        #[allow(unused_parens, non_local_definitions)]
163        impl<$vis_ty: MutVisitor> MutVisitable<$vis_ty> for $self_ty {
164            type Extra = $extra_ty;
165            fn visit_mut(&mut $self, $vis: &mut $vis_ty, $extra: Self::Extra) -> V::Result {
166                $block
167            }
168        }
169    };
170}
171
172macro_rules! impl_walkable {
173    (|&mut $self:ident: $self_ty:ty,
174      $vis:ident: &mut $vis_ty:ident| $block:block) => {
175        impl<$vis_ty: MutVisitor> MutWalkable<$vis_ty> for $self_ty {
176            fn walk_mut(&mut $self, $vis: &mut $vis_ty) -> V::Result {
177                $block
178            }
179        }
180    };
181}
182
183macro_rules! impl_visitable_noop {
184    ($($ty:ty,)*) => {
185        $(
186            impl_visitable!(|&mut self: $ty, _vis: &mut V, _extra: ()| {});
187        )*
188    };
189}
190
191macro_rules! impl_visitable_list {
192    ($($ty:ty,)*) => {
193        $(impl<V: MutVisitor, T> MutVisitable<V> for $ty
194        where
195            for<'a> &'a mut $ty: IntoIterator<Item = &'a mut T>,
196            T: MutVisitable<V>,
197        {
198            type Extra = <T as MutVisitable<V>>::Extra;
199
200            #[inline]
201            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
202                for i in self {
203                    i.visit_mut(visitor, extra);
204                }
205            }
206        })*
207    }
208}
209
210macro_rules! impl_visitable_direct {
211    ($($ty:ty,)*) => {
212        $(impl_visitable!(
213            |&mut self: $ty, visitor: &mut V, _extra: ()| {
214                MutWalkable::walk_mut(self, visitor)
215            }
216        );)*
217    }
218}
219
220macro_rules! impl_visitable_calling_walkable {
221    (
222        $( fn $method:ident($ty:ty $(, $extra_name:ident: $extra_ty:ty)?); )*
223    ) => {
224        $(fn $method(&mut self, node: &mut $ty $(, $extra_name:$extra_ty)?) {
225            impl_visitable!(|&mut self: $ty, visitor: &mut V, extra: ($($extra_ty)?)| {
226                let ($($extra_name)?) = extra;
227                visitor.$method(self $(, $extra_name)?);
228            });
229            MutWalkable::walk_mut(node, self)
230        })*
231    }
232}
233
234macro_rules! define_named_walk {
235    ($Visitor:ident
236        $( pub fn $method:ident($ty:ty); )*
237    ) => {
238        $(pub fn $method<V: $Visitor>(visitor: &mut V, node: &mut $ty) {
239            MutWalkable::walk_mut(node, visitor)
240        })*
241    };
242}
243
244pub enum FnKind<'a> {

    /// E.g., `fn foo()`, `fn foo(&self)`, or `extern "Abi" fn foo()`.
    Fn(FnCtxt, &'a mut Visibility, &'a mut Fn),

    /// E.g., `|x, y| body`.
    Closure(&'a mut ClosureBinder, &'a mut Option<CoroutineMarker>,
        &'a mut Box<FnDecl>, &'a mut Box<Expr>),
}
#[automatically_derived]
impl<'a> ::core::fmt::Debug for FnKind<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            FnKind::Fn(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Fn",
                    __self_0, __self_1, &__self_2),
            FnKind::Closure(__self_0, __self_1, __self_2, __self_3) =>
                ::core::fmt::Formatter::debug_tuple_field4_finish(f,
                    "Closure", __self_0, __self_1, __self_2, &__self_3),
        }
    }
}
impl<'a> FnKind<'_> {
    pub fn header(&'a mut self) -> Option<&'a mut FnHeader> {
        match *self {
            FnKind::Fn(_, _, Fn { sig, .. }) => Some(&mut sig.header),
            FnKind::Closure(..) => None,
        }
    }
    pub fn ident(&'a mut self) -> Option<&'a mut Ident> {
        match self {
            FnKind::Fn(_, _, Fn { ident, .. }) => Some(ident),
            _ => None,
        }
    }
    pub fn decl(&'a mut self) -> &'a mut FnDecl {
        match self {
            FnKind::Fn(_, _, Fn { sig, .. }) => &mut sig.decl,
            FnKind::Closure(_, _, decl, _) => decl,
        }
    }
    pub fn ctxt(&self) -> Option<FnCtxt> {
        match self {
            FnKind::Fn(ctxt, ..) => Some(*ctxt),
            FnKind::Closure(..) => None,
        }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AttrId {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for bool {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for rustc_span::ByteSymbol {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for char {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for crate::token::CommentKind {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for crate::token::Delimiter {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for crate::token::Lit {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for crate::token::LitKind {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for
    crate::tokenstream::LazyAttrTokenStream {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for crate::tokenstream::TokenStream {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Movability {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Mutability {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Pinnedness {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for
    Result<(), rustc_span::ErrorGuaranteed> {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for
    rustc_data_structures::fx::FxHashMap<Symbol, usize> {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for rustc_span::ErrorGuaranteed {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for std::borrow::Cow<'_, str> {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Symbol {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for SyntheticAttr {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for u8 {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for usize {
    type Extra = ();
    fn visit_mut(&mut self, _vis: &mut V, _extra: Self::Extra) -> V::Result {
        {}
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<AngleBracketedArg> where
    for<'a> &'a mut ThinVec<AngleBracketedArg>: IntoIterator<Item =
    &'a mut T>, T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<Attribute> where
    for<'a> &'a mut ThinVec<Attribute>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<GenericBound> where
    for<'a> &'a mut ThinVec<GenericBound>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<Ident> where
    for<'a> &'a mut ThinVec<Ident>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<(Ident, Option<Ident>)>
    where
    for<'a> &'a mut ThinVec<(Ident,
    Option<Ident>)>: IntoIterator<Item = &'a mut T>, T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<(NodeId, Path)> where
    for<'a> &'a mut ThinVec<(NodeId, Path)>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<PathSegment> where
    for<'a> &'a mut ThinVec<PathSegment>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<PreciseCapturingArg> where
    for<'a> &'a mut ThinVec<PreciseCapturingArg>: IntoIterator<Item =
    &'a mut T>, T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<Pat> where
    for<'a> &'a mut ThinVec<Pat>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<TestBinderConstraint> where
    for<'a> &'a mut ThinVec<TestBinderConstraint>: IntoIterator<Item =
    &'a mut T>, T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<TestBinderExists> where
    for<'a> &'a mut ThinVec<TestBinderExists>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<TestBinderForall> where
    for<'a> &'a mut ThinVec<TestBinderForall>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<Box<Ty>> where
    for<'a> &'a mut ThinVec<Box<Ty>>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<TyPat> where
    for<'a> &'a mut ThinVec<TyPat>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<EiiImpl> where
    for<'a> &'a mut ThinVec<EiiImpl>: IntoIterator<Item = &'a mut T>,
    T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AngleBracketedArg {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AngleBracketedArgs {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AsmMacro {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AssignOpKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AssocItemConstraintKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AttrArgs {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AttrItem {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AttrKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for AttrStyle {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FnPtrTy {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BindingMode {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for CoroutineKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for RangeLimits {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for UnsafeBinderCastKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BinOpKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BlockCheckMode {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BorrowKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BoundAsyncness {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BoundConstness {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for BoundPolarity {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ByRef {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Closure {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Const {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ConstBlockItem {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ConstItem {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Defaultness {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Delegation {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for DelegationMac {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for DelegationSuffixes {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for DelimArgs {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for DelimSpan {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for EnumDef {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Extern {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ForLoopKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatArgPosition {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatArgsPiece {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatArgument {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatArgumentKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatArguments {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for FormatPlaceholder {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for GenericParamKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Guard {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Impl {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ImplPolarity {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Inline {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for InlineAsmOperand {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for InlineAsmRegOrRegClass {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for InlineAsmTemplatePiece {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for IsAuto {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for LocalKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for MacCallStmt {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for MacStmtStyle {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for MatchKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for MethodCall {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ModKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ModSpans {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for MutTy {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for NormalAttr {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Parens {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for ParenthesizedArgs {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for PatFieldsRest {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for PatKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for RangeEnd {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for RangeSyntax {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Recovered {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for RestrictionKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Safety {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for StaticItem {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for StrLit {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for StrStyle {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for StructExpr {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for StructRest {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Term {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for Trait {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for TraitBoundModifiers {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for TraitObjectSyntax {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for TyAlias {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for TyKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for TyPatKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for UnOp {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for UnsafeBinderTy {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for UnsafeSource {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for UseTreeKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for VisibilityKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for WhereBoundPredicate {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for WhereClause {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for WhereEqPredicate {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for WhereRegionPredicate {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for YieldKind {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for EiiDecl {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
#[allow(unused_parens, non_local_definitions)]
impl<V: MutVisitor> MutVisitable<V> for EiiImpl {
    type Extra = ();
    fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
        -> V::Result {
        { MutWalkable::walk_mut(self, visitor) }
    }
}
/// Each method of this trait is a hook to be potentially
/// overridden. Each method's default implementation recursively visits
/// the substructure of the input via the corresponding `walk` method;
#[doc =
" e.g., the `visit_item` method by default calls `visit_mut::walk_item`."]
///
/// If you want to ensure that your code handles every variant
/// explicitly, you need to override each method. (And you also need
/// to monitor future changes to this trait in case a new method with a
/// new default implementation gets introduced.)
///
/// Every `walk_*` method uses deconstruction to access fields of structs and
/// enums. This will result in a compile error if a field is added, which makes
/// it more likely the appropriate visit call will be added for it.
pub trait MutVisitor: Sized + MutVisitorResult<Result = ()> {
    fn visit_ident(&mut self, Ident { name: _, span }: &mut Ident)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Ident {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
                -> V::Result {
                { visitor.visit_ident(self) }
            }
        }
        { MutVisitable::visit_mut(span, self, ()); };
        Self::Result::output()
    }
    fn visit_anon_const(&mut self, node: &mut AnonConst) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for AnonConst {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_anon_const(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_arm(&mut self, node: &mut Arm) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Arm {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_arm(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_assoc_item_constraint(&mut self,
        node: &mut AssocItemConstraint) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for AssocItemConstraint {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_assoc_item_constraint(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_attribute(&mut self, node: &mut Attribute) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Attribute {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_attribute(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_block(&mut self, node: &mut Block) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Block {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_block(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_capture_by(&mut self, node: &mut CaptureBy) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for CaptureBy {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_capture_by(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_closure_binder(&mut self, node: &mut ClosureBinder) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for ClosureBinder {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_closure_binder(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_contract(&mut self, node: &mut FnContract) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FnContract {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_contract(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_coroutine_marker(&mut self, node: &mut CoroutineMarker) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for CoroutineMarker {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_coroutine_marker(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_crate(&mut self, node: &mut Crate) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Crate {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_crate(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_expr(&mut self, node: &mut Expr) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Expr {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_expr(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_expr_field(&mut self, node: &mut ExprField) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for ExprField {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_expr_field(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_field_def(&mut self, node: &mut FieldDef) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FieldDef {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_field_def(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_field_def_extras(&mut self, node: &mut FieldDefExtras) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FieldDefExtras {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_field_def_extras(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_fn_decl(&mut self, node: &mut FnDecl) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FnDecl {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_decl(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_fn_header(&mut self, node: &mut FnHeader) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FnHeader {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_header(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_fn_ret_ty(&mut self, node: &mut FnRetTy) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FnRetTy {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_fn_ret_ty(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_foreign_mod(&mut self, node: &mut ForeignMod) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for ForeignMod {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_foreign_mod(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_format_args(&mut self, node: &mut FormatArgs) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for FormatArgs {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_format_args(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_generic_arg(&mut self, node: &mut GenericArg) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for GenericArg {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_arg(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_generic_args(&mut self, node: &mut GenericArgs) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for GenericArgs {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_args(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_generic_param(&mut self, node: &mut GenericParam) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for GenericParam {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generic_param(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_generics(&mut self, node: &mut Generics) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Generics {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_generics(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_inline_asm(&mut self, node: &mut InlineAsm) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for InlineAsm {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_inline_asm(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_inline_asm_sym(&mut self, node: &mut InlineAsmSym) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for InlineAsmSym {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_inline_asm_sym(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_impl_restriction(&mut self, node: &mut ImplRestriction) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for ImplRestriction {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_impl_restriction(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_label(&mut self, node: &mut Label) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Label {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_label(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_lifetime(&mut self, node: &mut Lifetime, _ctxt: LifetimeCtxt) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Lifetime {
            type Extra = (LifetimeCtxt);
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let (_ctxt) = extra; visitor.visit_lifetime(self, _ctxt); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_local(&mut self, node: &mut Local) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Local {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_local(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_mac_call(&mut self, node: &mut MacCall) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for MacCall {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_mac_call(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_macro_def(&mut self, node: &mut MacroDef) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for MacroDef {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_macro_def(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_mut_restriction(&mut self, node: &mut MutRestriction) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for MutRestriction {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_mut_restriction(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_param_bound(&mut self, node: &mut GenericBound,
        _ctxt: BoundKind) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for GenericBound {
            type Extra = (BoundKind);
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let (_ctxt) = extra;
                    visitor.visit_param_bound(self, _ctxt);
                }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_param(&mut self, node: &mut Param) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Param {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_param(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_pat_field(&mut self, node: &mut PatField) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for PatField {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_pat_field(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_path(&mut self, node: &mut Path) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Path {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_path(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_path_segment(&mut self, node: &mut PathSegment) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for PathSegment {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_path_segment(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_pat(&mut self, node: &mut Pat) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Pat {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_pat(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_poly_trait_ref(&mut self, node: &mut PolyTraitRef) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for PolyTraitRef {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_poly_trait_ref(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_precise_capturing_arg(&mut self,
        node: &mut PreciseCapturingArg) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for PreciseCapturingArg {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_precise_capturing_arg(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_qself(&mut self, node: &mut QSelf) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for QSelf {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_qself(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_body(&mut self, node: &mut TestBinderBody) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderBody {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_body(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_constraint(&mut self,
        node: &mut TestBinderConstraint) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderConstraint {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let () = extra;
                    visitor.visit_test_binder_constraint(self);
                }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_bound_type_constraint(&mut self,
        node: &mut TestBinderBoundTypeConstraint) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderBoundTypeConstraint
            {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let () = extra;
                    visitor.visit_test_binder_bound_type_constraint(self);
                }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_constraints(&mut self,
        node: &mut TestBinderConstraints) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderConstraints {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                {
                    let () = extra;
                    visitor.visit_test_binder_constraints(self);
                }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_exists(&mut self, node: &mut TestBinderExists) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderExists {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_exists(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_test_binder_forall(&mut self, node: &mut TestBinderForall) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TestBinderForall {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_test_binder_forall(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_trait_ref(&mut self, node: &mut TraitRef) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TraitRef {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_trait_ref(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_ty_pat(&mut self, node: &mut TyPat) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for TyPat {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_ty_pat(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_ty(&mut self, node: &mut Ty) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Ty {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_ty(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_use_tree(&mut self, node: &mut UseTree) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for UseTree {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_use_tree(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_variant_data(&mut self, node: &mut VariantData) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for VariantData {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_variant_data(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_variant(&mut self, node: &mut Variant) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Variant {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_variant(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_vis(&mut self, node: &mut Visibility) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Visibility {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_vis(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_where_predicate_kind(&mut self, node: &mut WherePredicateKind) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for WherePredicateKind {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_where_predicate_kind(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_where_predicate(&mut self, node: &mut WherePredicate) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for WherePredicate {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra)
                -> V::Result {
                { let () = extra; visitor.visit_where_predicate(self); }
            }
        }
        MutWalkable::walk_mut(node, self)
    }
    fn visit_id(&mut self, _id: &mut NodeId) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for NodeId {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
                -> V::Result {
                { visitor.visit_id(self) }
            }
        }
        Self::Result::output()
    }
    /// This method is a hack to workaround unstable of `stmt_expr_attributes`.
    /// It can be removed once that feature is stabilized.
    fn visit_method_receiver_expr(&mut self, ex: &mut Expr) -> Self::Result {
        self.visit_expr(ex)
    }
    fn visit_item(&mut self, item: &mut Item) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Item {
            type Extra = ();
            fn visit_mut(&mut self, vis: &mut V, _extra: Self::Extra)
                -> V::Result {
                { vis.visit_item(self) }
            }
        }
        walk_item(self, item)
    }
    fn visit_foreign_item(&mut self, item: &mut ForeignItem) -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for ForeignItem {
            type Extra = ();
            fn visit_mut(&mut self, vis: &mut V, _extra: Self::Extra)
                -> V::Result {
                { vis.visit_foreign_item(self) }
            }
        }
        walk_item(self, item)
    }
    fn visit_assoc_item(&mut self, item: &mut AssocItem, ctxt: AssocCtxt)
        -> Self::Result {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for AssocItem {
            type Extra = AssocCtxt;
            fn visit_mut(&mut self, vis: &mut V, ctxt: Self::Extra)
                -> V::Result {
                { vis.visit_assoc_item(self, ctxt) }
            }
        }
        walk_assoc_item(self, item, ctxt)
    }
    fn visit_fn(&mut self, fk: FnKind<'_>, _: &AttrVec, _: Span, _: NodeId)
        -> Self::Result {
        walk_fn(self, fk)
    }
    #[inline]
    fn visit_span(&mut self, _sp: &mut Span) {
        #[allow(unused_parens, non_local_definitions)]
        impl<V: MutVisitor> MutVisitable<V> for Span {
            type Extra = ();
            fn visit_mut(&mut self, visitor: &mut V, _extra: Self::Extra)
                -> V::Result {
                { visitor.visit_span(self) }
            }
        }
    }
    fn flat_map_foreign_item(&mut self, ni: Box<ForeignItem>)
        -> SmallVec<[Box<ForeignItem>; 1]> {
        walk_flat_map_foreign_item(self, ni)
    }
    fn flat_map_item(&mut self, i: Box<Item>) -> SmallVec<[Box<Item>; 1]> {
        walk_flat_map_item(self, i)
    }
    fn flat_map_field_def(&mut self, fd: FieldDef)
        -> SmallVec<[FieldDef; 1]> {
        walk_flat_map_field_def(self, fd)
    }
    fn flat_map_assoc_item(&mut self, i: Box<AssocItem>, ctxt: AssocCtxt)
        -> SmallVec<[Box<AssocItem>; 1]> {
        walk_flat_map_assoc_item(self, i, ctxt)
    }
    fn flat_map_stmt(&mut self, s: Stmt) -> SmallVec<[Stmt; 1]> {
        walk_flat_map_stmt(self, s)
    }
    fn flat_map_arm(&mut self, arm: Arm) -> SmallVec<[Arm; 1]> {
        walk_flat_map_arm(self, arm)
    }
    fn filter_map_expr(&mut self, e: Box<Expr>) -> Option<Box<Expr>> {
        walk_filter_map_expr(self, e)
    }
    fn flat_map_variant(&mut self, v: Variant) -> SmallVec<[Variant; 1]> {
        walk_flat_map_variant(self, v)
    }
    fn flat_map_param(&mut self, param: Param) -> SmallVec<[Param; 1]> {
        walk_flat_map_param(self, param)
    }
    fn flat_map_generic_param(&mut self, param: GenericParam)
        -> SmallVec<[GenericParam; 1]> {
        walk_flat_map_generic_param(self, param)
    }
    fn flat_map_expr_field(&mut self, f: ExprField)
        -> SmallVec<[ExprField; 1]> {
        walk_flat_map_expr_field(self, f)
    }
    fn flat_map_where_predicate(&mut self, where_predicate: WherePredicate)
        -> SmallVec<[WherePredicate; 1]> {
        walk_flat_map_where_predicate(self, where_predicate)
    }
    fn flat_map_pat_field(&mut self, fp: PatField)
        -> SmallVec<[PatField; 1]> {
        walk_flat_map_pat_field(self, fp)
    }
}
pub trait WalkItemKind {
    type Ctxt;
    fn walk<V: MutVisitor>(&mut self, attrs: &AttrVec, span: Span, id: NodeId,
    visibility: &mut Visibility, ctxt: Self::Ctxt, vis: &mut V)
    -> V::Result;
}
impl<V: MutVisitor, T> MutVisitable<V> for ThinVec<(UseTree, NodeId)> where
    for<'a> &'a mut ThinVec<(UseTree,
    NodeId)>: IntoIterator<Item = &'a mut T>, T: MutVisitable<V> {
    type Extra = <T as MutVisitable<V>>::Extra;
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, extra: Self::Extra) {
        for i in self { i.visit_mut(visitor, extra); }
    }
}
fn walk_item_inner<K: WalkItemKind,
    V: MutVisitor>(visitor: &mut V, item: &mut Item<K>, ctxt: K::Ctxt)
    -> V::Result {
    let Item { attrs, id, kind, vis, span, tokens: _ } = item;
    {
        MutVisitable::visit_mut(id, visitor, ());
        MutVisitable::visit_mut(attrs, visitor, ());
        MutVisitable::visit_mut(vis, visitor, ());
    };
    match ::rustc_ast_ir::visit::VisitorResult::branch(kind.walk(attrs, *span,
                *id, vis, ctxt, visitor)) {
        core::ops::ControlFlow::Continue(()) =>
            (),
            #[allow(unreachable_code)]
            core::ops::ControlFlow::Break(r) => {
            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
        }
    };
    { MutVisitable::visit_mut(span, visitor, ()); };
    V::Result::output()
}
pub fn walk_item<K: WalkItemKind<Ctxt = ()>,
    V: MutVisitor>(visitor: &mut V, item: &mut Item<K>) -> V::Result {
    walk_item_inner(visitor, item, ())
}
pub fn walk_assoc_item<K: WalkItemKind<Ctxt = AssocCtxt>,
    V: MutVisitor>(visitor: &mut V, item: &mut Item<K>, ctxt: AssocCtxt)
    -> V::Result {
    walk_item_inner(visitor, item, ctxt)
}
impl WalkItemKind for ItemKind {
    type Ctxt = ();
    fn walk<V: MutVisitor>(&mut self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &mut Visibility, _ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            ItemKind::Fn(func) => {
                let kind = FnKind::Fn(FnCtxt::Free, visibility, &mut *func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                };
            }
            ItemKind::ExternCrate(orig_name, ident) => {
                MutVisitable::visit_mut(orig_name, vis, ());
                MutVisitable::visit_mut(ident, vis, ());
            }
            ItemKind::Use(use_tree) => {
                MutVisitable::visit_mut(use_tree, vis, ());
            }
            ItemKind::Static(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
            ItemKind::ConstBlock(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
            ItemKind::Const(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
            ItemKind::Mod(safety, ident, mod_kind) => {
                MutVisitable::visit_mut(safety, vis, ());
                MutVisitable::visit_mut(ident, vis, ());
                MutVisitable::visit_mut(mod_kind, vis, ());
            }
            ItemKind::ForeignMod(nm) => {
                MutVisitable::visit_mut(nm, vis, ());
            }
            ItemKind::GlobalAsm(asm) => {
                MutVisitable::visit_mut(asm, vis, ());
            }
            ItemKind::TyAlias(ty_alias) => {
                MutVisitable::visit_mut(ty_alias, vis, ());
            }
            ItemKind::Enum(ident, generics, enum_definition) => {
                MutVisitable::visit_mut(ident, vis, ());
                MutVisitable::visit_mut(generics, vis, ());
                MutVisitable::visit_mut(enum_definition, vis, ());
            }
            ItemKind::Struct(ident, generics, variant_data) |
                ItemKind::Union(ident, generics, variant_data) => {
                MutVisitable::visit_mut(ident, vis, ());
                MutVisitable::visit_mut(generics, vis, ());
                MutVisitable::visit_mut(variant_data, vis, ());
            }
            ItemKind::Impl(impl_) => {
                MutVisitable::visit_mut(impl_, vis, ());
            }
            ItemKind::Trait(trait_) => {
                MutVisitable::visit_mut(trait_, vis, ());
            }
            ItemKind::TraitAlias(TraitAlias {
                constness, ident, generics, bounds }) => {
                {
                    MutVisitable::visit_mut(constness, vis, ());
                    MutVisitable::visit_mut(ident, vis, ());
                    MutVisitable::visit_mut(generics, vis, ());
                };
                MutVisitable::visit_mut(bounds, vis, BoundKind::Bound)
            }
            ItemKind::MacCall(m) => { MutVisitable::visit_mut(m, vis, ()); }
            ItemKind::MacroDef(ident, def) => {
                MutVisitable::visit_mut(ident, vis, ());
                MutVisitable::visit_mut(def, vis, ());
            }
            ItemKind::Delegation(delegation) => {
                MutVisitable::visit_mut(delegation, vis, ());
            }
            ItemKind::DelegationMac(dm) => {
                MutVisitable::visit_mut(dm, vis, ());
            }
            ItemKind::TestBinderConstraints(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
        }
        V::Result::output()
    }
}
impl WalkItemKind for AssocItemKind {
    type Ctxt = AssocCtxt;
    fn walk<V: MutVisitor>(&mut self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &mut Visibility, ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            AssocItemKind::Const(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
            AssocItemKind::Fn(func) => {
                let kind =
                    FnKind::Fn(FnCtxt::Assoc(ctxt), visibility, &mut *func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                }
            }
            AssocItemKind::Type(alias) => {
                MutVisitable::visit_mut(alias, vis, ());
            }
            AssocItemKind::MacCall(mac) => {
                MutVisitable::visit_mut(mac, vis, ());
            }
            AssocItemKind::Delegation(delegation) => {
                MutVisitable::visit_mut(delegation, vis, ());
            }
            AssocItemKind::DelegationMac(dm) => {
                MutVisitable::visit_mut(dm, vis, ());
            }
        }
        V::Result::output()
    }
}
impl WalkItemKind for ForeignItemKind {
    type Ctxt = ();
    fn walk<V: MutVisitor>(&mut self, attrs: &AttrVec, span: Span, id: NodeId,
        visibility: &mut Visibility, _ctxt: Self::Ctxt, vis: &mut V)
        -> V::Result {
        match self {
            ForeignItemKind::Static(item) => {
                MutVisitable::visit_mut(item, vis, ());
            }
            ForeignItemKind::Fn(func) => {
                let kind =
                    FnKind::Fn(FnCtxt::Foreign, visibility, &mut *func);
                match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                            attrs, span, id)) {
                    core::ops::ControlFlow::Continue(()) =>
                        (),
                        #[allow(unreachable_code)]
                        core::ops::ControlFlow::Break(r) => {
                        return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                    }
                }
            }
            ForeignItemKind::TyAlias(alias) => {
                MutVisitable::visit_mut(alias, vis, ());
            }
            ForeignItemKind::MacCall(mac) => {
                MutVisitable::visit_mut(mac, vis, ());
            }
        }
        V::Result::output()
    }
}
pub fn walk_fn<V: MutVisitor>(vis: &mut V, kind: FnKind<'_>) -> V::Result {
    match kind {
        FnKind::Fn(_ctxt, _vis, Fn {
            defaultness,
            ident,
            sig,
            generics,
            contract,
            body,
            define_opaque,
            eii_impl }) => {
            let FnSig { header, decl, span } = sig;
            {
                MutVisitable::visit_mut(defaultness, vis, ());
                MutVisitable::visit_mut(ident, vis, ());
                MutVisitable::visit_mut(header, vis, ());
                MutVisitable::visit_mut(generics, vis, ());
                MutVisitable::visit_mut(decl, vis, ());
                MutVisitable::visit_mut(contract, vis, ());
                MutVisitable::visit_mut(body, vis, ());
                MutVisitable::visit_mut(span, vis, ());
                MutVisitable::visit_mut(define_opaque, vis, ());
                MutVisitable::visit_mut(eii_impl, vis, ());
            };
        }
        FnKind::Closure(binder, coroutine_marker, decl, body) => {
            MutVisitable::visit_mut(binder, vis, ());
            MutVisitable::visit_mut(coroutine_marker, vis, ());
            MutVisitable::visit_mut(decl, vis, ());
            MutVisitable::visit_mut(body, vis, ());
        }
    }
    V::Result::output()
}
impl<V: MutVisitor> MutWalkable<V> for Impl {
    fn walk_mut(&mut self, vis: &mut V) -> V::Result {
        {
            let Impl { generics, of_trait, self_ty, items, constness: _ } =
                self;
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_generics(generics))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            if let Some(of_trait) = of_trait {
                let TraitImplHeader { defaultness, safety, polarity, trait_ref
                        } = of_trait;
                {
                    MutVisitable::visit_mut(defaultness, vis, ());
                    MutVisitable::visit_mut(safety, vis, ());
                    MutVisitable::visit_mut(polarity, vis, ());
                    MutVisitable::visit_mut(trait_ref, vis, ());
                };
            }
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_ty(self_ty))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            MutVisitable::visit_mut(items, vis,
                AssocCtxt::Impl { of_trait: of_trait.is_some() });
            V::Result::output()
        }
    }
}
impl<V: MutVisitor> MutWalkable<V> for MethodCall {
    fn walk_mut(&mut self, vis: &mut V) -> V::Result {
        {
            let MethodCall { seg, receiver, args, span } = self;
            match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_method_receiver_expr(receiver))
                {
                core::ops::ControlFlow::Continue(()) =>
                    (),
                    #[allow(unreachable_code)]
                    core::ops::ControlFlow::Break(r) => {
                    return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                }
            };
            {
                MutVisitable::visit_mut(seg, vis, ());
                MutVisitable::visit_mut(args, vis, ());
                MutVisitable::visit_mut(span, vis, ());
            };
            V::Result::output()
        }
    }
}
impl<V: MutVisitor> MutWalkable<V> for Expr {
    fn walk_mut(&mut self, vis: &mut V) -> V::Result {
        {
            let Expr { id, kind, span, attrs, tokens: _ } = self;
            {
                MutVisitable::visit_mut(id, vis, ());
                MutVisitable::visit_mut(attrs, vis, ());
            };
            match kind {
                ExprKind::Array(exprs) => {
                    MutVisitable::visit_mut(exprs, vis, ());
                }
                ExprKind::ConstBlock(anon_const) => {
                    MutVisitable::visit_mut(anon_const, vis, ());
                }
                ExprKind::Repeat(element, count) => {
                    MutVisitable::visit_mut(element, vis, ());
                    MutVisitable::visit_mut(count, vis, ());
                }
                ExprKind::Struct(se) => {
                    MutVisitable::visit_mut(se, vis, ());
                }
                ExprKind::Tup(exprs) => {
                    MutVisitable::visit_mut(exprs, vis, ());
                }
                ExprKind::Call(callee_expression, arguments) => {
                    MutVisitable::visit_mut(callee_expression, vis, ());
                    MutVisitable::visit_mut(arguments, vis, ());
                }
                ExprKind::MethodCall(mc) => {
                    MutVisitable::visit_mut(mc, vis, ());
                }
                ExprKind::Binary(op, lhs, rhs) => {
                    MutVisitable::visit_mut(op, vis, ());
                    MutVisitable::visit_mut(lhs, vis, ());
                    MutVisitable::visit_mut(rhs, vis, ());
                }
                ExprKind::AddrOf(kind, mutbl, subexpression) => {
                    MutVisitable::visit_mut(kind, vis, ());
                    MutVisitable::visit_mut(mutbl, vis, ());
                    MutVisitable::visit_mut(subexpression, vis, ());
                }
                ExprKind::Unary(op, subexpression) => {
                    MutVisitable::visit_mut(op, vis, ());
                    MutVisitable::visit_mut(subexpression, vis, ());
                }
                ExprKind::Cast(subexpression, typ) |
                    ExprKind::Type(subexpression, typ) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                    MutVisitable::visit_mut(typ, vis, ());
                }
                ExprKind::Let(pat, expr, span, _recovered) => {
                    MutVisitable::visit_mut(pat, vis, ());
                    MutVisitable::visit_mut(expr, vis, ());
                    MutVisitable::visit_mut(span, vis, ());
                }
                ExprKind::If(head_expression, if_block, optional_else) => {
                    MutVisitable::visit_mut(head_expression, vis, ());
                    MutVisitable::visit_mut(if_block, vis, ());
                    MutVisitable::visit_mut(optional_else, vis, ());
                }
                ExprKind::While(subexpression, block, opt_label) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                    MutVisitable::visit_mut(block, vis, ());
                    MutVisitable::visit_mut(opt_label, vis, ());
                }
                ExprKind::ForLoop(ForLoop { pat, iter, body, label, kind }) =>
                    {
                    MutVisitable::visit_mut(pat, vis, ());
                    MutVisitable::visit_mut(iter, vis, ());
                    MutVisitable::visit_mut(body, vis, ());
                    MutVisitable::visit_mut(label, vis, ());
                    MutVisitable::visit_mut(kind, vis, ());
                }
                ExprKind::Loop(block, opt_label, span) => {
                    MutVisitable::visit_mut(block, vis, ());
                    MutVisitable::visit_mut(opt_label, vis, ());
                    MutVisitable::visit_mut(span, vis, ());
                }
                ExprKind::Match(subexpression, arms, kind) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                    MutVisitable::visit_mut(arms, vis, ());
                    MutVisitable::visit_mut(kind, vis, ());
                }
                ExprKind::Closure(Closure {
                    binder,
                    capture_clause,
                    coroutine_marker,
                    constness,
                    movability,
                    fn_decl,
                    body,
                    fn_decl_span,
                    fn_arg_span }) => {
                    {
                        MutVisitable::visit_mut(constness, vis, ());
                        MutVisitable::visit_mut(movability, vis, ());
                        MutVisitable::visit_mut(capture_clause, vis, ());
                    };
                    let kind =
                        FnKind::Closure(binder, coroutine_marker, fn_decl, body);
                    match ::rustc_ast_ir::visit::VisitorResult::branch(vis.visit_fn(kind,
                                attrs, *span, *id)) {
                        core::ops::ControlFlow::Continue(()) =>
                            (),
                            #[allow(unreachable_code)]
                            core::ops::ControlFlow::Break(r) => {
                            return ::rustc_ast_ir::visit::VisitorResult::from_residual(r);
                        }
                    };
                    {
                        MutVisitable::visit_mut(fn_decl_span, vis, ());
                        MutVisitable::visit_mut(fn_arg_span, vis, ());
                    };
                }
                ExprKind::Block(block, opt_label) => {
                    MutVisitable::visit_mut(block, vis, ());
                    MutVisitable::visit_mut(opt_label, vis, ());
                }
                ExprKind::Gen(capt, body, kind, decl_span) => {
                    MutVisitable::visit_mut(capt, vis, ());
                    MutVisitable::visit_mut(body, vis, ());
                    MutVisitable::visit_mut(kind, vis, ());
                    MutVisitable::visit_mut(decl_span, vis, ());
                }
                ExprKind::Await(expr, span) | ExprKind::Move(expr, span) |
                    ExprKind::Use(expr, span) => {
                    MutVisitable::visit_mut(expr, vis, ());
                    MutVisitable::visit_mut(span, vis, ());
                }
                ExprKind::Assign(lhs, rhs, span) => {
                    MutVisitable::visit_mut(lhs, vis, ());
                    MutVisitable::visit_mut(rhs, vis, ());
                    MutVisitable::visit_mut(span, vis, ());
                }
                ExprKind::AssignOp(op, lhs, rhs) => {
                    MutVisitable::visit_mut(op, vis, ());
                    MutVisitable::visit_mut(lhs, vis, ());
                    MutVisitable::visit_mut(rhs, vis, ());
                }
                ExprKind::Field(subexpression, ident) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                    MutVisitable::visit_mut(ident, vis, ());
                }
                ExprKind::Index(main_expression, index_expression, span) => {
                    MutVisitable::visit_mut(main_expression, vis, ());
                    MutVisitable::visit_mut(index_expression, vis, ());
                    MutVisitable::visit_mut(span, vis, ());
                }
                ExprKind::Range(start, end, limit) => {
                    MutVisitable::visit_mut(start, vis, ());
                    MutVisitable::visit_mut(end, vis, ());
                    MutVisitable::visit_mut(limit, vis, ());
                }
                ExprKind::Underscore => {}
                ExprKind::Path(maybe_qself, path) => {
                    MutVisitable::visit_mut(maybe_qself, vis, ());
                    MutVisitable::visit_mut(path, vis, ());
                }
                ExprKind::Break(opt_label, opt_expr) => {
                    MutVisitable::visit_mut(opt_label, vis, ());
                    MutVisitable::visit_mut(opt_expr, vis, ());
                }
                ExprKind::Continue(opt_label) => {
                    MutVisitable::visit_mut(opt_label, vis, ());
                }
                ExprKind::Ret(optional_expression) |
                    ExprKind::Yeet(optional_expression) => {
                    MutVisitable::visit_mut(optional_expression, vis, ());
                }
                ExprKind::Become(expr) => {
                    MutVisitable::visit_mut(expr, vis, ());
                }
                ExprKind::MacCall(mac) => {
                    MutVisitable::visit_mut(mac, vis, ());
                }
                ExprKind::Paren(subexpression) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                }
                ExprKind::InlineAsm(asm) => {
                    MutVisitable::visit_mut(asm, vis, ());
                }
                ExprKind::FormatArgs(f) => {
                    MutVisitable::visit_mut(f, vis, ());
                }
                ExprKind::OffsetOf(container, fields) => {
                    MutVisitable::visit_mut(container, vis, ());
                    MutVisitable::visit_mut(fields, vis, ());
                }
                ExprKind::Yield(kind) => {
                    MutVisitable::visit_mut(kind, vis, ());
                }
                ExprKind::Try(subexpression) => {
                    MutVisitable::visit_mut(subexpression, vis, ());
                }
                ExprKind::TryBlock(body, optional_type) => {
                    MutVisitable::visit_mut(body, vis, ());
                    MutVisitable::visit_mut(optional_type, vis, ());
                }
                ExprKind::Lit(token) => {
                    MutVisitable::visit_mut(token, vis, ());
                }
                ExprKind::IncludedBytes(bytes) => {
                    MutVisitable::visit_mut(bytes, vis, ());
                }
                ExprKind::UnsafeBinderCast(kind, expr, ty) => {
                    MutVisitable::visit_mut(kind, vis, ());
                    MutVisitable::visit_mut(expr, vis, ());
                    MutVisitable::visit_mut(ty, vis, ());
                }
                ExprKind::DirectConstArg(expr) => {
                    MutVisitable::visit_mut(expr, vis, ());
                }
                ExprKind::Err(_guar) => {}
                ExprKind::Dummy => {}
            }
            { MutVisitable::visit_mut(span, vis, ()); };
            V::Result::output()
        }
    }
}
pub fn walk_anon_const<V: MutVisitor>(visitor: &mut V, node: &mut AnonConst) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_arm<V: MutVisitor>(visitor: &mut V, node: &mut Arm) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_assoc_item_constraint<V: MutVisitor>(visitor: &mut V,
    node: &mut AssocItemConstraint) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_attribute<V: MutVisitor>(visitor: &mut V, node: &mut Attribute) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_block<V: MutVisitor>(visitor: &mut V, node: &mut Block) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_capture_by<V: MutVisitor>(visitor: &mut V, node: &mut CaptureBy) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_closure_binder<V: MutVisitor>(visitor: &mut V,
    node: &mut ClosureBinder) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_contract<V: MutVisitor>(visitor: &mut V, node: &mut FnContract) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_coroutine_marker<V: MutVisitor>(visitor: &mut V,
    node: &mut CoroutineMarker) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_crate<V: MutVisitor>(visitor: &mut V, node: &mut Crate) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_expr<V: MutVisitor>(visitor: &mut V, node: &mut Expr) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_expr_field<V: MutVisitor>(visitor: &mut V, node: &mut ExprField) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_field_def<V: MutVisitor>(visitor: &mut V, node: &mut FieldDef) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_field_def_extras<V: MutVisitor>(visitor: &mut V,
    node: &mut FieldDefExtras) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_fn_decl<V: MutVisitor>(visitor: &mut V, node: &mut FnDecl) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_fn_header<V: MutVisitor>(visitor: &mut V, node: &mut FnHeader) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_fn_ret_ty<V: MutVisitor>(visitor: &mut V, node: &mut FnRetTy) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_foreign_mod<V: MutVisitor>(visitor: &mut V,
    node: &mut ForeignMod) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_format_args<V: MutVisitor>(visitor: &mut V,
    node: &mut FormatArgs) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_generic_arg<V: MutVisitor>(visitor: &mut V,
    node: &mut GenericArg) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_generic_args<V: MutVisitor>(visitor: &mut V,
    node: &mut GenericArgs) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_generic_param<V: MutVisitor>(visitor: &mut V,
    node: &mut GenericParam) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_generics<V: MutVisitor>(visitor: &mut V, node: &mut Generics) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_inline_asm<V: MutVisitor>(visitor: &mut V, node: &mut InlineAsm) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_inline_asm_sym<V: MutVisitor>(visitor: &mut V,
    node: &mut InlineAsmSym) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_impl_restriction<V: MutVisitor>(visitor: &mut V,
    node: &mut ImplRestriction) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_label<V: MutVisitor>(visitor: &mut V, node: &mut Label) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_lifetime<V: MutVisitor>(visitor: &mut V, node: &mut Lifetime) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_local<V: MutVisitor>(visitor: &mut V, node: &mut Local) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_mac<V: MutVisitor>(visitor: &mut V, node: &mut MacCall) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_macro_def<V: MutVisitor>(visitor: &mut V, node: &mut MacroDef) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_mut_restriction<V: MutVisitor>(visitor: &mut V,
    node: &mut MutRestriction) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_param_bound<V: MutVisitor>(visitor: &mut V,
    node: &mut GenericBound) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_param<V: MutVisitor>(visitor: &mut V, node: &mut Param) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_pat_field<V: MutVisitor>(visitor: &mut V, node: &mut PatField) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_path<V: MutVisitor>(visitor: &mut V, node: &mut Path) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_path_segment<V: MutVisitor>(visitor: &mut V,
    node: &mut PathSegment) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_pat<V: MutVisitor>(visitor: &mut V, node: &mut Pat) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_poly_trait_ref<V: MutVisitor>(visitor: &mut V,
    node: &mut PolyTraitRef) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_precise_capturing_arg<V: MutVisitor>(visitor: &mut V,
    node: &mut PreciseCapturingArg) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_qself<V: MutVisitor>(visitor: &mut V, node: &mut QSelf) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_test_binder_body<V: MutVisitor>(visitor: &mut V,
    node: &mut TestBinderBody) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_test_binder_constraint<V: MutVisitor>(visitor: &mut V,
    node: &mut TestBinderConstraint) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_test_binder_bound_type_constraint<V: MutVisitor>(visitor: &mut V,
    node: &mut TestBinderBoundTypeConstraint) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_test_binder_exists<V: MutVisitor>(visitor: &mut V,
    node: &mut TestBinderExists) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_test_binder_forall<V: MutVisitor>(visitor: &mut V,
    node: &mut TestBinderForall) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_trait_ref<V: MutVisitor>(visitor: &mut V, node: &mut TraitRef) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_ty_pat<V: MutVisitor>(visitor: &mut V, node: &mut TyPat) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_ty<V: MutVisitor>(visitor: &mut V, node: &mut Ty) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_use_tree<V: MutVisitor>(visitor: &mut V, node: &mut UseTree) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_variant_data<V: MutVisitor>(visitor: &mut V,
    node: &mut VariantData) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_variant<V: MutVisitor>(visitor: &mut V, node: &mut Variant) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_vis<V: MutVisitor>(visitor: &mut V, node: &mut Visibility) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_where_predicate_kind<V: MutVisitor>(visitor: &mut V,
    node: &mut WherePredicateKind) {
    MutWalkable::walk_mut(node, visitor)
}
pub fn walk_where_predicate<V: MutVisitor>(visitor: &mut V,
    node: &mut WherePredicate) {
    MutWalkable::walk_mut(node, visitor)
}super::common_visitor_and_walkers!((mut) MutVisitor);
245
246macro_rules! generate_flat_map_visitor_fns {
247    ($($flat_map_fn:ident, $Ty:ty $(, $param:ident: $ParamTy:ty)?;)+) => {
248        $(
249            #[allow(unused_parens)]
250            impl<V: MutVisitor> MutVisitable<V> for ThinVec<$Ty> {
251                type Extra = ($($ParamTy)?);
252
253                #[inline]
254                fn visit_mut(&mut self, visitor: &mut V, ($($param)?): Self::Extra) -> V::Result {
255                    self.flat_map_in_place(|value| visitor.$flat_map_fn(value $(, $param)?));
256                }
257            }
258        )+
259    }
260}
261
262#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Box<Item>> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_item(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Box<ForeignItem>> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_foreign_item(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<GenericParam> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_generic_param(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Stmt> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_stmt(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Box<Expr>> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.filter_map_expr(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<ExprField> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_expr_field(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<PatField> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_pat_field(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Variant> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_variant(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Box<AssocItem>> {
    type Extra = (AssocCtxt);
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (ctxt): Self::Extra)
        -> V::Result {
        self.flat_map_in_place(|value|
                visitor.flat_map_assoc_item(value, ctxt));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<WherePredicate> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value|
                visitor.flat_map_where_predicate(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Param> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_param(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<FieldDef> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_field_def(value));
    }
}
#[allow(unused_parens)]
impl<V: MutVisitor> MutVisitable<V> for ThinVec<Arm> {
    type Extra = ();
    #[inline]
    fn visit_mut(&mut self, visitor: &mut V, (): Self::Extra) -> V::Result {
        self.flat_map_in_place(|value| visitor.flat_map_arm(value));
    }
}generate_flat_map_visitor_fns! {
263    flat_map_item, Box<Item>;
264    flat_map_foreign_item, Box<ForeignItem>;
265    flat_map_generic_param, GenericParam;
266    flat_map_stmt, Stmt;
267    filter_map_expr, Box<Expr>; // the odd one out; it works because `Option` impls `IntoIterator`
268    flat_map_expr_field, ExprField;
269    flat_map_pat_field, PatField;
270    flat_map_variant, Variant;
271    flat_map_assoc_item, Box<AssocItem>, ctxt: AssocCtxt;
272    flat_map_where_predicate, WherePredicate;
273    flat_map_param, Param;
274    flat_map_field_def, FieldDef;
275    flat_map_arm, Arm;
276}
277
278pub fn walk_flat_map_pat_field<T: MutVisitor>(
279    vis: &mut T,
280    mut fp: PatField,
281) -> SmallVec<[PatField; 1]> {
282    vis.visit_pat_field(&mut fp);
283    {
    let count = 0usize + 1usize;
    let mut vec = ::smallvec::SmallVec::new();
    if count <= vec.inline_size() {
        vec.push(fp);
        vec
    } else {
        ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                    [fp])))
    }
}smallvec![fp]
284}
285
286macro_rules! generate_walk_flat_map_fns {
287    ($($fn_name:ident($Ty:ty$(,$extra_name:ident: $ExtraTy:ty)*) => $visit_fn_name:ident;)+) => {$(
288        pub fn $fn_name<V: MutVisitor>(
289            vis: &mut V,
290            mut value: $Ty
291            $(,$extra_name: $ExtraTy)*
292        ) -> SmallVec<[$Ty; 1]> {
293            vis.$visit_fn_name(&mut value$(,$extra_name)*);
294            smallvec![value]
295        }
296    )+};
297}
298
299pub fn walk_flat_map_arm<V: MutVisitor>(vis: &mut V, mut value: Arm)
    -> SmallVec<[Arm; 1]> {
    vis.visit_arm(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_variant<V: MutVisitor>(vis: &mut V, mut value: Variant)
    -> SmallVec<[Variant; 1]> {
    vis.visit_variant(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_param<V: MutVisitor>(vis: &mut V, mut value: Param)
    -> SmallVec<[Param; 1]> {
    vis.visit_param(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_generic_param<V: MutVisitor>(vis: &mut V,
    mut value: GenericParam) -> SmallVec<[GenericParam; 1]> {
    vis.visit_generic_param(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_where_predicate<V: MutVisitor>(vis: &mut V,
    mut value: WherePredicate) -> SmallVec<[WherePredicate; 1]> {
    vis.visit_where_predicate(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_field_def<V: MutVisitor>(vis: &mut V,
    mut value: FieldDef) -> SmallVec<[FieldDef; 1]> {
    vis.visit_field_def(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_expr_field<V: MutVisitor>(vis: &mut V,
    mut value: ExprField) -> SmallVec<[ExprField; 1]> {
    vis.visit_expr_field(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_item<V: MutVisitor>(vis: &mut V, mut value: Box<Item>)
    -> SmallVec<[Box<Item>; 1]> {
    vis.visit_item(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_foreign_item<V: MutVisitor>(vis: &mut V,
    mut value: Box<ForeignItem>) -> SmallVec<[Box<ForeignItem>; 1]> {
    vis.visit_foreign_item(&mut value);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}
pub fn walk_flat_map_assoc_item<V: MutVisitor>(vis: &mut V,
    mut value: Box<AssocItem>, ctxt: AssocCtxt)
    -> SmallVec<[Box<AssocItem>; 1]> {
    vis.visit_assoc_item(&mut value, ctxt);
    {
        let count = 0usize + 1usize;
        let mut vec = ::smallvec::SmallVec::new();
        if count <= vec.inline_size() {
            vec.push(value);
            vec
        } else {
            ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                        [value])))
        }
    }
}generate_walk_flat_map_fns! {
300    walk_flat_map_arm(Arm) => visit_arm;
301    walk_flat_map_variant(Variant) => visit_variant;
302    walk_flat_map_param(Param) => visit_param;
303    walk_flat_map_generic_param(GenericParam) => visit_generic_param;
304    walk_flat_map_where_predicate(WherePredicate) => visit_where_predicate;
305    walk_flat_map_field_def(FieldDef) => visit_field_def;
306    walk_flat_map_expr_field(ExprField) => visit_expr_field;
307    walk_flat_map_item(Box<Item>) => visit_item;
308    walk_flat_map_foreign_item(Box<ForeignItem>) => visit_foreign_item;
309    walk_flat_map_assoc_item(Box<AssocItem>, ctxt: AssocCtxt) => visit_assoc_item;
310}
311
312pub fn walk_filter_map_expr<T: MutVisitor>(vis: &mut T, mut e: Box<Expr>) -> Option<Box<Expr>> {
313    vis.visit_expr(&mut e);
314    Some(e)
315}
316
317pub fn walk_flat_map_stmt<T: MutVisitor>(
318    vis: &mut T,
319    Stmt { kind, span, mut id }: Stmt,
320) -> SmallVec<[Stmt; 1]> {
321    vis.visit_id(&mut id);
322    let mut stmts: SmallVec<[Stmt; 1]> = walk_flat_map_stmt_kind(vis, kind)
323        .into_iter()
324        .map(|kind| Stmt { id, kind, span })
325        .collect();
326    match &mut stmts[..] {
327        [] => {}
328        [stmt] => vis.visit_span(&mut stmt.span),
329        _ => {
    ::core::panicking::panic_fmt(format_args!("cloning statement `NodeId`s is prohibited by default, the visitor should implement custom statement visiting"));
}panic!(
330            "cloning statement `NodeId`s is prohibited by default, \
331             the visitor should implement custom statement visiting"
332        ),
333    }
334    stmts
335}
336
337pub fn walk_flat_map_stmt_kind<T: MutVisitor>(
338    vis: &mut T,
339    kind: StmtKind,
340) -> SmallVec<[StmtKind; 1]> {
341    match kind {
342        StmtKind::Let(mut local) => {
    let count = 0usize + 1usize;
    let mut vec = ::smallvec::SmallVec::new();
    if count <= vec.inline_size() {
        vec.push(StmtKind::Let({ vis.visit_local(&mut local); local }));
        vec
    } else {
        ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                    [StmtKind::Let({ vis.visit_local(&mut local); local })])))
    }
}smallvec![StmtKind::Let({
343            vis.visit_local(&mut local);
344            local
345        })],
346        StmtKind::Item(item) => vis.flat_map_item(item).into_iter().map(StmtKind::Item).collect(),
347        StmtKind::Expr(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Expr).collect(),
348        StmtKind::Semi(expr) => vis.filter_map_expr(expr).into_iter().map(StmtKind::Semi).collect(),
349        StmtKind::Empty => {
    let count = 0usize + 1usize;
    let mut vec = ::smallvec::SmallVec::new();
    if count <= vec.inline_size() {
        vec.push(StmtKind::Empty);
        vec
    } else {
        ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                    [StmtKind::Empty])))
    }
}smallvec![StmtKind::Empty],
350        StmtKind::MacCall(mut mac) => {
351            let MacCallStmt { mac: mac_, style: _, attrs, tokens: _ } = mac.deref_mut();
352            for attr in attrs {
353                vis.visit_attribute(attr);
354            }
355            vis.visit_mac_call(mac_);
356            {
    let count = 0usize + 1usize;
    let mut vec = ::smallvec::SmallVec::new();
    if count <= vec.inline_size() {
        vec.push(StmtKind::MacCall(mac));
        vec
    } else {
        ::smallvec::SmallVec::from_vec(::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
                    [StmtKind::MacCall(mac)])))
    }
}smallvec![StmtKind::MacCall(mac)]
357        }
358    }
359}