1pub 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}