rustpython_ast/gen/
fold.rs

1// File automatically generated by ast/asdl_rs.py.
2
3pub trait Fold<U> {
4    type TargetU;
5    type Error;
6    type UserContext;
7
8    fn will_map_user(&mut self, user: &U) -> Self::UserContext;
9    #[cfg(feature = "all-nodes-with-ranges")]
10    fn will_map_user_cfg(&mut self, user: &U) -> Self::UserContext {
11        self.will_map_user(user)
12    }
13    #[cfg(not(feature = "all-nodes-with-ranges"))]
14    fn will_map_user_cfg(
15        &mut self,
16        _user: &crate::EmptyRange<U>,
17    ) -> crate::EmptyRange<Self::TargetU> {
18        crate::EmptyRange::default()
19    }
20    fn map_user(
21        &mut self,
22        user: U,
23        context: Self::UserContext,
24    ) -> Result<Self::TargetU, Self::Error>;
25    #[cfg(feature = "all-nodes-with-ranges")]
26    fn map_user_cfg(
27        &mut self,
28        user: U,
29        context: Self::UserContext,
30    ) -> Result<Self::TargetU, Self::Error> {
31        self.map_user(user, context)
32    }
33    #[cfg(not(feature = "all-nodes-with-ranges"))]
34    fn map_user_cfg(
35        &mut self,
36        _user: crate::EmptyRange<U>,
37        _context: crate::EmptyRange<Self::TargetU>,
38    ) -> Result<crate::EmptyRange<Self::TargetU>, Self::Error> {
39        Ok(crate::EmptyRange::default())
40    }
41
42    fn fold<X: Foldable<U, Self::TargetU>>(&mut self, node: X) -> Result<X::Mapped, Self::Error> {
43        node.fold(self)
44    }
45    fn fold_mod(&mut self, node: Mod<U>) -> Result<Mod<Self::TargetU>, Self::Error> {
46        fold_mod(self, node)
47    }
48    fn fold_mod_module(
49        &mut self,
50        node: ModModule<U>,
51    ) -> Result<ModModule<Self::TargetU>, Self::Error> {
52        fold_mod_module(self, node)
53    }
54    fn fold_mod_interactive(
55        &mut self,
56        node: ModInteractive<U>,
57    ) -> Result<ModInteractive<Self::TargetU>, Self::Error> {
58        fold_mod_interactive(self, node)
59    }
60    fn fold_mod_expression(
61        &mut self,
62        node: ModExpression<U>,
63    ) -> Result<ModExpression<Self::TargetU>, Self::Error> {
64        fold_mod_expression(self, node)
65    }
66    fn fold_mod_function_type(
67        &mut self,
68        node: ModFunctionType<U>,
69    ) -> Result<ModFunctionType<Self::TargetU>, Self::Error> {
70        fold_mod_function_type(self, node)
71    }
72    fn fold_stmt(&mut self, node: Stmt<U>) -> Result<Stmt<Self::TargetU>, Self::Error> {
73        fold_stmt(self, node)
74    }
75    fn fold_stmt_function_def(
76        &mut self,
77        node: StmtFunctionDef<U>,
78    ) -> Result<StmtFunctionDef<Self::TargetU>, Self::Error> {
79        fold_stmt_function_def(self, node)
80    }
81    fn fold_stmt_async_function_def(
82        &mut self,
83        node: StmtAsyncFunctionDef<U>,
84    ) -> Result<StmtAsyncFunctionDef<Self::TargetU>, Self::Error> {
85        fold_stmt_async_function_def(self, node)
86    }
87    fn fold_stmt_class_def(
88        &mut self,
89        node: StmtClassDef<U>,
90    ) -> Result<StmtClassDef<Self::TargetU>, Self::Error> {
91        fold_stmt_class_def(self, node)
92    }
93    fn fold_stmt_return(
94        &mut self,
95        node: StmtReturn<U>,
96    ) -> Result<StmtReturn<Self::TargetU>, Self::Error> {
97        fold_stmt_return(self, node)
98    }
99    fn fold_stmt_delete(
100        &mut self,
101        node: StmtDelete<U>,
102    ) -> Result<StmtDelete<Self::TargetU>, Self::Error> {
103        fold_stmt_delete(self, node)
104    }
105    fn fold_stmt_assign(
106        &mut self,
107        node: StmtAssign<U>,
108    ) -> Result<StmtAssign<Self::TargetU>, Self::Error> {
109        fold_stmt_assign(self, node)
110    }
111    fn fold_stmt_type_alias(
112        &mut self,
113        node: StmtTypeAlias<U>,
114    ) -> Result<StmtTypeAlias<Self::TargetU>, Self::Error> {
115        fold_stmt_type_alias(self, node)
116    }
117    fn fold_stmt_aug_assign(
118        &mut self,
119        node: StmtAugAssign<U>,
120    ) -> Result<StmtAugAssign<Self::TargetU>, Self::Error> {
121        fold_stmt_aug_assign(self, node)
122    }
123    fn fold_stmt_ann_assign(
124        &mut self,
125        node: StmtAnnAssign<U>,
126    ) -> Result<StmtAnnAssign<Self::TargetU>, Self::Error> {
127        fold_stmt_ann_assign(self, node)
128    }
129    fn fold_stmt_for(&mut self, node: StmtFor<U>) -> Result<StmtFor<Self::TargetU>, Self::Error> {
130        fold_stmt_for(self, node)
131    }
132    fn fold_stmt_async_for(
133        &mut self,
134        node: StmtAsyncFor<U>,
135    ) -> Result<StmtAsyncFor<Self::TargetU>, Self::Error> {
136        fold_stmt_async_for(self, node)
137    }
138    fn fold_stmt_while(
139        &mut self,
140        node: StmtWhile<U>,
141    ) -> Result<StmtWhile<Self::TargetU>, Self::Error> {
142        fold_stmt_while(self, node)
143    }
144    fn fold_stmt_if(&mut self, node: StmtIf<U>) -> Result<StmtIf<Self::TargetU>, Self::Error> {
145        fold_stmt_if(self, node)
146    }
147    fn fold_stmt_with(
148        &mut self,
149        node: StmtWith<U>,
150    ) -> Result<StmtWith<Self::TargetU>, Self::Error> {
151        fold_stmt_with(self, node)
152    }
153    fn fold_stmt_async_with(
154        &mut self,
155        node: StmtAsyncWith<U>,
156    ) -> Result<StmtAsyncWith<Self::TargetU>, Self::Error> {
157        fold_stmt_async_with(self, node)
158    }
159    fn fold_stmt_match(
160        &mut self,
161        node: StmtMatch<U>,
162    ) -> Result<StmtMatch<Self::TargetU>, Self::Error> {
163        fold_stmt_match(self, node)
164    }
165    fn fold_stmt_raise(
166        &mut self,
167        node: StmtRaise<U>,
168    ) -> Result<StmtRaise<Self::TargetU>, Self::Error> {
169        fold_stmt_raise(self, node)
170    }
171    fn fold_stmt_try(&mut self, node: StmtTry<U>) -> Result<StmtTry<Self::TargetU>, Self::Error> {
172        fold_stmt_try(self, node)
173    }
174    fn fold_stmt_try_star(
175        &mut self,
176        node: StmtTryStar<U>,
177    ) -> Result<StmtTryStar<Self::TargetU>, Self::Error> {
178        fold_stmt_try_star(self, node)
179    }
180    fn fold_stmt_assert(
181        &mut self,
182        node: StmtAssert<U>,
183    ) -> Result<StmtAssert<Self::TargetU>, Self::Error> {
184        fold_stmt_assert(self, node)
185    }
186    fn fold_stmt_import(
187        &mut self,
188        node: StmtImport<U>,
189    ) -> Result<StmtImport<Self::TargetU>, Self::Error> {
190        fold_stmt_import(self, node)
191    }
192    fn fold_stmt_import_from(
193        &mut self,
194        node: StmtImportFrom<U>,
195    ) -> Result<StmtImportFrom<Self::TargetU>, Self::Error> {
196        fold_stmt_import_from(self, node)
197    }
198    fn fold_stmt_global(
199        &mut self,
200        node: StmtGlobal<U>,
201    ) -> Result<StmtGlobal<Self::TargetU>, Self::Error> {
202        fold_stmt_global(self, node)
203    }
204    fn fold_stmt_nonlocal(
205        &mut self,
206        node: StmtNonlocal<U>,
207    ) -> Result<StmtNonlocal<Self::TargetU>, Self::Error> {
208        fold_stmt_nonlocal(self, node)
209    }
210    fn fold_stmt_expr(
211        &mut self,
212        node: StmtExpr<U>,
213    ) -> Result<StmtExpr<Self::TargetU>, Self::Error> {
214        fold_stmt_expr(self, node)
215    }
216    fn fold_stmt_pass(
217        &mut self,
218        node: StmtPass<U>,
219    ) -> Result<StmtPass<Self::TargetU>, Self::Error> {
220        fold_stmt_pass(self, node)
221    }
222    fn fold_stmt_break(
223        &mut self,
224        node: StmtBreak<U>,
225    ) -> Result<StmtBreak<Self::TargetU>, Self::Error> {
226        fold_stmt_break(self, node)
227    }
228    fn fold_stmt_continue(
229        &mut self,
230        node: StmtContinue<U>,
231    ) -> Result<StmtContinue<Self::TargetU>, Self::Error> {
232        fold_stmt_continue(self, node)
233    }
234    fn fold_expr(&mut self, node: Expr<U>) -> Result<Expr<Self::TargetU>, Self::Error> {
235        fold_expr(self, node)
236    }
237    fn fold_expr_bool_op(
238        &mut self,
239        node: ExprBoolOp<U>,
240    ) -> Result<ExprBoolOp<Self::TargetU>, Self::Error> {
241        fold_expr_bool_op(self, node)
242    }
243    fn fold_expr_named_expr(
244        &mut self,
245        node: ExprNamedExpr<U>,
246    ) -> Result<ExprNamedExpr<Self::TargetU>, Self::Error> {
247        fold_expr_named_expr(self, node)
248    }
249    fn fold_expr_bin_op(
250        &mut self,
251        node: ExprBinOp<U>,
252    ) -> Result<ExprBinOp<Self::TargetU>, Self::Error> {
253        fold_expr_bin_op(self, node)
254    }
255    fn fold_expr_unary_op(
256        &mut self,
257        node: ExprUnaryOp<U>,
258    ) -> Result<ExprUnaryOp<Self::TargetU>, Self::Error> {
259        fold_expr_unary_op(self, node)
260    }
261    fn fold_expr_lambda(
262        &mut self,
263        node: ExprLambda<U>,
264    ) -> Result<ExprLambda<Self::TargetU>, Self::Error> {
265        fold_expr_lambda(self, node)
266    }
267    fn fold_expr_if_exp(
268        &mut self,
269        node: ExprIfExp<U>,
270    ) -> Result<ExprIfExp<Self::TargetU>, Self::Error> {
271        fold_expr_if_exp(self, node)
272    }
273    fn fold_expr_dict(
274        &mut self,
275        node: ExprDict<U>,
276    ) -> Result<ExprDict<Self::TargetU>, Self::Error> {
277        fold_expr_dict(self, node)
278    }
279    fn fold_expr_set(&mut self, node: ExprSet<U>) -> Result<ExprSet<Self::TargetU>, Self::Error> {
280        fold_expr_set(self, node)
281    }
282    fn fold_expr_list_comp(
283        &mut self,
284        node: ExprListComp<U>,
285    ) -> Result<ExprListComp<Self::TargetU>, Self::Error> {
286        fold_expr_list_comp(self, node)
287    }
288    fn fold_expr_set_comp(
289        &mut self,
290        node: ExprSetComp<U>,
291    ) -> Result<ExprSetComp<Self::TargetU>, Self::Error> {
292        fold_expr_set_comp(self, node)
293    }
294    fn fold_expr_dict_comp(
295        &mut self,
296        node: ExprDictComp<U>,
297    ) -> Result<ExprDictComp<Self::TargetU>, Self::Error> {
298        fold_expr_dict_comp(self, node)
299    }
300    fn fold_expr_generator_exp(
301        &mut self,
302        node: ExprGeneratorExp<U>,
303    ) -> Result<ExprGeneratorExp<Self::TargetU>, Self::Error> {
304        fold_expr_generator_exp(self, node)
305    }
306    fn fold_expr_await(
307        &mut self,
308        node: ExprAwait<U>,
309    ) -> Result<ExprAwait<Self::TargetU>, Self::Error> {
310        fold_expr_await(self, node)
311    }
312    fn fold_expr_yield(
313        &mut self,
314        node: ExprYield<U>,
315    ) -> Result<ExprYield<Self::TargetU>, Self::Error> {
316        fold_expr_yield(self, node)
317    }
318    fn fold_expr_yield_from(
319        &mut self,
320        node: ExprYieldFrom<U>,
321    ) -> Result<ExprYieldFrom<Self::TargetU>, Self::Error> {
322        fold_expr_yield_from(self, node)
323    }
324    fn fold_expr_compare(
325        &mut self,
326        node: ExprCompare<U>,
327    ) -> Result<ExprCompare<Self::TargetU>, Self::Error> {
328        fold_expr_compare(self, node)
329    }
330    fn fold_expr_call(
331        &mut self,
332        node: ExprCall<U>,
333    ) -> Result<ExprCall<Self::TargetU>, Self::Error> {
334        fold_expr_call(self, node)
335    }
336    fn fold_expr_formatted_value(
337        &mut self,
338        node: ExprFormattedValue<U>,
339    ) -> Result<ExprFormattedValue<Self::TargetU>, Self::Error> {
340        fold_expr_formatted_value(self, node)
341    }
342    fn fold_expr_joined_str(
343        &mut self,
344        node: ExprJoinedStr<U>,
345    ) -> Result<ExprJoinedStr<Self::TargetU>, Self::Error> {
346        fold_expr_joined_str(self, node)
347    }
348    fn fold_expr_constant(
349        &mut self,
350        node: ExprConstant<U>,
351    ) -> Result<ExprConstant<Self::TargetU>, Self::Error> {
352        fold_expr_constant(self, node)
353    }
354    fn fold_expr_attribute(
355        &mut self,
356        node: ExprAttribute<U>,
357    ) -> Result<ExprAttribute<Self::TargetU>, Self::Error> {
358        fold_expr_attribute(self, node)
359    }
360    fn fold_expr_subscript(
361        &mut self,
362        node: ExprSubscript<U>,
363    ) -> Result<ExprSubscript<Self::TargetU>, Self::Error> {
364        fold_expr_subscript(self, node)
365    }
366    fn fold_expr_starred(
367        &mut self,
368        node: ExprStarred<U>,
369    ) -> Result<ExprStarred<Self::TargetU>, Self::Error> {
370        fold_expr_starred(self, node)
371    }
372    fn fold_expr_name(
373        &mut self,
374        node: ExprName<U>,
375    ) -> Result<ExprName<Self::TargetU>, Self::Error> {
376        fold_expr_name(self, node)
377    }
378    fn fold_expr_list(
379        &mut self,
380        node: ExprList<U>,
381    ) -> Result<ExprList<Self::TargetU>, Self::Error> {
382        fold_expr_list(self, node)
383    }
384    fn fold_expr_tuple(
385        &mut self,
386        node: ExprTuple<U>,
387    ) -> Result<ExprTuple<Self::TargetU>, Self::Error> {
388        fold_expr_tuple(self, node)
389    }
390    fn fold_expr_slice(
391        &mut self,
392        node: ExprSlice<U>,
393    ) -> Result<ExprSlice<Self::TargetU>, Self::Error> {
394        fold_expr_slice(self, node)
395    }
396    fn fold_expr_context(&mut self, node: ExprContext) -> Result<ExprContext, Self::Error> {
397        fold_expr_context(self, node)
398    }
399    fn fold_boolop(&mut self, node: BoolOp) -> Result<BoolOp, Self::Error> {
400        fold_boolop(self, node)
401    }
402    fn fold_operator(&mut self, node: Operator) -> Result<Operator, Self::Error> {
403        fold_operator(self, node)
404    }
405    fn fold_unaryop(&mut self, node: UnaryOp) -> Result<UnaryOp, Self::Error> {
406        fold_unaryop(self, node)
407    }
408    fn fold_cmpop(&mut self, node: CmpOp) -> Result<CmpOp, Self::Error> {
409        fold_cmpop(self, node)
410    }
411    fn fold_comprehension(
412        &mut self,
413        node: Comprehension<U>,
414    ) -> Result<Comprehension<Self::TargetU>, Self::Error> {
415        fold_comprehension(self, node)
416    }
417    fn fold_excepthandler(
418        &mut self,
419        node: ExceptHandler<U>,
420    ) -> Result<ExceptHandler<Self::TargetU>, Self::Error> {
421        fold_excepthandler(self, node)
422    }
423    fn fold_excepthandler_except_handler(
424        &mut self,
425        node: ExceptHandlerExceptHandler<U>,
426    ) -> Result<ExceptHandlerExceptHandler<Self::TargetU>, Self::Error> {
427        fold_excepthandler_except_handler(self, node)
428    }
429    fn fold_arguments(
430        &mut self,
431        node: Arguments<U>,
432    ) -> Result<Arguments<Self::TargetU>, Self::Error> {
433        fold_arguments(self, node)
434    }
435    fn fold_arg(&mut self, node: Arg<U>) -> Result<Arg<Self::TargetU>, Self::Error> {
436        fold_arg(self, node)
437    }
438    fn fold_keyword(&mut self, node: Keyword<U>) -> Result<Keyword<Self::TargetU>, Self::Error> {
439        fold_keyword(self, node)
440    }
441    fn fold_alias(&mut self, node: Alias<U>) -> Result<Alias<Self::TargetU>, Self::Error> {
442        fold_alias(self, node)
443    }
444    fn fold_withitem(&mut self, node: WithItem<U>) -> Result<WithItem<Self::TargetU>, Self::Error> {
445        fold_withitem(self, node)
446    }
447    fn fold_match_case(
448        &mut self,
449        node: MatchCase<U>,
450    ) -> Result<MatchCase<Self::TargetU>, Self::Error> {
451        fold_match_case(self, node)
452    }
453    fn fold_pattern(&mut self, node: Pattern<U>) -> Result<Pattern<Self::TargetU>, Self::Error> {
454        fold_pattern(self, node)
455    }
456    fn fold_pattern_match_value(
457        &mut self,
458        node: PatternMatchValue<U>,
459    ) -> Result<PatternMatchValue<Self::TargetU>, Self::Error> {
460        fold_pattern_match_value(self, node)
461    }
462    fn fold_pattern_match_singleton(
463        &mut self,
464        node: PatternMatchSingleton<U>,
465    ) -> Result<PatternMatchSingleton<Self::TargetU>, Self::Error> {
466        fold_pattern_match_singleton(self, node)
467    }
468    fn fold_pattern_match_sequence(
469        &mut self,
470        node: PatternMatchSequence<U>,
471    ) -> Result<PatternMatchSequence<Self::TargetU>, Self::Error> {
472        fold_pattern_match_sequence(self, node)
473    }
474    fn fold_pattern_match_mapping(
475        &mut self,
476        node: PatternMatchMapping<U>,
477    ) -> Result<PatternMatchMapping<Self::TargetU>, Self::Error> {
478        fold_pattern_match_mapping(self, node)
479    }
480    fn fold_pattern_match_class(
481        &mut self,
482        node: PatternMatchClass<U>,
483    ) -> Result<PatternMatchClass<Self::TargetU>, Self::Error> {
484        fold_pattern_match_class(self, node)
485    }
486    fn fold_pattern_match_star(
487        &mut self,
488        node: PatternMatchStar<U>,
489    ) -> Result<PatternMatchStar<Self::TargetU>, Self::Error> {
490        fold_pattern_match_star(self, node)
491    }
492    fn fold_pattern_match_as(
493        &mut self,
494        node: PatternMatchAs<U>,
495    ) -> Result<PatternMatchAs<Self::TargetU>, Self::Error> {
496        fold_pattern_match_as(self, node)
497    }
498    fn fold_pattern_match_or(
499        &mut self,
500        node: PatternMatchOr<U>,
501    ) -> Result<PatternMatchOr<Self::TargetU>, Self::Error> {
502        fold_pattern_match_or(self, node)
503    }
504    fn fold_type_ignore(
505        &mut self,
506        node: TypeIgnore<U>,
507    ) -> Result<TypeIgnore<Self::TargetU>, Self::Error> {
508        fold_type_ignore(self, node)
509    }
510    fn fold_type_ignore_type_ignore(
511        &mut self,
512        node: TypeIgnoreTypeIgnore<U>,
513    ) -> Result<TypeIgnoreTypeIgnore<Self::TargetU>, Self::Error> {
514        fold_type_ignore_type_ignore(self, node)
515    }
516    fn fold_type_param(
517        &mut self,
518        node: TypeParam<U>,
519    ) -> Result<TypeParam<Self::TargetU>, Self::Error> {
520        fold_type_param(self, node)
521    }
522    fn fold_type_param_type_var(
523        &mut self,
524        node: TypeParamTypeVar<U>,
525    ) -> Result<TypeParamTypeVar<Self::TargetU>, Self::Error> {
526        fold_type_param_type_var(self, node)
527    }
528    fn fold_type_param_param_spec(
529        &mut self,
530        node: TypeParamParamSpec<U>,
531    ) -> Result<TypeParamParamSpec<Self::TargetU>, Self::Error> {
532        fold_type_param_param_spec(self, node)
533    }
534    fn fold_type_param_type_var_tuple(
535        &mut self,
536        node: TypeParamTypeVarTuple<U>,
537    ) -> Result<TypeParamTypeVarTuple<Self::TargetU>, Self::Error> {
538        fold_type_param_type_var_tuple(self, node)
539    }
540    fn fold_arg_with_default(
541        &mut self,
542        node: ArgWithDefault<U>,
543    ) -> Result<ArgWithDefault<Self::TargetU>, Self::Error> {
544        fold_arg_with_default(self, node)
545    }
546}
547impl<T, U> Foldable<T, U> for Mod<T> {
548    type Mapped = Mod<U>;
549    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
550        self,
551        folder: &mut F,
552    ) -> Result<Self::Mapped, F::Error> {
553        folder.fold_mod(self)
554    }
555}
556pub fn fold_mod<U, F: Fold<U> + ?Sized>(
557    #[allow(unused)] folder: &mut F,
558    node: Mod<U>,
559) -> Result<Mod<F::TargetU>, F::Error> {
560    let folded = match node {
561        Mod::Module(cons) => Mod::Module(Foldable::fold(cons, folder)?),
562        Mod::Interactive(cons) => Mod::Interactive(Foldable::fold(cons, folder)?),
563        Mod::Expression(cons) => Mod::Expression(Foldable::fold(cons, folder)?),
564        Mod::FunctionType(cons) => Mod::FunctionType(Foldable::fold(cons, folder)?),
565    };
566    Ok(folded)
567}
568impl<T, U> Foldable<T, U> for ModModule<T> {
569    type Mapped = ModModule<U>;
570    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
571        self,
572        folder: &mut F,
573    ) -> Result<Self::Mapped, F::Error> {
574        folder.fold_mod_module(self)
575    }
576}
577pub fn fold_mod_module<U, F: Fold<U> + ?Sized>(
578    #[allow(unused)] folder: &mut F,
579    node: ModModule<U>,
580) -> Result<ModModule<F::TargetU>, F::Error> {
581    let ModModule {
582        body,
583        type_ignores,
584        range,
585    } = node;
586    let context = folder.will_map_user_cfg(&range);
587
588    let body = Foldable::fold(body, folder)?;
589    let type_ignores = Foldable::fold(type_ignores, folder)?;
590    let range = folder.map_user_cfg(range, context)?;
591    Ok(ModModule {
592        body,
593        type_ignores,
594        range,
595    })
596}
597impl<T, U> Foldable<T, U> for ModInteractive<T> {
598    type Mapped = ModInteractive<U>;
599    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
600        self,
601        folder: &mut F,
602    ) -> Result<Self::Mapped, F::Error> {
603        folder.fold_mod_interactive(self)
604    }
605}
606pub fn fold_mod_interactive<U, F: Fold<U> + ?Sized>(
607    #[allow(unused)] folder: &mut F,
608    node: ModInteractive<U>,
609) -> Result<ModInteractive<F::TargetU>, F::Error> {
610    let ModInteractive { body, range } = node;
611    let context = folder.will_map_user_cfg(&range);
612
613    let body = Foldable::fold(body, folder)?;
614    let range = folder.map_user_cfg(range, context)?;
615    Ok(ModInteractive { body, range })
616}
617impl<T, U> Foldable<T, U> for ModExpression<T> {
618    type Mapped = ModExpression<U>;
619    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
620        self,
621        folder: &mut F,
622    ) -> Result<Self::Mapped, F::Error> {
623        folder.fold_mod_expression(self)
624    }
625}
626pub fn fold_mod_expression<U, F: Fold<U> + ?Sized>(
627    #[allow(unused)] folder: &mut F,
628    node: ModExpression<U>,
629) -> Result<ModExpression<F::TargetU>, F::Error> {
630    let ModExpression { body, range } = node;
631    let context = folder.will_map_user_cfg(&range);
632
633    let body = Foldable::fold(body, folder)?;
634    let range = folder.map_user_cfg(range, context)?;
635    Ok(ModExpression { body, range })
636}
637impl<T, U> Foldable<T, U> for ModFunctionType<T> {
638    type Mapped = ModFunctionType<U>;
639    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
640        self,
641        folder: &mut F,
642    ) -> Result<Self::Mapped, F::Error> {
643        folder.fold_mod_function_type(self)
644    }
645}
646pub fn fold_mod_function_type<U, F: Fold<U> + ?Sized>(
647    #[allow(unused)] folder: &mut F,
648    node: ModFunctionType<U>,
649) -> Result<ModFunctionType<F::TargetU>, F::Error> {
650    let ModFunctionType {
651        argtypes,
652        returns,
653        range,
654    } = node;
655    let context = folder.will_map_user_cfg(&range);
656
657    let argtypes = Foldable::fold(argtypes, folder)?;
658    let returns = Foldable::fold(returns, folder)?;
659    let range = folder.map_user_cfg(range, context)?;
660    Ok(ModFunctionType {
661        argtypes,
662        returns,
663        range,
664    })
665}
666impl<T, U> Foldable<T, U> for Stmt<T> {
667    type Mapped = Stmt<U>;
668    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
669        self,
670        folder: &mut F,
671    ) -> Result<Self::Mapped, F::Error> {
672        folder.fold_stmt(self)
673    }
674}
675pub fn fold_stmt<U, F: Fold<U> + ?Sized>(
676    #[allow(unused)] folder: &mut F,
677    node: Stmt<U>,
678) -> Result<Stmt<F::TargetU>, F::Error> {
679    let folded = match node {
680        Stmt::FunctionDef(cons) => Stmt::FunctionDef(Foldable::fold(cons, folder)?),
681        Stmt::AsyncFunctionDef(cons) => Stmt::AsyncFunctionDef(Foldable::fold(cons, folder)?),
682        Stmt::ClassDef(cons) => Stmt::ClassDef(Foldable::fold(cons, folder)?),
683        Stmt::Return(cons) => Stmt::Return(Foldable::fold(cons, folder)?),
684        Stmt::Delete(cons) => Stmt::Delete(Foldable::fold(cons, folder)?),
685        Stmt::Assign(cons) => Stmt::Assign(Foldable::fold(cons, folder)?),
686        Stmt::TypeAlias(cons) => Stmt::TypeAlias(Foldable::fold(cons, folder)?),
687        Stmt::AugAssign(cons) => Stmt::AugAssign(Foldable::fold(cons, folder)?),
688        Stmt::AnnAssign(cons) => Stmt::AnnAssign(Foldable::fold(cons, folder)?),
689        Stmt::For(cons) => Stmt::For(Foldable::fold(cons, folder)?),
690        Stmt::AsyncFor(cons) => Stmt::AsyncFor(Foldable::fold(cons, folder)?),
691        Stmt::While(cons) => Stmt::While(Foldable::fold(cons, folder)?),
692        Stmt::If(cons) => Stmt::If(Foldable::fold(cons, folder)?),
693        Stmt::With(cons) => Stmt::With(Foldable::fold(cons, folder)?),
694        Stmt::AsyncWith(cons) => Stmt::AsyncWith(Foldable::fold(cons, folder)?),
695        Stmt::Match(cons) => Stmt::Match(Foldable::fold(cons, folder)?),
696        Stmt::Raise(cons) => Stmt::Raise(Foldable::fold(cons, folder)?),
697        Stmt::Try(cons) => Stmt::Try(Foldable::fold(cons, folder)?),
698        Stmt::TryStar(cons) => Stmt::TryStar(Foldable::fold(cons, folder)?),
699        Stmt::Assert(cons) => Stmt::Assert(Foldable::fold(cons, folder)?),
700        Stmt::Import(cons) => Stmt::Import(Foldable::fold(cons, folder)?),
701        Stmt::ImportFrom(cons) => Stmt::ImportFrom(Foldable::fold(cons, folder)?),
702        Stmt::Global(cons) => Stmt::Global(Foldable::fold(cons, folder)?),
703        Stmt::Nonlocal(cons) => Stmt::Nonlocal(Foldable::fold(cons, folder)?),
704        Stmt::Expr(cons) => Stmt::Expr(Foldable::fold(cons, folder)?),
705        Stmt::Pass(cons) => Stmt::Pass(Foldable::fold(cons, folder)?),
706        Stmt::Break(cons) => Stmt::Break(Foldable::fold(cons, folder)?),
707        Stmt::Continue(cons) => Stmt::Continue(Foldable::fold(cons, folder)?),
708    };
709    Ok(folded)
710}
711impl<T, U> Foldable<T, U> for StmtFunctionDef<T> {
712    type Mapped = StmtFunctionDef<U>;
713    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
714        self,
715        folder: &mut F,
716    ) -> Result<Self::Mapped, F::Error> {
717        folder.fold_stmt_function_def(self)
718    }
719}
720pub fn fold_stmt_function_def<U, F: Fold<U> + ?Sized>(
721    #[allow(unused)] folder: &mut F,
722    node: StmtFunctionDef<U>,
723) -> Result<StmtFunctionDef<F::TargetU>, F::Error> {
724    let StmtFunctionDef {
725        name,
726        args,
727        body,
728        decorator_list,
729        returns,
730        type_comment,
731        type_params,
732        range,
733    } = node;
734    let context = folder.will_map_user(&range);
735
736    let name = Foldable::fold(name, folder)?;
737    let args = Foldable::fold(args, folder)?;
738    let body = Foldable::fold(body, folder)?;
739    let decorator_list = Foldable::fold(decorator_list, folder)?;
740    let returns = Foldable::fold(returns, folder)?;
741    let type_comment = Foldable::fold(type_comment, folder)?;
742    let type_params = Foldable::fold(type_params, folder)?;
743    let range = folder.map_user(range, context)?;
744    Ok(StmtFunctionDef {
745        name,
746        args,
747        body,
748        decorator_list,
749        returns,
750        type_comment,
751        type_params,
752        range,
753    })
754}
755impl<T, U> Foldable<T, U> for StmtAsyncFunctionDef<T> {
756    type Mapped = StmtAsyncFunctionDef<U>;
757    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
758        self,
759        folder: &mut F,
760    ) -> Result<Self::Mapped, F::Error> {
761        folder.fold_stmt_async_function_def(self)
762    }
763}
764pub fn fold_stmt_async_function_def<U, F: Fold<U> + ?Sized>(
765    #[allow(unused)] folder: &mut F,
766    node: StmtAsyncFunctionDef<U>,
767) -> Result<StmtAsyncFunctionDef<F::TargetU>, F::Error> {
768    let StmtAsyncFunctionDef {
769        name,
770        args,
771        body,
772        decorator_list,
773        returns,
774        type_comment,
775        type_params,
776        range,
777    } = node;
778    let context = folder.will_map_user(&range);
779
780    let name = Foldable::fold(name, folder)?;
781    let args = Foldable::fold(args, folder)?;
782    let body = Foldable::fold(body, folder)?;
783    let decorator_list = Foldable::fold(decorator_list, folder)?;
784    let returns = Foldable::fold(returns, folder)?;
785    let type_comment = Foldable::fold(type_comment, folder)?;
786    let type_params = Foldable::fold(type_params, folder)?;
787    let range = folder.map_user(range, context)?;
788    Ok(StmtAsyncFunctionDef {
789        name,
790        args,
791        body,
792        decorator_list,
793        returns,
794        type_comment,
795        type_params,
796        range,
797    })
798}
799impl<T, U> Foldable<T, U> for StmtClassDef<T> {
800    type Mapped = StmtClassDef<U>;
801    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
802        self,
803        folder: &mut F,
804    ) -> Result<Self::Mapped, F::Error> {
805        folder.fold_stmt_class_def(self)
806    }
807}
808pub fn fold_stmt_class_def<U, F: Fold<U> + ?Sized>(
809    #[allow(unused)] folder: &mut F,
810    node: StmtClassDef<U>,
811) -> Result<StmtClassDef<F::TargetU>, F::Error> {
812    let StmtClassDef {
813        name,
814        bases,
815        keywords,
816        body,
817        decorator_list,
818        type_params,
819        range,
820    } = node;
821    let context = folder.will_map_user(&range);
822
823    let name = Foldable::fold(name, folder)?;
824    let bases = Foldable::fold(bases, folder)?;
825    let keywords = Foldable::fold(keywords, folder)?;
826    let body = Foldable::fold(body, folder)?;
827    let decorator_list = Foldable::fold(decorator_list, folder)?;
828    let type_params = Foldable::fold(type_params, folder)?;
829    let range = folder.map_user(range, context)?;
830    Ok(StmtClassDef {
831        name,
832        bases,
833        keywords,
834        body,
835        decorator_list,
836        type_params,
837        range,
838    })
839}
840impl<T, U> Foldable<T, U> for StmtReturn<T> {
841    type Mapped = StmtReturn<U>;
842    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
843        self,
844        folder: &mut F,
845    ) -> Result<Self::Mapped, F::Error> {
846        folder.fold_stmt_return(self)
847    }
848}
849pub fn fold_stmt_return<U, F: Fold<U> + ?Sized>(
850    #[allow(unused)] folder: &mut F,
851    node: StmtReturn<U>,
852) -> Result<StmtReturn<F::TargetU>, F::Error> {
853    let StmtReturn { value, range } = node;
854    let context = folder.will_map_user(&range);
855
856    let value = Foldable::fold(value, folder)?;
857    let range = folder.map_user(range, context)?;
858    Ok(StmtReturn { value, range })
859}
860impl<T, U> Foldable<T, U> for StmtDelete<T> {
861    type Mapped = StmtDelete<U>;
862    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
863        self,
864        folder: &mut F,
865    ) -> Result<Self::Mapped, F::Error> {
866        folder.fold_stmt_delete(self)
867    }
868}
869pub fn fold_stmt_delete<U, F: Fold<U> + ?Sized>(
870    #[allow(unused)] folder: &mut F,
871    node: StmtDelete<U>,
872) -> Result<StmtDelete<F::TargetU>, F::Error> {
873    let StmtDelete { targets, range } = node;
874    let context = folder.will_map_user(&range);
875
876    let targets = Foldable::fold(targets, folder)?;
877    let range = folder.map_user(range, context)?;
878    Ok(StmtDelete { targets, range })
879}
880impl<T, U> Foldable<T, U> for StmtAssign<T> {
881    type Mapped = StmtAssign<U>;
882    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
883        self,
884        folder: &mut F,
885    ) -> Result<Self::Mapped, F::Error> {
886        folder.fold_stmt_assign(self)
887    }
888}
889pub fn fold_stmt_assign<U, F: Fold<U> + ?Sized>(
890    #[allow(unused)] folder: &mut F,
891    node: StmtAssign<U>,
892) -> Result<StmtAssign<F::TargetU>, F::Error> {
893    let StmtAssign {
894        targets,
895        value,
896        type_comment,
897        range,
898    } = node;
899    let context = folder.will_map_user(&range);
900
901    let targets = Foldable::fold(targets, folder)?;
902    let value = Foldable::fold(value, folder)?;
903    let type_comment = Foldable::fold(type_comment, folder)?;
904    let range = folder.map_user(range, context)?;
905    Ok(StmtAssign {
906        targets,
907        value,
908        type_comment,
909        range,
910    })
911}
912impl<T, U> Foldable<T, U> for StmtTypeAlias<T> {
913    type Mapped = StmtTypeAlias<U>;
914    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
915        self,
916        folder: &mut F,
917    ) -> Result<Self::Mapped, F::Error> {
918        folder.fold_stmt_type_alias(self)
919    }
920}
921pub fn fold_stmt_type_alias<U, F: Fold<U> + ?Sized>(
922    #[allow(unused)] folder: &mut F,
923    node: StmtTypeAlias<U>,
924) -> Result<StmtTypeAlias<F::TargetU>, F::Error> {
925    let StmtTypeAlias {
926        name,
927        type_params,
928        value,
929        range,
930    } = node;
931    let context = folder.will_map_user(&range);
932
933    let name = Foldable::fold(name, folder)?;
934    let type_params = Foldable::fold(type_params, folder)?;
935    let value = Foldable::fold(value, folder)?;
936    let range = folder.map_user(range, context)?;
937    Ok(StmtTypeAlias {
938        name,
939        type_params,
940        value,
941        range,
942    })
943}
944impl<T, U> Foldable<T, U> for StmtAugAssign<T> {
945    type Mapped = StmtAugAssign<U>;
946    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
947        self,
948        folder: &mut F,
949    ) -> Result<Self::Mapped, F::Error> {
950        folder.fold_stmt_aug_assign(self)
951    }
952}
953pub fn fold_stmt_aug_assign<U, F: Fold<U> + ?Sized>(
954    #[allow(unused)] folder: &mut F,
955    node: StmtAugAssign<U>,
956) -> Result<StmtAugAssign<F::TargetU>, F::Error> {
957    let StmtAugAssign {
958        target,
959        op,
960        value,
961        range,
962    } = node;
963    let context = folder.will_map_user(&range);
964
965    let target = Foldable::fold(target, folder)?;
966    let op = Foldable::fold(op, folder)?;
967    let value = Foldable::fold(value, folder)?;
968    let range = folder.map_user(range, context)?;
969    Ok(StmtAugAssign {
970        target,
971        op,
972        value,
973        range,
974    })
975}
976impl<T, U> Foldable<T, U> for StmtAnnAssign<T> {
977    type Mapped = StmtAnnAssign<U>;
978    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
979        self,
980        folder: &mut F,
981    ) -> Result<Self::Mapped, F::Error> {
982        folder.fold_stmt_ann_assign(self)
983    }
984}
985pub fn fold_stmt_ann_assign<U, F: Fold<U> + ?Sized>(
986    #[allow(unused)] folder: &mut F,
987    node: StmtAnnAssign<U>,
988) -> Result<StmtAnnAssign<F::TargetU>, F::Error> {
989    let StmtAnnAssign {
990        target,
991        annotation,
992        value,
993        simple,
994        range,
995    } = node;
996    let context = folder.will_map_user(&range);
997
998    let target = Foldable::fold(target, folder)?;
999    let annotation = Foldable::fold(annotation, folder)?;
1000    let value = Foldable::fold(value, folder)?;
1001    let simple = Foldable::fold(simple, folder)?;
1002    let range = folder.map_user(range, context)?;
1003    Ok(StmtAnnAssign {
1004        target,
1005        annotation,
1006        value,
1007        simple,
1008        range,
1009    })
1010}
1011impl<T, U> Foldable<T, U> for StmtFor<T> {
1012    type Mapped = StmtFor<U>;
1013    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1014        self,
1015        folder: &mut F,
1016    ) -> Result<Self::Mapped, F::Error> {
1017        folder.fold_stmt_for(self)
1018    }
1019}
1020pub fn fold_stmt_for<U, F: Fold<U> + ?Sized>(
1021    #[allow(unused)] folder: &mut F,
1022    node: StmtFor<U>,
1023) -> Result<StmtFor<F::TargetU>, F::Error> {
1024    let StmtFor {
1025        target,
1026        iter,
1027        body,
1028        orelse,
1029        type_comment,
1030        range,
1031    } = node;
1032    let context = folder.will_map_user(&range);
1033
1034    let target = Foldable::fold(target, folder)?;
1035    let iter = Foldable::fold(iter, folder)?;
1036    let body = Foldable::fold(body, folder)?;
1037    let orelse = Foldable::fold(orelse, folder)?;
1038    let type_comment = Foldable::fold(type_comment, folder)?;
1039    let range = folder.map_user(range, context)?;
1040    Ok(StmtFor {
1041        target,
1042        iter,
1043        body,
1044        orelse,
1045        type_comment,
1046        range,
1047    })
1048}
1049impl<T, U> Foldable<T, U> for StmtAsyncFor<T> {
1050    type Mapped = StmtAsyncFor<U>;
1051    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1052        self,
1053        folder: &mut F,
1054    ) -> Result<Self::Mapped, F::Error> {
1055        folder.fold_stmt_async_for(self)
1056    }
1057}
1058pub fn fold_stmt_async_for<U, F: Fold<U> + ?Sized>(
1059    #[allow(unused)] folder: &mut F,
1060    node: StmtAsyncFor<U>,
1061) -> Result<StmtAsyncFor<F::TargetU>, F::Error> {
1062    let StmtAsyncFor {
1063        target,
1064        iter,
1065        body,
1066        orelse,
1067        type_comment,
1068        range,
1069    } = node;
1070    let context = folder.will_map_user(&range);
1071
1072    let target = Foldable::fold(target, folder)?;
1073    let iter = Foldable::fold(iter, folder)?;
1074    let body = Foldable::fold(body, folder)?;
1075    let orelse = Foldable::fold(orelse, folder)?;
1076    let type_comment = Foldable::fold(type_comment, folder)?;
1077    let range = folder.map_user(range, context)?;
1078    Ok(StmtAsyncFor {
1079        target,
1080        iter,
1081        body,
1082        orelse,
1083        type_comment,
1084        range,
1085    })
1086}
1087impl<T, U> Foldable<T, U> for StmtWhile<T> {
1088    type Mapped = StmtWhile<U>;
1089    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1090        self,
1091        folder: &mut F,
1092    ) -> Result<Self::Mapped, F::Error> {
1093        folder.fold_stmt_while(self)
1094    }
1095}
1096pub fn fold_stmt_while<U, F: Fold<U> + ?Sized>(
1097    #[allow(unused)] folder: &mut F,
1098    node: StmtWhile<U>,
1099) -> Result<StmtWhile<F::TargetU>, F::Error> {
1100    let StmtWhile {
1101        test,
1102        body,
1103        orelse,
1104        range,
1105    } = node;
1106    let context = folder.will_map_user(&range);
1107
1108    let test = Foldable::fold(test, folder)?;
1109    let body = Foldable::fold(body, folder)?;
1110    let orelse = Foldable::fold(orelse, folder)?;
1111    let range = folder.map_user(range, context)?;
1112    Ok(StmtWhile {
1113        test,
1114        body,
1115        orelse,
1116        range,
1117    })
1118}
1119impl<T, U> Foldable<T, U> for StmtIf<T> {
1120    type Mapped = StmtIf<U>;
1121    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1122        self,
1123        folder: &mut F,
1124    ) -> Result<Self::Mapped, F::Error> {
1125        folder.fold_stmt_if(self)
1126    }
1127}
1128pub fn fold_stmt_if<U, F: Fold<U> + ?Sized>(
1129    #[allow(unused)] folder: &mut F,
1130    node: StmtIf<U>,
1131) -> Result<StmtIf<F::TargetU>, F::Error> {
1132    let StmtIf {
1133        test,
1134        body,
1135        orelse,
1136        range,
1137    } = node;
1138    let context = folder.will_map_user(&range);
1139
1140    let test = Foldable::fold(test, folder)?;
1141    let body = Foldable::fold(body, folder)?;
1142    let orelse = Foldable::fold(orelse, folder)?;
1143    let range = folder.map_user(range, context)?;
1144    Ok(StmtIf {
1145        test,
1146        body,
1147        orelse,
1148        range,
1149    })
1150}
1151impl<T, U> Foldable<T, U> for StmtWith<T> {
1152    type Mapped = StmtWith<U>;
1153    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1154        self,
1155        folder: &mut F,
1156    ) -> Result<Self::Mapped, F::Error> {
1157        folder.fold_stmt_with(self)
1158    }
1159}
1160pub fn fold_stmt_with<U, F: Fold<U> + ?Sized>(
1161    #[allow(unused)] folder: &mut F,
1162    node: StmtWith<U>,
1163) -> Result<StmtWith<F::TargetU>, F::Error> {
1164    let StmtWith {
1165        items,
1166        body,
1167        type_comment,
1168        range,
1169    } = node;
1170    let context = folder.will_map_user(&range);
1171
1172    let items = Foldable::fold(items, folder)?;
1173    let body = Foldable::fold(body, folder)?;
1174    let type_comment = Foldable::fold(type_comment, folder)?;
1175    let range = folder.map_user(range, context)?;
1176    Ok(StmtWith {
1177        items,
1178        body,
1179        type_comment,
1180        range,
1181    })
1182}
1183impl<T, U> Foldable<T, U> for StmtAsyncWith<T> {
1184    type Mapped = StmtAsyncWith<U>;
1185    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1186        self,
1187        folder: &mut F,
1188    ) -> Result<Self::Mapped, F::Error> {
1189        folder.fold_stmt_async_with(self)
1190    }
1191}
1192pub fn fold_stmt_async_with<U, F: Fold<U> + ?Sized>(
1193    #[allow(unused)] folder: &mut F,
1194    node: StmtAsyncWith<U>,
1195) -> Result<StmtAsyncWith<F::TargetU>, F::Error> {
1196    let StmtAsyncWith {
1197        items,
1198        body,
1199        type_comment,
1200        range,
1201    } = node;
1202    let context = folder.will_map_user(&range);
1203
1204    let items = Foldable::fold(items, folder)?;
1205    let body = Foldable::fold(body, folder)?;
1206    let type_comment = Foldable::fold(type_comment, folder)?;
1207    let range = folder.map_user(range, context)?;
1208    Ok(StmtAsyncWith {
1209        items,
1210        body,
1211        type_comment,
1212        range,
1213    })
1214}
1215impl<T, U> Foldable<T, U> for StmtMatch<T> {
1216    type Mapped = StmtMatch<U>;
1217    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1218        self,
1219        folder: &mut F,
1220    ) -> Result<Self::Mapped, F::Error> {
1221        folder.fold_stmt_match(self)
1222    }
1223}
1224pub fn fold_stmt_match<U, F: Fold<U> + ?Sized>(
1225    #[allow(unused)] folder: &mut F,
1226    node: StmtMatch<U>,
1227) -> Result<StmtMatch<F::TargetU>, F::Error> {
1228    let StmtMatch {
1229        subject,
1230        cases,
1231        range,
1232    } = node;
1233    let context = folder.will_map_user(&range);
1234
1235    let subject = Foldable::fold(subject, folder)?;
1236    let cases = Foldable::fold(cases, folder)?;
1237    let range = folder.map_user(range, context)?;
1238    Ok(StmtMatch {
1239        subject,
1240        cases,
1241        range,
1242    })
1243}
1244impl<T, U> Foldable<T, U> for StmtRaise<T> {
1245    type Mapped = StmtRaise<U>;
1246    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1247        self,
1248        folder: &mut F,
1249    ) -> Result<Self::Mapped, F::Error> {
1250        folder.fold_stmt_raise(self)
1251    }
1252}
1253pub fn fold_stmt_raise<U, F: Fold<U> + ?Sized>(
1254    #[allow(unused)] folder: &mut F,
1255    node: StmtRaise<U>,
1256) -> Result<StmtRaise<F::TargetU>, F::Error> {
1257    let StmtRaise { exc, cause, range } = node;
1258    let context = folder.will_map_user(&range);
1259
1260    let exc = Foldable::fold(exc, folder)?;
1261    let cause = Foldable::fold(cause, folder)?;
1262    let range = folder.map_user(range, context)?;
1263    Ok(StmtRaise { exc, cause, range })
1264}
1265impl<T, U> Foldable<T, U> for StmtTry<T> {
1266    type Mapped = StmtTry<U>;
1267    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1268        self,
1269        folder: &mut F,
1270    ) -> Result<Self::Mapped, F::Error> {
1271        folder.fold_stmt_try(self)
1272    }
1273}
1274pub fn fold_stmt_try<U, F: Fold<U> + ?Sized>(
1275    #[allow(unused)] folder: &mut F,
1276    node: StmtTry<U>,
1277) -> Result<StmtTry<F::TargetU>, F::Error> {
1278    let StmtTry {
1279        body,
1280        handlers,
1281        orelse,
1282        finalbody,
1283        range,
1284    } = node;
1285    let context = folder.will_map_user(&range);
1286
1287    let body = Foldable::fold(body, folder)?;
1288    let handlers = Foldable::fold(handlers, folder)?;
1289    let orelse = Foldable::fold(orelse, folder)?;
1290    let finalbody = Foldable::fold(finalbody, folder)?;
1291    let range = folder.map_user(range, context)?;
1292    Ok(StmtTry {
1293        body,
1294        handlers,
1295        orelse,
1296        finalbody,
1297        range,
1298    })
1299}
1300impl<T, U> Foldable<T, U> for StmtTryStar<T> {
1301    type Mapped = StmtTryStar<U>;
1302    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1303        self,
1304        folder: &mut F,
1305    ) -> Result<Self::Mapped, F::Error> {
1306        folder.fold_stmt_try_star(self)
1307    }
1308}
1309pub fn fold_stmt_try_star<U, F: Fold<U> + ?Sized>(
1310    #[allow(unused)] folder: &mut F,
1311    node: StmtTryStar<U>,
1312) -> Result<StmtTryStar<F::TargetU>, F::Error> {
1313    let StmtTryStar {
1314        body,
1315        handlers,
1316        orelse,
1317        finalbody,
1318        range,
1319    } = node;
1320    let context = folder.will_map_user(&range);
1321
1322    let body = Foldable::fold(body, folder)?;
1323    let handlers = Foldable::fold(handlers, folder)?;
1324    let orelse = Foldable::fold(orelse, folder)?;
1325    let finalbody = Foldable::fold(finalbody, folder)?;
1326    let range = folder.map_user(range, context)?;
1327    Ok(StmtTryStar {
1328        body,
1329        handlers,
1330        orelse,
1331        finalbody,
1332        range,
1333    })
1334}
1335impl<T, U> Foldable<T, U> for StmtAssert<T> {
1336    type Mapped = StmtAssert<U>;
1337    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1338        self,
1339        folder: &mut F,
1340    ) -> Result<Self::Mapped, F::Error> {
1341        folder.fold_stmt_assert(self)
1342    }
1343}
1344pub fn fold_stmt_assert<U, F: Fold<U> + ?Sized>(
1345    #[allow(unused)] folder: &mut F,
1346    node: StmtAssert<U>,
1347) -> Result<StmtAssert<F::TargetU>, F::Error> {
1348    let StmtAssert { test, msg, range } = node;
1349    let context = folder.will_map_user(&range);
1350
1351    let test = Foldable::fold(test, folder)?;
1352    let msg = Foldable::fold(msg, folder)?;
1353    let range = folder.map_user(range, context)?;
1354    Ok(StmtAssert { test, msg, range })
1355}
1356impl<T, U> Foldable<T, U> for StmtImport<T> {
1357    type Mapped = StmtImport<U>;
1358    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1359        self,
1360        folder: &mut F,
1361    ) -> Result<Self::Mapped, F::Error> {
1362        folder.fold_stmt_import(self)
1363    }
1364}
1365pub fn fold_stmt_import<U, F: Fold<U> + ?Sized>(
1366    #[allow(unused)] folder: &mut F,
1367    node: StmtImport<U>,
1368) -> Result<StmtImport<F::TargetU>, F::Error> {
1369    let StmtImport { names, range } = node;
1370    let context = folder.will_map_user(&range);
1371
1372    let names = Foldable::fold(names, folder)?;
1373    let range = folder.map_user(range, context)?;
1374    Ok(StmtImport { names, range })
1375}
1376impl<T, U> Foldable<T, U> for StmtImportFrom<T> {
1377    type Mapped = StmtImportFrom<U>;
1378    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1379        self,
1380        folder: &mut F,
1381    ) -> Result<Self::Mapped, F::Error> {
1382        folder.fold_stmt_import_from(self)
1383    }
1384}
1385pub fn fold_stmt_import_from<U, F: Fold<U> + ?Sized>(
1386    #[allow(unused)] folder: &mut F,
1387    node: StmtImportFrom<U>,
1388) -> Result<StmtImportFrom<F::TargetU>, F::Error> {
1389    let StmtImportFrom {
1390        module,
1391        names,
1392        level,
1393        range,
1394    } = node;
1395    let context = folder.will_map_user(&range);
1396
1397    let module = Foldable::fold(module, folder)?;
1398    let names = Foldable::fold(names, folder)?;
1399    let level = Foldable::fold(level, folder)?;
1400    let range = folder.map_user(range, context)?;
1401    Ok(StmtImportFrom {
1402        module,
1403        names,
1404        level,
1405        range,
1406    })
1407}
1408impl<T, U> Foldable<T, U> for StmtGlobal<T> {
1409    type Mapped = StmtGlobal<U>;
1410    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1411        self,
1412        folder: &mut F,
1413    ) -> Result<Self::Mapped, F::Error> {
1414        folder.fold_stmt_global(self)
1415    }
1416}
1417pub fn fold_stmt_global<U, F: Fold<U> + ?Sized>(
1418    #[allow(unused)] folder: &mut F,
1419    node: StmtGlobal<U>,
1420) -> Result<StmtGlobal<F::TargetU>, F::Error> {
1421    let StmtGlobal { names, range } = node;
1422    let context = folder.will_map_user(&range);
1423
1424    let names = Foldable::fold(names, folder)?;
1425    let range = folder.map_user(range, context)?;
1426    Ok(StmtGlobal { names, range })
1427}
1428impl<T, U> Foldable<T, U> for StmtNonlocal<T> {
1429    type Mapped = StmtNonlocal<U>;
1430    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1431        self,
1432        folder: &mut F,
1433    ) -> Result<Self::Mapped, F::Error> {
1434        folder.fold_stmt_nonlocal(self)
1435    }
1436}
1437pub fn fold_stmt_nonlocal<U, F: Fold<U> + ?Sized>(
1438    #[allow(unused)] folder: &mut F,
1439    node: StmtNonlocal<U>,
1440) -> Result<StmtNonlocal<F::TargetU>, F::Error> {
1441    let StmtNonlocal { names, range } = node;
1442    let context = folder.will_map_user(&range);
1443
1444    let names = Foldable::fold(names, folder)?;
1445    let range = folder.map_user(range, context)?;
1446    Ok(StmtNonlocal { names, range })
1447}
1448impl<T, U> Foldable<T, U> for StmtExpr<T> {
1449    type Mapped = StmtExpr<U>;
1450    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1451        self,
1452        folder: &mut F,
1453    ) -> Result<Self::Mapped, F::Error> {
1454        folder.fold_stmt_expr(self)
1455    }
1456}
1457pub fn fold_stmt_expr<U, F: Fold<U> + ?Sized>(
1458    #[allow(unused)] folder: &mut F,
1459    node: StmtExpr<U>,
1460) -> Result<StmtExpr<F::TargetU>, F::Error> {
1461    let StmtExpr { value, range } = node;
1462    let context = folder.will_map_user(&range);
1463
1464    let value = Foldable::fold(value, folder)?;
1465    let range = folder.map_user(range, context)?;
1466    Ok(StmtExpr { value, range })
1467}
1468impl<T, U> Foldable<T, U> for StmtPass<T> {
1469    type Mapped = StmtPass<U>;
1470    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1471        self,
1472        folder: &mut F,
1473    ) -> Result<Self::Mapped, F::Error> {
1474        folder.fold_stmt_pass(self)
1475    }
1476}
1477pub fn fold_stmt_pass<U, F: Fold<U> + ?Sized>(
1478    #[allow(unused)] folder: &mut F,
1479    node: StmtPass<U>,
1480) -> Result<StmtPass<F::TargetU>, F::Error> {
1481    let StmtPass { range } = node;
1482    let context = folder.will_map_user(&range);
1483
1484    let range = folder.map_user(range, context)?;
1485    Ok(StmtPass { range })
1486}
1487impl<T, U> Foldable<T, U> for StmtBreak<T> {
1488    type Mapped = StmtBreak<U>;
1489    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1490        self,
1491        folder: &mut F,
1492    ) -> Result<Self::Mapped, F::Error> {
1493        folder.fold_stmt_break(self)
1494    }
1495}
1496pub fn fold_stmt_break<U, F: Fold<U> + ?Sized>(
1497    #[allow(unused)] folder: &mut F,
1498    node: StmtBreak<U>,
1499) -> Result<StmtBreak<F::TargetU>, F::Error> {
1500    let StmtBreak { range } = node;
1501    let context = folder.will_map_user(&range);
1502
1503    let range = folder.map_user(range, context)?;
1504    Ok(StmtBreak { range })
1505}
1506impl<T, U> Foldable<T, U> for StmtContinue<T> {
1507    type Mapped = StmtContinue<U>;
1508    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1509        self,
1510        folder: &mut F,
1511    ) -> Result<Self::Mapped, F::Error> {
1512        folder.fold_stmt_continue(self)
1513    }
1514}
1515pub fn fold_stmt_continue<U, F: Fold<U> + ?Sized>(
1516    #[allow(unused)] folder: &mut F,
1517    node: StmtContinue<U>,
1518) -> Result<StmtContinue<F::TargetU>, F::Error> {
1519    let StmtContinue { range } = node;
1520    let context = folder.will_map_user(&range);
1521
1522    let range = folder.map_user(range, context)?;
1523    Ok(StmtContinue { range })
1524}
1525impl<T, U> Foldable<T, U> for Expr<T> {
1526    type Mapped = Expr<U>;
1527    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1528        self,
1529        folder: &mut F,
1530    ) -> Result<Self::Mapped, F::Error> {
1531        folder.fold_expr(self)
1532    }
1533}
1534pub fn fold_expr<U, F: Fold<U> + ?Sized>(
1535    #[allow(unused)] folder: &mut F,
1536    node: Expr<U>,
1537) -> Result<Expr<F::TargetU>, F::Error> {
1538    let folded = match node {
1539        Expr::BoolOp(cons) => Expr::BoolOp(Foldable::fold(cons, folder)?),
1540        Expr::NamedExpr(cons) => Expr::NamedExpr(Foldable::fold(cons, folder)?),
1541        Expr::BinOp(cons) => Expr::BinOp(Foldable::fold(cons, folder)?),
1542        Expr::UnaryOp(cons) => Expr::UnaryOp(Foldable::fold(cons, folder)?),
1543        Expr::Lambda(cons) => Expr::Lambda(Foldable::fold(cons, folder)?),
1544        Expr::IfExp(cons) => Expr::IfExp(Foldable::fold(cons, folder)?),
1545        Expr::Dict(cons) => Expr::Dict(Foldable::fold(cons, folder)?),
1546        Expr::Set(cons) => Expr::Set(Foldable::fold(cons, folder)?),
1547        Expr::ListComp(cons) => Expr::ListComp(Foldable::fold(cons, folder)?),
1548        Expr::SetComp(cons) => Expr::SetComp(Foldable::fold(cons, folder)?),
1549        Expr::DictComp(cons) => Expr::DictComp(Foldable::fold(cons, folder)?),
1550        Expr::GeneratorExp(cons) => Expr::GeneratorExp(Foldable::fold(cons, folder)?),
1551        Expr::Await(cons) => Expr::Await(Foldable::fold(cons, folder)?),
1552        Expr::Yield(cons) => Expr::Yield(Foldable::fold(cons, folder)?),
1553        Expr::YieldFrom(cons) => Expr::YieldFrom(Foldable::fold(cons, folder)?),
1554        Expr::Compare(cons) => Expr::Compare(Foldable::fold(cons, folder)?),
1555        Expr::Call(cons) => Expr::Call(Foldable::fold(cons, folder)?),
1556        Expr::FormattedValue(cons) => Expr::FormattedValue(Foldable::fold(cons, folder)?),
1557        Expr::JoinedStr(cons) => Expr::JoinedStr(Foldable::fold(cons, folder)?),
1558        Expr::Constant(cons) => Expr::Constant(Foldable::fold(cons, folder)?),
1559        Expr::Attribute(cons) => Expr::Attribute(Foldable::fold(cons, folder)?),
1560        Expr::Subscript(cons) => Expr::Subscript(Foldable::fold(cons, folder)?),
1561        Expr::Starred(cons) => Expr::Starred(Foldable::fold(cons, folder)?),
1562        Expr::Name(cons) => Expr::Name(Foldable::fold(cons, folder)?),
1563        Expr::List(cons) => Expr::List(Foldable::fold(cons, folder)?),
1564        Expr::Tuple(cons) => Expr::Tuple(Foldable::fold(cons, folder)?),
1565        Expr::Slice(cons) => Expr::Slice(Foldable::fold(cons, folder)?),
1566    };
1567    Ok(folded)
1568}
1569impl<T, U> Foldable<T, U> for ExprBoolOp<T> {
1570    type Mapped = ExprBoolOp<U>;
1571    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1572        self,
1573        folder: &mut F,
1574    ) -> Result<Self::Mapped, F::Error> {
1575        folder.fold_expr_bool_op(self)
1576    }
1577}
1578pub fn fold_expr_bool_op<U, F: Fold<U> + ?Sized>(
1579    #[allow(unused)] folder: &mut F,
1580    node: ExprBoolOp<U>,
1581) -> Result<ExprBoolOp<F::TargetU>, F::Error> {
1582    let ExprBoolOp { op, values, range } = node;
1583    let context = folder.will_map_user(&range);
1584
1585    let op = Foldable::fold(op, folder)?;
1586    let values = Foldable::fold(values, folder)?;
1587    let range = folder.map_user(range, context)?;
1588    Ok(ExprBoolOp { op, values, range })
1589}
1590impl<T, U> Foldable<T, U> for ExprNamedExpr<T> {
1591    type Mapped = ExprNamedExpr<U>;
1592    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1593        self,
1594        folder: &mut F,
1595    ) -> Result<Self::Mapped, F::Error> {
1596        folder.fold_expr_named_expr(self)
1597    }
1598}
1599pub fn fold_expr_named_expr<U, F: Fold<U> + ?Sized>(
1600    #[allow(unused)] folder: &mut F,
1601    node: ExprNamedExpr<U>,
1602) -> Result<ExprNamedExpr<F::TargetU>, F::Error> {
1603    let ExprNamedExpr {
1604        target,
1605        value,
1606        range,
1607    } = node;
1608    let context = folder.will_map_user(&range);
1609
1610    let target = Foldable::fold(target, folder)?;
1611    let value = Foldable::fold(value, folder)?;
1612    let range = folder.map_user(range, context)?;
1613    Ok(ExprNamedExpr {
1614        target,
1615        value,
1616        range,
1617    })
1618}
1619impl<T, U> Foldable<T, U> for ExprBinOp<T> {
1620    type Mapped = ExprBinOp<U>;
1621    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1622        self,
1623        folder: &mut F,
1624    ) -> Result<Self::Mapped, F::Error> {
1625        folder.fold_expr_bin_op(self)
1626    }
1627}
1628pub fn fold_expr_bin_op<U, F: Fold<U> + ?Sized>(
1629    #[allow(unused)] folder: &mut F,
1630    node: ExprBinOp<U>,
1631) -> Result<ExprBinOp<F::TargetU>, F::Error> {
1632    let ExprBinOp {
1633        left,
1634        op,
1635        right,
1636        range,
1637    } = node;
1638    let context = folder.will_map_user(&range);
1639
1640    let left = Foldable::fold(left, folder)?;
1641    let op = Foldable::fold(op, folder)?;
1642    let right = Foldable::fold(right, folder)?;
1643    let range = folder.map_user(range, context)?;
1644    Ok(ExprBinOp {
1645        left,
1646        op,
1647        right,
1648        range,
1649    })
1650}
1651impl<T, U> Foldable<T, U> for ExprUnaryOp<T> {
1652    type Mapped = ExprUnaryOp<U>;
1653    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1654        self,
1655        folder: &mut F,
1656    ) -> Result<Self::Mapped, F::Error> {
1657        folder.fold_expr_unary_op(self)
1658    }
1659}
1660pub fn fold_expr_unary_op<U, F: Fold<U> + ?Sized>(
1661    #[allow(unused)] folder: &mut F,
1662    node: ExprUnaryOp<U>,
1663) -> Result<ExprUnaryOp<F::TargetU>, F::Error> {
1664    let ExprUnaryOp { op, operand, range } = node;
1665    let context = folder.will_map_user(&range);
1666
1667    let op = Foldable::fold(op, folder)?;
1668    let operand = Foldable::fold(operand, folder)?;
1669    let range = folder.map_user(range, context)?;
1670    Ok(ExprUnaryOp { op, operand, range })
1671}
1672impl<T, U> Foldable<T, U> for ExprLambda<T> {
1673    type Mapped = ExprLambda<U>;
1674    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1675        self,
1676        folder: &mut F,
1677    ) -> Result<Self::Mapped, F::Error> {
1678        folder.fold_expr_lambda(self)
1679    }
1680}
1681pub fn fold_expr_lambda<U, F: Fold<U> + ?Sized>(
1682    #[allow(unused)] folder: &mut F,
1683    node: ExprLambda<U>,
1684) -> Result<ExprLambda<F::TargetU>, F::Error> {
1685    let ExprLambda { args, body, range } = node;
1686    let context = folder.will_map_user(&range);
1687
1688    let args = Foldable::fold(args, folder)?;
1689    let body = Foldable::fold(body, folder)?;
1690    let range = folder.map_user(range, context)?;
1691    Ok(ExprLambda { args, body, range })
1692}
1693impl<T, U> Foldable<T, U> for ExprIfExp<T> {
1694    type Mapped = ExprIfExp<U>;
1695    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1696        self,
1697        folder: &mut F,
1698    ) -> Result<Self::Mapped, F::Error> {
1699        folder.fold_expr_if_exp(self)
1700    }
1701}
1702pub fn fold_expr_if_exp<U, F: Fold<U> + ?Sized>(
1703    #[allow(unused)] folder: &mut F,
1704    node: ExprIfExp<U>,
1705) -> Result<ExprIfExp<F::TargetU>, F::Error> {
1706    let ExprIfExp {
1707        test,
1708        body,
1709        orelse,
1710        range,
1711    } = node;
1712    let context = folder.will_map_user(&range);
1713
1714    let test = Foldable::fold(test, folder)?;
1715    let body = Foldable::fold(body, folder)?;
1716    let orelse = Foldable::fold(orelse, folder)?;
1717    let range = folder.map_user(range, context)?;
1718    Ok(ExprIfExp {
1719        test,
1720        body,
1721        orelse,
1722        range,
1723    })
1724}
1725impl<T, U> Foldable<T, U> for ExprDict<T> {
1726    type Mapped = ExprDict<U>;
1727    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1728        self,
1729        folder: &mut F,
1730    ) -> Result<Self::Mapped, F::Error> {
1731        folder.fold_expr_dict(self)
1732    }
1733}
1734pub fn fold_expr_dict<U, F: Fold<U> + ?Sized>(
1735    #[allow(unused)] folder: &mut F,
1736    node: ExprDict<U>,
1737) -> Result<ExprDict<F::TargetU>, F::Error> {
1738    let ExprDict {
1739        keys,
1740        values,
1741        range,
1742    } = node;
1743    let context = folder.will_map_user(&range);
1744
1745    let keys = Foldable::fold(keys, folder)?;
1746    let values = Foldable::fold(values, folder)?;
1747    let range = folder.map_user(range, context)?;
1748    Ok(ExprDict {
1749        keys,
1750        values,
1751        range,
1752    })
1753}
1754impl<T, U> Foldable<T, U> for ExprSet<T> {
1755    type Mapped = ExprSet<U>;
1756    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1757        self,
1758        folder: &mut F,
1759    ) -> Result<Self::Mapped, F::Error> {
1760        folder.fold_expr_set(self)
1761    }
1762}
1763pub fn fold_expr_set<U, F: Fold<U> + ?Sized>(
1764    #[allow(unused)] folder: &mut F,
1765    node: ExprSet<U>,
1766) -> Result<ExprSet<F::TargetU>, F::Error> {
1767    let ExprSet { elts, range } = node;
1768    let context = folder.will_map_user(&range);
1769
1770    let elts = Foldable::fold(elts, folder)?;
1771    let range = folder.map_user(range, context)?;
1772    Ok(ExprSet { elts, range })
1773}
1774impl<T, U> Foldable<T, U> for ExprListComp<T> {
1775    type Mapped = ExprListComp<U>;
1776    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1777        self,
1778        folder: &mut F,
1779    ) -> Result<Self::Mapped, F::Error> {
1780        folder.fold_expr_list_comp(self)
1781    }
1782}
1783pub fn fold_expr_list_comp<U, F: Fold<U> + ?Sized>(
1784    #[allow(unused)] folder: &mut F,
1785    node: ExprListComp<U>,
1786) -> Result<ExprListComp<F::TargetU>, F::Error> {
1787    let ExprListComp {
1788        elt,
1789        generators,
1790        range,
1791    } = node;
1792    let context = folder.will_map_user(&range);
1793
1794    let elt = Foldable::fold(elt, folder)?;
1795    let generators = Foldable::fold(generators, folder)?;
1796    let range = folder.map_user(range, context)?;
1797    Ok(ExprListComp {
1798        elt,
1799        generators,
1800        range,
1801    })
1802}
1803impl<T, U> Foldable<T, U> for ExprSetComp<T> {
1804    type Mapped = ExprSetComp<U>;
1805    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1806        self,
1807        folder: &mut F,
1808    ) -> Result<Self::Mapped, F::Error> {
1809        folder.fold_expr_set_comp(self)
1810    }
1811}
1812pub fn fold_expr_set_comp<U, F: Fold<U> + ?Sized>(
1813    #[allow(unused)] folder: &mut F,
1814    node: ExprSetComp<U>,
1815) -> Result<ExprSetComp<F::TargetU>, F::Error> {
1816    let ExprSetComp {
1817        elt,
1818        generators,
1819        range,
1820    } = node;
1821    let context = folder.will_map_user(&range);
1822
1823    let elt = Foldable::fold(elt, folder)?;
1824    let generators = Foldable::fold(generators, folder)?;
1825    let range = folder.map_user(range, context)?;
1826    Ok(ExprSetComp {
1827        elt,
1828        generators,
1829        range,
1830    })
1831}
1832impl<T, U> Foldable<T, U> for ExprDictComp<T> {
1833    type Mapped = ExprDictComp<U>;
1834    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1835        self,
1836        folder: &mut F,
1837    ) -> Result<Self::Mapped, F::Error> {
1838        folder.fold_expr_dict_comp(self)
1839    }
1840}
1841pub fn fold_expr_dict_comp<U, F: Fold<U> + ?Sized>(
1842    #[allow(unused)] folder: &mut F,
1843    node: ExprDictComp<U>,
1844) -> Result<ExprDictComp<F::TargetU>, F::Error> {
1845    let ExprDictComp {
1846        key,
1847        value,
1848        generators,
1849        range,
1850    } = node;
1851    let context = folder.will_map_user(&range);
1852
1853    let key = Foldable::fold(key, folder)?;
1854    let value = Foldable::fold(value, folder)?;
1855    let generators = Foldable::fold(generators, folder)?;
1856    let range = folder.map_user(range, context)?;
1857    Ok(ExprDictComp {
1858        key,
1859        value,
1860        generators,
1861        range,
1862    })
1863}
1864impl<T, U> Foldable<T, U> for ExprGeneratorExp<T> {
1865    type Mapped = ExprGeneratorExp<U>;
1866    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1867        self,
1868        folder: &mut F,
1869    ) -> Result<Self::Mapped, F::Error> {
1870        folder.fold_expr_generator_exp(self)
1871    }
1872}
1873pub fn fold_expr_generator_exp<U, F: Fold<U> + ?Sized>(
1874    #[allow(unused)] folder: &mut F,
1875    node: ExprGeneratorExp<U>,
1876) -> Result<ExprGeneratorExp<F::TargetU>, F::Error> {
1877    let ExprGeneratorExp {
1878        elt,
1879        generators,
1880        range,
1881    } = node;
1882    let context = folder.will_map_user(&range);
1883
1884    let elt = Foldable::fold(elt, folder)?;
1885    let generators = Foldable::fold(generators, folder)?;
1886    let range = folder.map_user(range, context)?;
1887    Ok(ExprGeneratorExp {
1888        elt,
1889        generators,
1890        range,
1891    })
1892}
1893impl<T, U> Foldable<T, U> for ExprAwait<T> {
1894    type Mapped = ExprAwait<U>;
1895    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1896        self,
1897        folder: &mut F,
1898    ) -> Result<Self::Mapped, F::Error> {
1899        folder.fold_expr_await(self)
1900    }
1901}
1902pub fn fold_expr_await<U, F: Fold<U> + ?Sized>(
1903    #[allow(unused)] folder: &mut F,
1904    node: ExprAwait<U>,
1905) -> Result<ExprAwait<F::TargetU>, F::Error> {
1906    let ExprAwait { value, range } = node;
1907    let context = folder.will_map_user(&range);
1908
1909    let value = Foldable::fold(value, folder)?;
1910    let range = folder.map_user(range, context)?;
1911    Ok(ExprAwait { value, range })
1912}
1913impl<T, U> Foldable<T, U> for ExprYield<T> {
1914    type Mapped = ExprYield<U>;
1915    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1916        self,
1917        folder: &mut F,
1918    ) -> Result<Self::Mapped, F::Error> {
1919        folder.fold_expr_yield(self)
1920    }
1921}
1922pub fn fold_expr_yield<U, F: Fold<U> + ?Sized>(
1923    #[allow(unused)] folder: &mut F,
1924    node: ExprYield<U>,
1925) -> Result<ExprYield<F::TargetU>, F::Error> {
1926    let ExprYield { value, range } = node;
1927    let context = folder.will_map_user(&range);
1928
1929    let value = Foldable::fold(value, folder)?;
1930    let range = folder.map_user(range, context)?;
1931    Ok(ExprYield { value, range })
1932}
1933impl<T, U> Foldable<T, U> for ExprYieldFrom<T> {
1934    type Mapped = ExprYieldFrom<U>;
1935    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1936        self,
1937        folder: &mut F,
1938    ) -> Result<Self::Mapped, F::Error> {
1939        folder.fold_expr_yield_from(self)
1940    }
1941}
1942pub fn fold_expr_yield_from<U, F: Fold<U> + ?Sized>(
1943    #[allow(unused)] folder: &mut F,
1944    node: ExprYieldFrom<U>,
1945) -> Result<ExprYieldFrom<F::TargetU>, F::Error> {
1946    let ExprYieldFrom { value, range } = node;
1947    let context = folder.will_map_user(&range);
1948
1949    let value = Foldable::fold(value, folder)?;
1950    let range = folder.map_user(range, context)?;
1951    Ok(ExprYieldFrom { value, range })
1952}
1953impl<T, U> Foldable<T, U> for ExprCompare<T> {
1954    type Mapped = ExprCompare<U>;
1955    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1956        self,
1957        folder: &mut F,
1958    ) -> Result<Self::Mapped, F::Error> {
1959        folder.fold_expr_compare(self)
1960    }
1961}
1962pub fn fold_expr_compare<U, F: Fold<U> + ?Sized>(
1963    #[allow(unused)] folder: &mut F,
1964    node: ExprCompare<U>,
1965) -> Result<ExprCompare<F::TargetU>, F::Error> {
1966    let ExprCompare {
1967        left,
1968        ops,
1969        comparators,
1970        range,
1971    } = node;
1972    let context = folder.will_map_user(&range);
1973
1974    let left = Foldable::fold(left, folder)?;
1975    let ops = Foldable::fold(ops, folder)?;
1976    let comparators = Foldable::fold(comparators, folder)?;
1977    let range = folder.map_user(range, context)?;
1978    Ok(ExprCompare {
1979        left,
1980        ops,
1981        comparators,
1982        range,
1983    })
1984}
1985impl<T, U> Foldable<T, U> for ExprCall<T> {
1986    type Mapped = ExprCall<U>;
1987    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
1988        self,
1989        folder: &mut F,
1990    ) -> Result<Self::Mapped, F::Error> {
1991        folder.fold_expr_call(self)
1992    }
1993}
1994pub fn fold_expr_call<U, F: Fold<U> + ?Sized>(
1995    #[allow(unused)] folder: &mut F,
1996    node: ExprCall<U>,
1997) -> Result<ExprCall<F::TargetU>, F::Error> {
1998    let ExprCall {
1999        func,
2000        args,
2001        keywords,
2002        range,
2003    } = node;
2004    let context = folder.will_map_user(&range);
2005
2006    let func = Foldable::fold(func, folder)?;
2007    let args = Foldable::fold(args, folder)?;
2008    let keywords = Foldable::fold(keywords, folder)?;
2009    let range = folder.map_user(range, context)?;
2010    Ok(ExprCall {
2011        func,
2012        args,
2013        keywords,
2014        range,
2015    })
2016}
2017impl<T, U> Foldable<T, U> for ExprFormattedValue<T> {
2018    type Mapped = ExprFormattedValue<U>;
2019    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2020        self,
2021        folder: &mut F,
2022    ) -> Result<Self::Mapped, F::Error> {
2023        folder.fold_expr_formatted_value(self)
2024    }
2025}
2026pub fn fold_expr_formatted_value<U, F: Fold<U> + ?Sized>(
2027    #[allow(unused)] folder: &mut F,
2028    node: ExprFormattedValue<U>,
2029) -> Result<ExprFormattedValue<F::TargetU>, F::Error> {
2030    let ExprFormattedValue {
2031        value,
2032        conversion,
2033        format_spec,
2034        range,
2035    } = node;
2036    let context = folder.will_map_user(&range);
2037
2038    let value = Foldable::fold(value, folder)?;
2039    let conversion = Foldable::fold(conversion, folder)?;
2040    let format_spec = Foldable::fold(format_spec, folder)?;
2041    let range = folder.map_user(range, context)?;
2042    Ok(ExprFormattedValue {
2043        value,
2044        conversion,
2045        format_spec,
2046        range,
2047    })
2048}
2049impl<T, U> Foldable<T, U> for ExprJoinedStr<T> {
2050    type Mapped = ExprJoinedStr<U>;
2051    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2052        self,
2053        folder: &mut F,
2054    ) -> Result<Self::Mapped, F::Error> {
2055        folder.fold_expr_joined_str(self)
2056    }
2057}
2058pub fn fold_expr_joined_str<U, F: Fold<U> + ?Sized>(
2059    #[allow(unused)] folder: &mut F,
2060    node: ExprJoinedStr<U>,
2061) -> Result<ExprJoinedStr<F::TargetU>, F::Error> {
2062    let ExprJoinedStr { values, range } = node;
2063    let context = folder.will_map_user(&range);
2064
2065    let values = Foldable::fold(values, folder)?;
2066    let range = folder.map_user(range, context)?;
2067    Ok(ExprJoinedStr { values, range })
2068}
2069impl<T, U> Foldable<T, U> for ExprConstant<T> {
2070    type Mapped = ExprConstant<U>;
2071    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2072        self,
2073        folder: &mut F,
2074    ) -> Result<Self::Mapped, F::Error> {
2075        folder.fold_expr_constant(self)
2076    }
2077}
2078pub fn fold_expr_constant<U, F: Fold<U> + ?Sized>(
2079    #[allow(unused)] folder: &mut F,
2080    node: ExprConstant<U>,
2081) -> Result<ExprConstant<F::TargetU>, F::Error> {
2082    let ExprConstant { value, kind, range } = node;
2083    let context = folder.will_map_user(&range);
2084
2085    let value = Foldable::fold(value, folder)?;
2086    let kind = Foldable::fold(kind, folder)?;
2087    let range = folder.map_user(range, context)?;
2088    Ok(ExprConstant { value, kind, range })
2089}
2090impl<T, U> Foldable<T, U> for ExprAttribute<T> {
2091    type Mapped = ExprAttribute<U>;
2092    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2093        self,
2094        folder: &mut F,
2095    ) -> Result<Self::Mapped, F::Error> {
2096        folder.fold_expr_attribute(self)
2097    }
2098}
2099pub fn fold_expr_attribute<U, F: Fold<U> + ?Sized>(
2100    #[allow(unused)] folder: &mut F,
2101    node: ExprAttribute<U>,
2102) -> Result<ExprAttribute<F::TargetU>, F::Error> {
2103    let ExprAttribute {
2104        value,
2105        attr,
2106        ctx,
2107        range,
2108    } = node;
2109    let context = folder.will_map_user(&range);
2110
2111    let value = Foldable::fold(value, folder)?;
2112    let attr = Foldable::fold(attr, folder)?;
2113    let ctx = Foldable::fold(ctx, folder)?;
2114    let range = folder.map_user(range, context)?;
2115    Ok(ExprAttribute {
2116        value,
2117        attr,
2118        ctx,
2119        range,
2120    })
2121}
2122impl<T, U> Foldable<T, U> for ExprSubscript<T> {
2123    type Mapped = ExprSubscript<U>;
2124    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2125        self,
2126        folder: &mut F,
2127    ) -> Result<Self::Mapped, F::Error> {
2128        folder.fold_expr_subscript(self)
2129    }
2130}
2131pub fn fold_expr_subscript<U, F: Fold<U> + ?Sized>(
2132    #[allow(unused)] folder: &mut F,
2133    node: ExprSubscript<U>,
2134) -> Result<ExprSubscript<F::TargetU>, F::Error> {
2135    let ExprSubscript {
2136        value,
2137        slice,
2138        ctx,
2139        range,
2140    } = node;
2141    let context = folder.will_map_user(&range);
2142
2143    let value = Foldable::fold(value, folder)?;
2144    let slice = Foldable::fold(slice, folder)?;
2145    let ctx = Foldable::fold(ctx, folder)?;
2146    let range = folder.map_user(range, context)?;
2147    Ok(ExprSubscript {
2148        value,
2149        slice,
2150        ctx,
2151        range,
2152    })
2153}
2154impl<T, U> Foldable<T, U> for ExprStarred<T> {
2155    type Mapped = ExprStarred<U>;
2156    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2157        self,
2158        folder: &mut F,
2159    ) -> Result<Self::Mapped, F::Error> {
2160        folder.fold_expr_starred(self)
2161    }
2162}
2163pub fn fold_expr_starred<U, F: Fold<U> + ?Sized>(
2164    #[allow(unused)] folder: &mut F,
2165    node: ExprStarred<U>,
2166) -> Result<ExprStarred<F::TargetU>, F::Error> {
2167    let ExprStarred { value, ctx, range } = node;
2168    let context = folder.will_map_user(&range);
2169
2170    let value = Foldable::fold(value, folder)?;
2171    let ctx = Foldable::fold(ctx, folder)?;
2172    let range = folder.map_user(range, context)?;
2173    Ok(ExprStarred { value, ctx, range })
2174}
2175impl<T, U> Foldable<T, U> for ExprName<T> {
2176    type Mapped = ExprName<U>;
2177    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2178        self,
2179        folder: &mut F,
2180    ) -> Result<Self::Mapped, F::Error> {
2181        folder.fold_expr_name(self)
2182    }
2183}
2184pub fn fold_expr_name<U, F: Fold<U> + ?Sized>(
2185    #[allow(unused)] folder: &mut F,
2186    node: ExprName<U>,
2187) -> Result<ExprName<F::TargetU>, F::Error> {
2188    let ExprName { id, ctx, range } = node;
2189    let context = folder.will_map_user(&range);
2190
2191    let id = Foldable::fold(id, folder)?;
2192    let ctx = Foldable::fold(ctx, folder)?;
2193    let range = folder.map_user(range, context)?;
2194    Ok(ExprName { id, ctx, range })
2195}
2196impl<T, U> Foldable<T, U> for ExprList<T> {
2197    type Mapped = ExprList<U>;
2198    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2199        self,
2200        folder: &mut F,
2201    ) -> Result<Self::Mapped, F::Error> {
2202        folder.fold_expr_list(self)
2203    }
2204}
2205pub fn fold_expr_list<U, F: Fold<U> + ?Sized>(
2206    #[allow(unused)] folder: &mut F,
2207    node: ExprList<U>,
2208) -> Result<ExprList<F::TargetU>, F::Error> {
2209    let ExprList { elts, ctx, range } = node;
2210    let context = folder.will_map_user(&range);
2211
2212    let elts = Foldable::fold(elts, folder)?;
2213    let ctx = Foldable::fold(ctx, folder)?;
2214    let range = folder.map_user(range, context)?;
2215    Ok(ExprList { elts, ctx, range })
2216}
2217impl<T, U> Foldable<T, U> for ExprTuple<T> {
2218    type Mapped = ExprTuple<U>;
2219    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2220        self,
2221        folder: &mut F,
2222    ) -> Result<Self::Mapped, F::Error> {
2223        folder.fold_expr_tuple(self)
2224    }
2225}
2226pub fn fold_expr_tuple<U, F: Fold<U> + ?Sized>(
2227    #[allow(unused)] folder: &mut F,
2228    node: ExprTuple<U>,
2229) -> Result<ExprTuple<F::TargetU>, F::Error> {
2230    let ExprTuple { elts, ctx, range } = node;
2231    let context = folder.will_map_user(&range);
2232
2233    let elts = Foldable::fold(elts, folder)?;
2234    let ctx = Foldable::fold(ctx, folder)?;
2235    let range = folder.map_user(range, context)?;
2236    Ok(ExprTuple { elts, ctx, range })
2237}
2238impl<T, U> Foldable<T, U> for ExprSlice<T> {
2239    type Mapped = ExprSlice<U>;
2240    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2241        self,
2242        folder: &mut F,
2243    ) -> Result<Self::Mapped, F::Error> {
2244        folder.fold_expr_slice(self)
2245    }
2246}
2247pub fn fold_expr_slice<U, F: Fold<U> + ?Sized>(
2248    #[allow(unused)] folder: &mut F,
2249    node: ExprSlice<U>,
2250) -> Result<ExprSlice<F::TargetU>, F::Error> {
2251    let ExprSlice {
2252        lower,
2253        upper,
2254        step,
2255        range,
2256    } = node;
2257    let context = folder.will_map_user(&range);
2258
2259    let lower = Foldable::fold(lower, folder)?;
2260    let upper = Foldable::fold(upper, folder)?;
2261    let step = Foldable::fold(step, folder)?;
2262    let range = folder.map_user(range, context)?;
2263    Ok(ExprSlice {
2264        lower,
2265        upper,
2266        step,
2267        range,
2268    })
2269}
2270impl<T, U> Foldable<T, U> for ExprContext {
2271    type Mapped = ExprContext;
2272    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2273        self,
2274        folder: &mut F,
2275    ) -> Result<Self::Mapped, F::Error> {
2276        folder.fold_expr_context(self)
2277    }
2278}
2279pub fn fold_expr_context<U, F: Fold<U> + ?Sized>(
2280    #[allow(unused)] folder: &mut F,
2281    node: ExprContext,
2282) -> Result<ExprContext, F::Error> {
2283    Ok(node)
2284}
2285impl<T, U> Foldable<T, U> for BoolOp {
2286    type Mapped = BoolOp;
2287    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2288        self,
2289        folder: &mut F,
2290    ) -> Result<Self::Mapped, F::Error> {
2291        folder.fold_boolop(self)
2292    }
2293}
2294pub fn fold_boolop<U, F: Fold<U> + ?Sized>(
2295    #[allow(unused)] folder: &mut F,
2296    node: BoolOp,
2297) -> Result<BoolOp, F::Error> {
2298    Ok(node)
2299}
2300impl<T, U> Foldable<T, U> for Operator {
2301    type Mapped = Operator;
2302    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2303        self,
2304        folder: &mut F,
2305    ) -> Result<Self::Mapped, F::Error> {
2306        folder.fold_operator(self)
2307    }
2308}
2309pub fn fold_operator<U, F: Fold<U> + ?Sized>(
2310    #[allow(unused)] folder: &mut F,
2311    node: Operator,
2312) -> Result<Operator, F::Error> {
2313    Ok(node)
2314}
2315impl<T, U> Foldable<T, U> for UnaryOp {
2316    type Mapped = UnaryOp;
2317    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2318        self,
2319        folder: &mut F,
2320    ) -> Result<Self::Mapped, F::Error> {
2321        folder.fold_unaryop(self)
2322    }
2323}
2324pub fn fold_unaryop<U, F: Fold<U> + ?Sized>(
2325    #[allow(unused)] folder: &mut F,
2326    node: UnaryOp,
2327) -> Result<UnaryOp, F::Error> {
2328    Ok(node)
2329}
2330impl<T, U> Foldable<T, U> for CmpOp {
2331    type Mapped = CmpOp;
2332    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2333        self,
2334        folder: &mut F,
2335    ) -> Result<Self::Mapped, F::Error> {
2336        folder.fold_cmpop(self)
2337    }
2338}
2339pub fn fold_cmpop<U, F: Fold<U> + ?Sized>(
2340    #[allow(unused)] folder: &mut F,
2341    node: CmpOp,
2342) -> Result<CmpOp, F::Error> {
2343    Ok(node)
2344}
2345impl<T, U> Foldable<T, U> for Comprehension<T> {
2346    type Mapped = Comprehension<U>;
2347    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2348        self,
2349        folder: &mut F,
2350    ) -> Result<Self::Mapped, F::Error> {
2351        folder.fold_comprehension(self)
2352    }
2353}
2354pub fn fold_comprehension<U, F: Fold<U> + ?Sized>(
2355    #[allow(unused)] folder: &mut F,
2356    node: Comprehension<U>,
2357) -> Result<Comprehension<F::TargetU>, F::Error> {
2358    let Comprehension {
2359        target,
2360        iter,
2361        ifs,
2362        is_async,
2363        range,
2364    } = node;
2365    let context = folder.will_map_user_cfg(&range);
2366    let target = Foldable::fold(target, folder)?;
2367    let iter = Foldable::fold(iter, folder)?;
2368    let ifs = Foldable::fold(ifs, folder)?;
2369    let is_async = Foldable::fold(is_async, folder)?;
2370    let range = folder.map_user_cfg(range, context)?;
2371    Ok(Comprehension {
2372        target,
2373        iter,
2374        ifs,
2375        is_async,
2376        range,
2377    })
2378}
2379impl<T, U> Foldable<T, U> for ExceptHandler<T> {
2380    type Mapped = ExceptHandler<U>;
2381    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2382        self,
2383        folder: &mut F,
2384    ) -> Result<Self::Mapped, F::Error> {
2385        folder.fold_excepthandler(self)
2386    }
2387}
2388pub fn fold_excepthandler<U, F: Fold<U> + ?Sized>(
2389    #[allow(unused)] folder: &mut F,
2390    node: ExceptHandler<U>,
2391) -> Result<ExceptHandler<F::TargetU>, F::Error> {
2392    let folded = match node {
2393        ExceptHandler::ExceptHandler(cons) => {
2394            ExceptHandler::ExceptHandler(Foldable::fold(cons, folder)?)
2395        }
2396    };
2397    Ok(folded)
2398}
2399impl<T, U> Foldable<T, U> for ExceptHandlerExceptHandler<T> {
2400    type Mapped = ExceptHandlerExceptHandler<U>;
2401    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2402        self,
2403        folder: &mut F,
2404    ) -> Result<Self::Mapped, F::Error> {
2405        folder.fold_excepthandler_except_handler(self)
2406    }
2407}
2408pub fn fold_excepthandler_except_handler<U, F: Fold<U> + ?Sized>(
2409    #[allow(unused)] folder: &mut F,
2410    node: ExceptHandlerExceptHandler<U>,
2411) -> Result<ExceptHandlerExceptHandler<F::TargetU>, F::Error> {
2412    let ExceptHandlerExceptHandler {
2413        type_,
2414        name,
2415        body,
2416        range,
2417    } = node;
2418    let context = folder.will_map_user(&range);
2419
2420    let type_ = Foldable::fold(type_, folder)?;
2421    let name = Foldable::fold(name, folder)?;
2422    let body = Foldable::fold(body, folder)?;
2423    let range = folder.map_user(range, context)?;
2424    Ok(ExceptHandlerExceptHandler {
2425        type_,
2426        name,
2427        body,
2428        range,
2429    })
2430}
2431impl<T, U> Foldable<T, U> for Arguments<T> {
2432    type Mapped = Arguments<U>;
2433    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2434        self,
2435        folder: &mut F,
2436    ) -> Result<Self::Mapped, F::Error> {
2437        folder.fold_arguments(self)
2438    }
2439}
2440pub fn fold_arguments<U, F: Fold<U> + ?Sized>(
2441    #[allow(unused)] folder: &mut F,
2442    node: Arguments<U>,
2443) -> Result<Arguments<F::TargetU>, F::Error> {
2444    let Arguments {
2445        posonlyargs,
2446        args,
2447        vararg,
2448        kwonlyargs,
2449        kwarg,
2450        range,
2451    } = node;
2452    let context = folder.will_map_user_cfg(&range);
2453    let posonlyargs = Foldable::fold(posonlyargs, folder)?;
2454    let args = Foldable::fold(args, folder)?;
2455    let vararg = Foldable::fold(vararg, folder)?;
2456    let kwonlyargs = Foldable::fold(kwonlyargs, folder)?;
2457    let kwarg = Foldable::fold(kwarg, folder)?;
2458    let range = folder.map_user_cfg(range, context)?;
2459    Ok(Arguments {
2460        posonlyargs,
2461        args,
2462        vararg,
2463        kwonlyargs,
2464        kwarg,
2465        range,
2466    })
2467}
2468impl<T, U> Foldable<T, U> for Arg<T> {
2469    type Mapped = Arg<U>;
2470    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2471        self,
2472        folder: &mut F,
2473    ) -> Result<Self::Mapped, F::Error> {
2474        folder.fold_arg(self)
2475    }
2476}
2477pub fn fold_arg<U, F: Fold<U> + ?Sized>(
2478    #[allow(unused)] folder: &mut F,
2479    node: Arg<U>,
2480) -> Result<Arg<F::TargetU>, F::Error> {
2481    let Arg {
2482        arg,
2483        annotation,
2484        type_comment,
2485        range,
2486    } = node;
2487    let context = folder.will_map_user(&range);
2488    let arg = Foldable::fold(arg, folder)?;
2489    let annotation = Foldable::fold(annotation, folder)?;
2490    let type_comment = Foldable::fold(type_comment, folder)?;
2491    let range = folder.map_user(range, context)?;
2492    Ok(Arg {
2493        arg,
2494        annotation,
2495        type_comment,
2496        range,
2497    })
2498}
2499impl<T, U> Foldable<T, U> for Keyword<T> {
2500    type Mapped = Keyword<U>;
2501    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2502        self,
2503        folder: &mut F,
2504    ) -> Result<Self::Mapped, F::Error> {
2505        folder.fold_keyword(self)
2506    }
2507}
2508pub fn fold_keyword<U, F: Fold<U> + ?Sized>(
2509    #[allow(unused)] folder: &mut F,
2510    node: Keyword<U>,
2511) -> Result<Keyword<F::TargetU>, F::Error> {
2512    let Keyword { arg, value, range } = node;
2513    let context = folder.will_map_user(&range);
2514    let arg = Foldable::fold(arg, folder)?;
2515    let value = Foldable::fold(value, folder)?;
2516    let range = folder.map_user(range, context)?;
2517    Ok(Keyword { arg, value, range })
2518}
2519impl<T, U> Foldable<T, U> for Alias<T> {
2520    type Mapped = Alias<U>;
2521    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2522        self,
2523        folder: &mut F,
2524    ) -> Result<Self::Mapped, F::Error> {
2525        folder.fold_alias(self)
2526    }
2527}
2528pub fn fold_alias<U, F: Fold<U> + ?Sized>(
2529    #[allow(unused)] folder: &mut F,
2530    node: Alias<U>,
2531) -> Result<Alias<F::TargetU>, F::Error> {
2532    let Alias {
2533        name,
2534        asname,
2535        range,
2536    } = node;
2537    let context = folder.will_map_user(&range);
2538    let name = Foldable::fold(name, folder)?;
2539    let asname = Foldable::fold(asname, folder)?;
2540    let range = folder.map_user(range, context)?;
2541    Ok(Alias {
2542        name,
2543        asname,
2544        range,
2545    })
2546}
2547impl<T, U> Foldable<T, U> for WithItem<T> {
2548    type Mapped = WithItem<U>;
2549    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2550        self,
2551        folder: &mut F,
2552    ) -> Result<Self::Mapped, F::Error> {
2553        folder.fold_withitem(self)
2554    }
2555}
2556pub fn fold_withitem<U, F: Fold<U> + ?Sized>(
2557    #[allow(unused)] folder: &mut F,
2558    node: WithItem<U>,
2559) -> Result<WithItem<F::TargetU>, F::Error> {
2560    let WithItem {
2561        context_expr,
2562        optional_vars,
2563        range,
2564    } = node;
2565    let context = folder.will_map_user_cfg(&range);
2566    let context_expr = Foldable::fold(context_expr, folder)?;
2567    let optional_vars = Foldable::fold(optional_vars, folder)?;
2568    let range = folder.map_user_cfg(range, context)?;
2569    Ok(WithItem {
2570        context_expr,
2571        optional_vars,
2572        range,
2573    })
2574}
2575impl<T, U> Foldable<T, U> for MatchCase<T> {
2576    type Mapped = MatchCase<U>;
2577    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2578        self,
2579        folder: &mut F,
2580    ) -> Result<Self::Mapped, F::Error> {
2581        folder.fold_match_case(self)
2582    }
2583}
2584pub fn fold_match_case<U, F: Fold<U> + ?Sized>(
2585    #[allow(unused)] folder: &mut F,
2586    node: MatchCase<U>,
2587) -> Result<MatchCase<F::TargetU>, F::Error> {
2588    let MatchCase {
2589        pattern,
2590        guard,
2591        body,
2592        range,
2593    } = node;
2594    let context = folder.will_map_user_cfg(&range);
2595    let pattern = Foldable::fold(pattern, folder)?;
2596    let guard = Foldable::fold(guard, folder)?;
2597    let body = Foldable::fold(body, folder)?;
2598    let range = folder.map_user_cfg(range, context)?;
2599    Ok(MatchCase {
2600        pattern,
2601        guard,
2602        body,
2603        range,
2604    })
2605}
2606impl<T, U> Foldable<T, U> for Pattern<T> {
2607    type Mapped = Pattern<U>;
2608    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2609        self,
2610        folder: &mut F,
2611    ) -> Result<Self::Mapped, F::Error> {
2612        folder.fold_pattern(self)
2613    }
2614}
2615pub fn fold_pattern<U, F: Fold<U> + ?Sized>(
2616    #[allow(unused)] folder: &mut F,
2617    node: Pattern<U>,
2618) -> Result<Pattern<F::TargetU>, F::Error> {
2619    let folded = match node {
2620        Pattern::MatchValue(cons) => Pattern::MatchValue(Foldable::fold(cons, folder)?),
2621        Pattern::MatchSingleton(cons) => Pattern::MatchSingleton(Foldable::fold(cons, folder)?),
2622        Pattern::MatchSequence(cons) => Pattern::MatchSequence(Foldable::fold(cons, folder)?),
2623        Pattern::MatchMapping(cons) => Pattern::MatchMapping(Foldable::fold(cons, folder)?),
2624        Pattern::MatchClass(cons) => Pattern::MatchClass(Foldable::fold(cons, folder)?),
2625        Pattern::MatchStar(cons) => Pattern::MatchStar(Foldable::fold(cons, folder)?),
2626        Pattern::MatchAs(cons) => Pattern::MatchAs(Foldable::fold(cons, folder)?),
2627        Pattern::MatchOr(cons) => Pattern::MatchOr(Foldable::fold(cons, folder)?),
2628    };
2629    Ok(folded)
2630}
2631impl<T, U> Foldable<T, U> for PatternMatchValue<T> {
2632    type Mapped = PatternMatchValue<U>;
2633    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2634        self,
2635        folder: &mut F,
2636    ) -> Result<Self::Mapped, F::Error> {
2637        folder.fold_pattern_match_value(self)
2638    }
2639}
2640pub fn fold_pattern_match_value<U, F: Fold<U> + ?Sized>(
2641    #[allow(unused)] folder: &mut F,
2642    node: PatternMatchValue<U>,
2643) -> Result<PatternMatchValue<F::TargetU>, F::Error> {
2644    let PatternMatchValue { value, range } = node;
2645    let context = folder.will_map_user(&range);
2646
2647    let value = Foldable::fold(value, folder)?;
2648    let range = folder.map_user(range, context)?;
2649    Ok(PatternMatchValue { value, range })
2650}
2651impl<T, U> Foldable<T, U> for PatternMatchSingleton<T> {
2652    type Mapped = PatternMatchSingleton<U>;
2653    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2654        self,
2655        folder: &mut F,
2656    ) -> Result<Self::Mapped, F::Error> {
2657        folder.fold_pattern_match_singleton(self)
2658    }
2659}
2660pub fn fold_pattern_match_singleton<U, F: Fold<U> + ?Sized>(
2661    #[allow(unused)] folder: &mut F,
2662    node: PatternMatchSingleton<U>,
2663) -> Result<PatternMatchSingleton<F::TargetU>, F::Error> {
2664    let PatternMatchSingleton { value, range } = node;
2665    let context = folder.will_map_user(&range);
2666
2667    let value = Foldable::fold(value, folder)?;
2668    let range = folder.map_user(range, context)?;
2669    Ok(PatternMatchSingleton { value, range })
2670}
2671impl<T, U> Foldable<T, U> for PatternMatchSequence<T> {
2672    type Mapped = PatternMatchSequence<U>;
2673    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2674        self,
2675        folder: &mut F,
2676    ) -> Result<Self::Mapped, F::Error> {
2677        folder.fold_pattern_match_sequence(self)
2678    }
2679}
2680pub fn fold_pattern_match_sequence<U, F: Fold<U> + ?Sized>(
2681    #[allow(unused)] folder: &mut F,
2682    node: PatternMatchSequence<U>,
2683) -> Result<PatternMatchSequence<F::TargetU>, F::Error> {
2684    let PatternMatchSequence { patterns, range } = node;
2685    let context = folder.will_map_user(&range);
2686
2687    let patterns = Foldable::fold(patterns, folder)?;
2688    let range = folder.map_user(range, context)?;
2689    Ok(PatternMatchSequence { patterns, range })
2690}
2691impl<T, U> Foldable<T, U> for PatternMatchMapping<T> {
2692    type Mapped = PatternMatchMapping<U>;
2693    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2694        self,
2695        folder: &mut F,
2696    ) -> Result<Self::Mapped, F::Error> {
2697        folder.fold_pattern_match_mapping(self)
2698    }
2699}
2700pub fn fold_pattern_match_mapping<U, F: Fold<U> + ?Sized>(
2701    #[allow(unused)] folder: &mut F,
2702    node: PatternMatchMapping<U>,
2703) -> Result<PatternMatchMapping<F::TargetU>, F::Error> {
2704    let PatternMatchMapping {
2705        keys,
2706        patterns,
2707        rest,
2708        range,
2709    } = node;
2710    let context = folder.will_map_user(&range);
2711
2712    let keys = Foldable::fold(keys, folder)?;
2713    let patterns = Foldable::fold(patterns, folder)?;
2714    let rest = Foldable::fold(rest, folder)?;
2715    let range = folder.map_user(range, context)?;
2716    Ok(PatternMatchMapping {
2717        keys,
2718        patterns,
2719        rest,
2720        range,
2721    })
2722}
2723impl<T, U> Foldable<T, U> for PatternMatchClass<T> {
2724    type Mapped = PatternMatchClass<U>;
2725    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2726        self,
2727        folder: &mut F,
2728    ) -> Result<Self::Mapped, F::Error> {
2729        folder.fold_pattern_match_class(self)
2730    }
2731}
2732pub fn fold_pattern_match_class<U, F: Fold<U> + ?Sized>(
2733    #[allow(unused)] folder: &mut F,
2734    node: PatternMatchClass<U>,
2735) -> Result<PatternMatchClass<F::TargetU>, F::Error> {
2736    let PatternMatchClass {
2737        cls,
2738        patterns,
2739        kwd_attrs,
2740        kwd_patterns,
2741        range,
2742    } = node;
2743    let context = folder.will_map_user(&range);
2744
2745    let cls = Foldable::fold(cls, folder)?;
2746    let patterns = Foldable::fold(patterns, folder)?;
2747    let kwd_attrs = Foldable::fold(kwd_attrs, folder)?;
2748    let kwd_patterns = Foldable::fold(kwd_patterns, folder)?;
2749    let range = folder.map_user(range, context)?;
2750    Ok(PatternMatchClass {
2751        cls,
2752        patterns,
2753        kwd_attrs,
2754        kwd_patterns,
2755        range,
2756    })
2757}
2758impl<T, U> Foldable<T, U> for PatternMatchStar<T> {
2759    type Mapped = PatternMatchStar<U>;
2760    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2761        self,
2762        folder: &mut F,
2763    ) -> Result<Self::Mapped, F::Error> {
2764        folder.fold_pattern_match_star(self)
2765    }
2766}
2767pub fn fold_pattern_match_star<U, F: Fold<U> + ?Sized>(
2768    #[allow(unused)] folder: &mut F,
2769    node: PatternMatchStar<U>,
2770) -> Result<PatternMatchStar<F::TargetU>, F::Error> {
2771    let PatternMatchStar { name, range } = node;
2772    let context = folder.will_map_user(&range);
2773
2774    let name = Foldable::fold(name, folder)?;
2775    let range = folder.map_user(range, context)?;
2776    Ok(PatternMatchStar { name, range })
2777}
2778impl<T, U> Foldable<T, U> for PatternMatchAs<T> {
2779    type Mapped = PatternMatchAs<U>;
2780    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2781        self,
2782        folder: &mut F,
2783    ) -> Result<Self::Mapped, F::Error> {
2784        folder.fold_pattern_match_as(self)
2785    }
2786}
2787pub fn fold_pattern_match_as<U, F: Fold<U> + ?Sized>(
2788    #[allow(unused)] folder: &mut F,
2789    node: PatternMatchAs<U>,
2790) -> Result<PatternMatchAs<F::TargetU>, F::Error> {
2791    let PatternMatchAs {
2792        pattern,
2793        name,
2794        range,
2795    } = node;
2796    let context = folder.will_map_user(&range);
2797
2798    let pattern = Foldable::fold(pattern, folder)?;
2799    let name = Foldable::fold(name, folder)?;
2800    let range = folder.map_user(range, context)?;
2801    Ok(PatternMatchAs {
2802        pattern,
2803        name,
2804        range,
2805    })
2806}
2807impl<T, U> Foldable<T, U> for PatternMatchOr<T> {
2808    type Mapped = PatternMatchOr<U>;
2809    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2810        self,
2811        folder: &mut F,
2812    ) -> Result<Self::Mapped, F::Error> {
2813        folder.fold_pattern_match_or(self)
2814    }
2815}
2816pub fn fold_pattern_match_or<U, F: Fold<U> + ?Sized>(
2817    #[allow(unused)] folder: &mut F,
2818    node: PatternMatchOr<U>,
2819) -> Result<PatternMatchOr<F::TargetU>, F::Error> {
2820    let PatternMatchOr { patterns, range } = node;
2821    let context = folder.will_map_user(&range);
2822
2823    let patterns = Foldable::fold(patterns, folder)?;
2824    let range = folder.map_user(range, context)?;
2825    Ok(PatternMatchOr { patterns, range })
2826}
2827impl<T, U> Foldable<T, U> for TypeIgnore<T> {
2828    type Mapped = TypeIgnore<U>;
2829    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2830        self,
2831        folder: &mut F,
2832    ) -> Result<Self::Mapped, F::Error> {
2833        folder.fold_type_ignore(self)
2834    }
2835}
2836pub fn fold_type_ignore<U, F: Fold<U> + ?Sized>(
2837    #[allow(unused)] folder: &mut F,
2838    node: TypeIgnore<U>,
2839) -> Result<TypeIgnore<F::TargetU>, F::Error> {
2840    let folded = match node {
2841        TypeIgnore::TypeIgnore(cons) => TypeIgnore::TypeIgnore(Foldable::fold(cons, folder)?),
2842    };
2843    Ok(folded)
2844}
2845impl<T, U> Foldable<T, U> for TypeIgnoreTypeIgnore<T> {
2846    type Mapped = TypeIgnoreTypeIgnore<U>;
2847    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2848        self,
2849        folder: &mut F,
2850    ) -> Result<Self::Mapped, F::Error> {
2851        folder.fold_type_ignore_type_ignore(self)
2852    }
2853}
2854pub fn fold_type_ignore_type_ignore<U, F: Fold<U> + ?Sized>(
2855    #[allow(unused)] folder: &mut F,
2856    node: TypeIgnoreTypeIgnore<U>,
2857) -> Result<TypeIgnoreTypeIgnore<F::TargetU>, F::Error> {
2858    let TypeIgnoreTypeIgnore { lineno, tag, range } = node;
2859    let context = folder.will_map_user_cfg(&range);
2860
2861    let lineno = Foldable::fold(lineno, folder)?;
2862    let tag = Foldable::fold(tag, folder)?;
2863    let range = folder.map_user_cfg(range, context)?;
2864    Ok(TypeIgnoreTypeIgnore { lineno, tag, range })
2865}
2866impl<T, U> Foldable<T, U> for TypeParam<T> {
2867    type Mapped = TypeParam<U>;
2868    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2869        self,
2870        folder: &mut F,
2871    ) -> Result<Self::Mapped, F::Error> {
2872        folder.fold_type_param(self)
2873    }
2874}
2875pub fn fold_type_param<U, F: Fold<U> + ?Sized>(
2876    #[allow(unused)] folder: &mut F,
2877    node: TypeParam<U>,
2878) -> Result<TypeParam<F::TargetU>, F::Error> {
2879    let folded = match node {
2880        TypeParam::TypeVar(cons) => TypeParam::TypeVar(Foldable::fold(cons, folder)?),
2881        TypeParam::ParamSpec(cons) => TypeParam::ParamSpec(Foldable::fold(cons, folder)?),
2882        TypeParam::TypeVarTuple(cons) => TypeParam::TypeVarTuple(Foldable::fold(cons, folder)?),
2883    };
2884    Ok(folded)
2885}
2886impl<T, U> Foldable<T, U> for TypeParamTypeVar<T> {
2887    type Mapped = TypeParamTypeVar<U>;
2888    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2889        self,
2890        folder: &mut F,
2891    ) -> Result<Self::Mapped, F::Error> {
2892        folder.fold_type_param_type_var(self)
2893    }
2894}
2895pub fn fold_type_param_type_var<U, F: Fold<U> + ?Sized>(
2896    #[allow(unused)] folder: &mut F,
2897    node: TypeParamTypeVar<U>,
2898) -> Result<TypeParamTypeVar<F::TargetU>, F::Error> {
2899    let TypeParamTypeVar { name, bound, range } = node;
2900    let context = folder.will_map_user(&range);
2901
2902    let name = Foldable::fold(name, folder)?;
2903    let bound = Foldable::fold(bound, folder)?;
2904    let range = folder.map_user(range, context)?;
2905    Ok(TypeParamTypeVar { name, bound, range })
2906}
2907impl<T, U> Foldable<T, U> for TypeParamParamSpec<T> {
2908    type Mapped = TypeParamParamSpec<U>;
2909    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2910        self,
2911        folder: &mut F,
2912    ) -> Result<Self::Mapped, F::Error> {
2913        folder.fold_type_param_param_spec(self)
2914    }
2915}
2916pub fn fold_type_param_param_spec<U, F: Fold<U> + ?Sized>(
2917    #[allow(unused)] folder: &mut F,
2918    node: TypeParamParamSpec<U>,
2919) -> Result<TypeParamParamSpec<F::TargetU>, F::Error> {
2920    let TypeParamParamSpec { name, range } = node;
2921    let context = folder.will_map_user(&range);
2922
2923    let name = Foldable::fold(name, folder)?;
2924    let range = folder.map_user(range, context)?;
2925    Ok(TypeParamParamSpec { name, range })
2926}
2927impl<T, U> Foldable<T, U> for TypeParamTypeVarTuple<T> {
2928    type Mapped = TypeParamTypeVarTuple<U>;
2929    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2930        self,
2931        folder: &mut F,
2932    ) -> Result<Self::Mapped, F::Error> {
2933        folder.fold_type_param_type_var_tuple(self)
2934    }
2935}
2936pub fn fold_type_param_type_var_tuple<U, F: Fold<U> + ?Sized>(
2937    #[allow(unused)] folder: &mut F,
2938    node: TypeParamTypeVarTuple<U>,
2939) -> Result<TypeParamTypeVarTuple<F::TargetU>, F::Error> {
2940    let TypeParamTypeVarTuple { name, range } = node;
2941    let context = folder.will_map_user(&range);
2942
2943    let name = Foldable::fold(name, folder)?;
2944    let range = folder.map_user(range, context)?;
2945    Ok(TypeParamTypeVarTuple { name, range })
2946}
2947impl<T, U> Foldable<T, U> for ArgWithDefault<T> {
2948    type Mapped = ArgWithDefault<U>;
2949    fn fold<F: Fold<T, TargetU = U> + ?Sized>(
2950        self,
2951        folder: &mut F,
2952    ) -> Result<Self::Mapped, F::Error> {
2953        folder.fold_arg_with_default(self)
2954    }
2955}
2956pub fn fold_arg_with_default<U, F: Fold<U> + ?Sized>(
2957    #[allow(unused)] folder: &mut F,
2958    node: ArgWithDefault<U>,
2959) -> Result<ArgWithDefault<F::TargetU>, F::Error> {
2960    let ArgWithDefault {
2961        def,
2962        default,
2963        range,
2964    } = node;
2965    let context = folder.will_map_user_cfg(&range);
2966    let def = Foldable::fold(def, folder)?;
2967    let default = Foldable::fold(default, folder)?;
2968    let range = folder.map_user_cfg(range, context)?;
2969    Ok(ArgWithDefault {
2970        def,
2971        default,
2972        range,
2973    })
2974}