1use rustpython_ast::{
2 text_size::TextRange, Alias, Arg, Arguments, BoolOp, CmpOp, Comprehension, ExceptHandler,
3 ExceptHandlerExceptHandler, Expr, ExprAttribute, ExprAwait, ExprBinOp, ExprBoolOp, ExprCall,
4 ExprCompare, ExprConstant, ExprDict, ExprDictComp, ExprFormattedValue, ExprGeneratorExp,
5 ExprIfExp, ExprJoinedStr, ExprLambda, ExprList, ExprListComp, ExprName, ExprNamedExpr, ExprSet,
6 ExprSetComp, ExprSlice, ExprStarred, ExprSubscript, ExprTuple, ExprUnaryOp, ExprYield,
7 ExprYieldFrom, Keyword, MatchCase, Operator, Pattern, PatternMatchAs, PatternMatchClass,
8 PatternMatchMapping, PatternMatchOr, PatternMatchSequence, PatternMatchSingleton,
9 PatternMatchStar, PatternMatchValue, Stmt, StmtAnnAssign, StmtAssert, StmtAssign, StmtAsyncFor,
10 StmtAsyncFunctionDef, StmtAsyncWith, StmtAugAssign, StmtBreak, StmtClassDef, StmtContinue,
11 StmtDelete, StmtExpr, StmtFor, StmtFunctionDef, StmtGlobal, StmtIf, StmtImport, StmtImportFrom,
12 StmtMatch, StmtNonlocal, StmtPass, StmtRaise, StmtReturn, StmtTry, StmtTryStar, StmtTypeAlias,
13 StmtWhile, StmtWith, TypeParam, TypeParamParamSpec, TypeParamTypeVar, TypeParamTypeVarTuple,
14 UnaryOp, WithItem,
15};
16use rustpython_ast::{Constant, ConversionFlag, Int};
17use std::ops::Deref;
18
19use crate::utils::replace_first_and_last;
20
21enum Precedence {
22 NamedExpr = 1,
23 Tuple = 2,
24 Yield = 3,
25 Test = 4,
26 Or = 5,
27 And = 6,
28 Not = 7,
29 Cmp = 8,
30
31 Bor = 9,
32 Bxor = 10,
33 Band = 11,
34 Shift = 12,
35 Arith = 13,
36 Term = 14,
37 Factor = 15,
38 Power = 16,
39 Await = 17,
40 Atom = 18,
41}
42
43impl Precedence {
44 fn value(self) -> usize {
45 self as usize
46 }
47}
48
49const EXPR_PRECEDENCE: usize = 9;
50
51fn get_precedence(node: &Expr<TextRange>) -> usize {
52 match node {
53 Expr::NamedExpr(_) => Precedence::NamedExpr.value(),
54 Expr::Tuple(_) => Precedence::Tuple.value(),
55 Expr::Yield(_) => Precedence::Yield.value(),
56 Expr::YieldFrom(_) => Precedence::Yield.value(),
57 Expr::IfExp(_) => Precedence::Test.value(),
58 Expr::Lambda(_) => Precedence::Test.value(),
59 Expr::BoolOp(data) => match data.op {
60 BoolOp::Or => Precedence::Or.value(),
61 BoolOp::And => Precedence::And.value(),
62 },
63 Expr::UnaryOp(data) => match data.op {
64 UnaryOp::Not => Precedence::Not.value(),
65 UnaryOp::UAdd => Precedence::Factor.value(),
66 UnaryOp::USub => Precedence::Factor.value(),
67 UnaryOp::Invert => Precedence::Factor.value(),
68 },
69 Expr::Compare(_) => Precedence::Cmp.value(),
70 Expr::BinOp(data) => match data.op {
71 Operator::BitOr => Precedence::Bor.value(),
72 Operator::BitXor => Precedence::Bxor.value(),
73 Operator::BitAnd => Precedence::Band.value(),
74 Operator::LShift => Precedence::Shift.value(),
75 Operator::RShift => Precedence::Shift.value(),
76 Operator::Add => Precedence::Arith.value(),
77 Operator::Sub => Precedence::Arith.value(),
78 Operator::Div => Precedence::Term.value(),
79 Operator::FloorDiv => Precedence::Term.value(),
80 Operator::Mult => Precedence::Term.value(),
81 Operator::MatMult => Precedence::Term.value(),
82 Operator::Mod => Precedence::Term.value(),
83 Operator::Pow => Precedence::Power.value(),
84 },
85 Expr::Await(_) => Precedence::Await.value(),
86 _ => Precedence::Test.value(),
87 }
88}
89
90pub struct Unparser {
91 pub source: String,
92 indent: usize,
93 in_try_star: bool,
94 precedence_level: usize,
95}
96
97impl Unparser {
98 pub fn new() -> Self {
99 Unparser {
100 in_try_star: false,
101 indent: 0,
102 precedence_level: Precedence::Test.value(),
103 source: String::new(),
104 }
105 }
106
107 fn fill(&mut self, str_: &str) {
108 if self.source.len() > 0 {
109 self.write_str(&("\n".to_owned() + &" ".repeat(self.indent * 4) + str_))
110 } else {
111 self.write_str(str_);
112 }
113 }
114
115 fn write_str(&mut self, str_: &str) {
116 self.source += str_
117 }
118
119 fn write_type_comment(&mut self, type_comment: &Option<String>) {
120 if let Some(str_) = type_comment {
121 self.write_str(" # type: ignore");
122 self.write_str(str_);
123 }
124 }
125
126 fn block<F>(&mut self, f: F)
127 where
128 F: FnOnce(&mut Self),
129 {
130 self.indent += 1;
131 f(self);
132 self.indent -= 1;
133 }
134
135 fn delimit_precedence<F>(&mut self, node: &Expr<TextRange>, f: F)
136 where
137 F: FnOnce(&mut Self),
138 {
139 let should_delimit = self.precedence_level > get_precedence(node);
140 if should_delimit {
141 self.write_str("(");
142 }
143 f(self);
144 if should_delimit {
145 self.write_str(")");
146 }
147 }
148
149 fn with_precedence<F>(&mut self, prec: Precedence, f: F)
150 where
151 F: FnOnce(&mut Self),
152 {
153 let prev_prec = self.precedence_level;
154 self.precedence_level = prec.value();
155 f(self);
156 self.precedence_level = prev_prec;
157 }
158
159 fn with_precedence_num<F>(&mut self, prec: usize, f: F)
160 where
161 F: FnOnce(&mut Self),
162 {
163 let prev_prec = self.precedence_level;
164 self.precedence_level = prec;
165 f(self);
166 self.precedence_level = prev_prec;
167 }
168
169 pub fn unparse_stmt(&mut self, node: &Stmt<TextRange>) {
170 match node {
171 Stmt::FunctionDef(data) => self.unparse_stmt_function_def(data),
172 Stmt::AsyncFunctionDef(data) => self.unparse_stmt_async_function_def(data),
173 Stmt::ClassDef(data) => self.unparse_stmt_class_def(data),
174 Stmt::Return(data) => self.unparse_stmt_return(data),
175 Stmt::Delete(data) => self.unparse_stmt_delete(data),
176 Stmt::Assign(data) => self.unparse_stmt_assign(data),
177 Stmt::TypeAlias(data) => self.unparse_stmt_type_alias(data),
178 Stmt::AugAssign(data) => self.unparse_stmt_aug_assign(data),
179 Stmt::AnnAssign(data) => self.unparse_stmt_ann_assign(data),
180 Stmt::For(data) => self.unparse_stmt_for(data),
181 Stmt::AsyncFor(data) => self.unparse_stmt_async_for(data),
182 Stmt::While(data) => self.unparse_stmt_while(data),
183 Stmt::If(data) => self.unparse_stmt_if(data, false),
184 Stmt::With(data) => self.unparse_stmt_with(data),
185 Stmt::AsyncWith(data) => self.unparse_stmt_async_with(data),
186 Stmt::Match(data) => self.unparse_stmt_match(data),
187 Stmt::Raise(data) => self.unparse_stmt_raise(data),
188 Stmt::Try(data) => self.unparse_stmt_try(data),
189 Stmt::TryStar(data) => self.unparse_stmt_try_star(data),
190 Stmt::Assert(data) => self.unparse_stmt_assert(data),
191 Stmt::Import(data) => self.unparse_stmt_import(data),
192 Stmt::ImportFrom(data) => self.unparse_stmt_import_from(data),
193 Stmt::Global(data) => self.unparse_stmt_global(data),
194 Stmt::Nonlocal(data) => self.unparse_stmt_nonlocal(data),
195 Stmt::Expr(data) => self.unparse_stmt_expr(data),
196 Stmt::Pass(data) => self.unparse_stmt_pass(data),
197 Stmt::Break(data) => self.unparse_stmt_break(data),
198 Stmt::Continue(data) => self.unparse_stmt_continue(data),
199 }
200 }
201
202 fn unparse_stmt_pass(&mut self, _node: &StmtPass<TextRange>) {
203 self.fill("pass")
204 }
205
206 fn unparse_stmt_break(&mut self, _node: &StmtBreak<TextRange>) {
207 self.fill("break")
208 }
209
210 fn unparse_stmt_continue(&mut self, _node: &StmtContinue<TextRange>) {
211 self.fill("continue")
212 }
213
214 fn unparse_stmt_function_def(&mut self, node: &StmtFunctionDef<TextRange>) {
215 for decorator in &node.decorator_list {
216 self.fill("@");
217 self.unparse_expr(&decorator);
218 }
219 self.fill("def ");
220 self.write_str(&node.name);
221
222 if node.type_params.len() > 0 {
223 self.write_str("[");
224 let mut type_params_iter = node.type_params.iter().peekable();
225 while let Some(type_param) = type_params_iter.next() {
226 self.unparse_type_param(type_param);
227 if type_params_iter.peek().is_some() {
228 self.write_str(", ");
229 }
230 }
231 self.write_str("]");
232 }
233 self.write_str("(");
234
235 self.unparse_arguments(&node.args);
236
237 self.write_str(")");
238 if let Some(returns) = &node.returns {
239 self.write_str(" -> ");
240 self.unparse_expr(&returns);
241 }
242 self.write_str(":");
243 self.write_type_comment(&node.type_comment);
244 self.block(|block_self| {
245 for value in &node.body {
246 block_self.unparse_stmt(&value);
247 }
248 });
249 }
250
251 fn unparse_stmt_async_function_def(&mut self, node: &StmtAsyncFunctionDef<TextRange>) {
252 for decorator in &node.decorator_list {
253 self.fill("@");
254 self.unparse_expr(&decorator);
255 }
256 self.fill("async def ");
257 self.write_str(&node.name);
258 if node.type_params.len() > 0 {
259 self.write_str("[");
260 let mut type_params_iter = node.type_params.iter().peekable();
261 while let Some(type_param) = type_params_iter.next() {
262 self.unparse_type_param(type_param);
263 if type_params_iter.peek().is_some() {
264 self.write_str(", ");
265 }
266 }
267 self.write_str("]");
268 }
269 self.write_str("(");
270
271 self.unparse_arguments(&node.args);
272
273 self.write_str(")");
274 if let Some(returns) = &node.returns {
275 self.write_str(" -> ");
276 self.unparse_expr(&returns);
277 }
278 self.write_str(":");
279 self.write_type_comment(&node.type_comment);
280 self.block(|block_self| {
281 for value in &node.body {
282 block_self.unparse_stmt(&value);
283 }
284 });
285 }
286
287 fn unparse_stmt_class_def(&mut self, node: &StmtClassDef<TextRange>) {
288 for decorator in &node.decorator_list {
289 self.fill("@");
290 self.unparse_expr(decorator);
291 }
292
293 self.fill("class ");
294 self.write_str(&node.name);
295
296 if node.type_params.len() > 0 {
297 self.write_str("[");
298 let mut type_params_iter = node.type_params.iter().peekable();
299 while let Some(type_param) = type_params_iter.next() {
300 self.unparse_type_param(type_param);
301 if type_params_iter.peek().is_some() {
302 self.write_str(", ");
303 }
304 }
305 self.write_str("]");
306 }
307
308 let mut bases_iter = node.bases.iter().peekable();
309 let mut keywords_iter = node.keywords.iter().peekable();
310 let has_parens = bases_iter.peek().is_some() || keywords_iter.peek().is_some();
311 if has_parens {
312 self.write_str("(");
313 }
314
315 while let Some(base) = bases_iter.next() {
316 self.unparse_expr(base);
317 if bases_iter.peek().is_some() || keywords_iter.peek().is_some() {
318 self.write_str(", ");
319 }
320 }
321 while let Some(keyword) = keywords_iter.next() {
322 self.unparse_keyword(keyword);
323 if keywords_iter.peek().is_some() {
324 self.write_str(", ");
325 }
326 }
327 if has_parens {
328 self.write_str(")");
329 }
330 self.write_str(":");
331
332 self.block(|block_self| {
333 for value in &node.body {
334 block_self.unparse_stmt(&value);
335 }
336 });
337 }
338
339 fn unparse_stmt_return(&mut self, node: &StmtReturn<TextRange>) {
340 self.fill("return ");
341 if let Some(value) = &node.value {
342 self.unparse_expr(&value);
343 }
344 }
345 fn unparse_stmt_delete(&mut self, node: &StmtDelete<TextRange>) {
346 self.fill("del ");
347 let mut targets_iter = node.targets.iter().peekable();
348
349 while let Some(target) = targets_iter.next() {
350 self.unparse_expr(target);
351 if targets_iter.peek().is_some() {
352 self.write_str(", ");
353 }
354 }
355 }
356
357 fn unparse_stmt_assign(&mut self, node: &StmtAssign<TextRange>) {
358 let mut targets_iter = node.targets.iter().peekable();
359 self.fill("");
360 while let Some(target) = targets_iter.next() {
361 self.with_precedence(Precedence::Tuple, |prec_self| {
362 prec_self.unparse_expr(target);
363 });
364
365 if targets_iter.peek().is_some() {
366 self.write_str(" = ");
367 }
368 }
369 self.write_str(" = ");
370 self.unparse_expr(&node.value);
371 self.write_type_comment(&node.type_comment);
372 }
373
374 fn unparse_stmt_type_alias(&mut self, node: &StmtTypeAlias<TextRange>) {
375 self.fill("type ");
376 self.unparse_expr(&node.name);
377 if node.type_params.len() > 0 {
378 self.write_str("[");
379 let mut type_params_iter = node.type_params.iter().peekable();
380 while let Some(type_param) = type_params_iter.next() {
381 self.unparse_type_param(type_param);
382 if type_params_iter.peek().is_some() {
383 self.write_str(", ");
384 }
385 }
386 self.write_str("]");
387 }
388 self.write_str(" = ");
389 self.unparse_expr(&node.value);
390 }
391
392 fn unparse_stmt_aug_assign(&mut self, node: &StmtAugAssign<TextRange>) {
393 self.fill("");
394 self.unparse_expr(&node.target);
395 self.write_str(" ");
396 self.unparse_operator(&node.op);
397 self.write_str("= ");
398 self.unparse_expr(&node.value);
399 }
400
401 fn unparse_stmt_ann_assign(&mut self, node: &StmtAnnAssign<TextRange>) {
402 self.fill("");
403 self.unparse_expr(&node.target);
404 self.write_str(": ");
405 self.unparse_expr(&node.annotation);
406 if let Some(value) = &node.value {
407 self.write_str(" = ");
408 self.unparse_expr(value);
409 }
410 }
411
412 fn unparse_stmt_for(&mut self, node: &StmtFor<TextRange>) {
413 self.fill("for ");
414 self.unparse_expr(&node.target);
415 self.write_str(" in ");
416 self.unparse_expr(&node.iter);
417 self.write_str(":");
418 self.write_type_comment(&node.type_comment);
419 self.block(|block_self| {
420 for value in &node.body {
421 block_self.unparse_stmt(value);
422 }
423 });
424 if node.orelse.len() > 0 {
425 self.fill("else:");
426 self.block(|block_self| {
427 for stmt in &node.orelse {
428 block_self.unparse_stmt(stmt);
429 }
430 });
431 }
432 }
433 fn unparse_stmt_async_for(&mut self, node: &StmtAsyncFor<TextRange>) {
434 self.fill("async for ");
435 self.unparse_expr(&node.target);
436 self.write_str(" in ");
437 self.unparse_expr(&node.iter);
438 self.write_str(":");
439 self.write_type_comment(&node.type_comment);
440 self.block(|block_self| {
441 for value in &node.body {
442 block_self.unparse_stmt(value);
443 }
444 });
445 if node.orelse.len() > 0 {
446 self.fill("else:");
447 self.block(|block_self| {
448 for stmt in &node.orelse {
449 block_self.unparse_stmt(stmt);
450 }
451 });
452 }
453 }
454 fn unparse_stmt_while(&mut self, node: &StmtWhile<TextRange>) {
455 self.fill("while ");
456 self.unparse_expr(&node.test);
457 self.write_str(":");
458 self.block(|block_self| {
459 for stmt in &node.body {
460 block_self.unparse_stmt(stmt);
461 }
462 });
463
464 if node.orelse.len() > 0 {
465 self.fill("else:");
466 self.block(|block_self| {
467 for stmt in &node.orelse {
468 block_self.unparse_stmt(stmt);
469 }
470 });
471 }
472 }
473
474 fn unparse_stmt_if(&mut self, node: &StmtIf<TextRange>, inner_if: bool) {
475 if inner_if {
476 self.fill("elif ");
477 } else {
478 self.fill("if ");
479 }
480
481 self.unparse_expr(&node.test);
482 self.write_str(":");
483 self.block(|block_self| {
484 for stmt in &node.body {
485 block_self.unparse_stmt(stmt);
486 }
487 });
488 match node.orelse.as_slice() {
489 [Stmt::If(inner_if)] => {
490 self.unparse_stmt_if(inner_if, true);
491 }
492 [] => {}
493 _ => {
494 self.fill("else:");
495 self.block(|block_self| {
496 for stmt in &node.orelse {
497 block_self.unparse_stmt(stmt);
498 }
499 });
500 }
501 }
502 }
503
504 fn unparse_stmt_with(&mut self, node: &StmtWith<TextRange>) {
505 self.fill("with ");
506 let mut items_iter = node.items.iter().peekable();
507 while let Some(item) = items_iter.next() {
508 self.unparse_withitem(item);
509 if items_iter.peek().is_some() {
510 self.write_str(", ");
511 }
512 }
513 self.write_str(":");
514 self.block(|block_self| {
515 for stmt in &node.body {
516 block_self.unparse_stmt(stmt);
517 }
518 });
519 }
520 fn unparse_stmt_async_with(&mut self, node: &StmtAsyncWith<TextRange>) {
521 self.fill("async with ");
522 let mut items_iter = node.items.iter().peekable();
523 while let Some(item) = items_iter.next() {
524 self.unparse_withitem(item);
525 if items_iter.peek().is_some() {
526 self.write_str(", ");
527 }
528 }
529 self.write_str(":");
530 self.block(|block_self| {
531 for stmt in &node.body {
532 block_self.unparse_stmt(stmt);
533 }
534 });
535 }
536
537 fn unparse_stmt_match(&mut self, node: &StmtMatch<TextRange>) {
538 self.fill("match ");
539 self.unparse_expr(&node.subject);
540 self.write_str(":");
541 self.block(|block_self| {
542 for case in &node.cases {
543 block_self.unparse_match_case(case);
544 }
545 });
546 }
547
548 fn unparse_stmt_raise(&mut self, node: &StmtRaise<TextRange>) {
549 self.fill("raise ");
550 if let Some(exc) = &node.exc {
551 self.unparse_expr(exc);
552 }
553 if let Some(cause) = &node.cause {
554 self.write_str(" from ");
555 self.unparse_expr(cause);
556 }
557 }
558
559 fn unparse_stmt_try(&mut self, node: &StmtTry<TextRange>) {
560 let prev_try_star = self.in_try_star;
561 self.in_try_star = false;
562 self.fill("try:");
563 self.block(|block_self| {
564 for stmt in &node.body {
565 block_self.unparse_stmt(stmt);
566 }
567 });
568
569 for handler in &node.handlers {
570 self.unparse_excepthandler(handler);
571 }
572
573 if node.orelse.len() > 0 {
574 self.fill("else:");
575 self.block(|block_self| {
576 for stmt in &node.orelse {
577 block_self.unparse_stmt(stmt);
578 }
579 });
580 }
581
582 if node.finalbody.len() > 0 {
583 self.fill("finally:");
584 self.block(|block_self| {
585 for stmt in &node.finalbody {
586 block_self.unparse_stmt(stmt);
587 }
588 });
589 }
590 self.in_try_star = prev_try_star;
591 }
592 fn unparse_stmt_try_star(&mut self, node: &StmtTryStar<TextRange>) {
593 let prev_try_star = self.in_try_star;
594 self.in_try_star = true;
595 self.fill("try:");
596 self.block(|block_self| {
597 for stmt in &node.body {
598 block_self.unparse_stmt(stmt);
599 }
600 });
601
602 for handler in &node.handlers {
603 self.unparse_excepthandler(handler);
604 }
605
606 if node.orelse.len() > 0 {
607 self.fill("else:");
608 self.block(|block_self| {
609 for stmt in &node.orelse {
610 block_self.unparse_stmt(stmt);
611 }
612 });
613 }
614
615 if node.finalbody.len() > 0 {
616 self.fill("finally:");
617 self.block(|block_self| {
618 for stmt in &node.finalbody {
619 block_self.unparse_stmt(stmt);
620 }
621 });
622 }
623 self.in_try_star = prev_try_star;
624 }
625 fn unparse_stmt_assert(&mut self, node: &StmtAssert<TextRange>) {
626 self.fill("assert ");
627 self.unparse_expr(&node.test);
628 if let Some(msg) = &node.msg {
629 self.write_str(", ");
630 self.unparse_expr(msg);
631 }
632 }
633
634 fn unparse_stmt_import(&mut self, node: &StmtImport<TextRange>) {
635 self.fill("import ");
636 let mut iter = node.names.iter().peekable();
637 while let Some(name) = iter.next() {
638 self.unparse_alias(name);
639 if iter.peek().is_some() {
640 self.write_str(", ");
641 }
642 }
643 }
644 fn unparse_stmt_import_from(&mut self, node: &StmtImportFrom<TextRange>) {
645 self.fill("from ");
646 let level = node.level.unwrap_or(Int::new(0));
647 self.write_str(&".".repeat(level.to_usize()));
648 let module = match &node.module {
649 Some(name) => name.to_string(),
650 None => "".to_string(),
651 };
652 self.write_str(&(module + " import "));
653 let mut iter = node.names.iter().peekable();
654 while let Some(name) = iter.next() {
655 self.unparse_alias(name);
656 if iter.peek().is_some() {
657 self.write_str(", ");
658 }
659 }
660 }
661 fn unparse_stmt_global(&mut self, node: &StmtGlobal<TextRange>) {
662 self.fill("global ");
663 let mut iter = node.names.iter().peekable();
664 while let Some(name) = iter.next() {
665 self.write_str(name);
666 if iter.peek().is_some() {
667 self.write_str(", ");
668 }
669 }
670 }
671 fn unparse_stmt_nonlocal(&mut self, node: &StmtNonlocal<TextRange>) {
672 self.fill("nonlocal ");
673 let mut iter = node.names.iter().peekable();
674 while let Some(name) = iter.next() {
675 self.write_str(name);
676 if iter.peek().is_some() {
677 self.write_str(", ");
678 }
679 }
680 }
681 fn unparse_stmt_expr(&mut self, node: &StmtExpr<TextRange>) {
682 self.fill("");
683 self.with_precedence(Precedence::Yield, |block_self| {
684 block_self.unparse_expr(&node.value);
685 });
686 }
687
688 pub fn unparse_expr(&mut self, node: &Expr<TextRange>) {
689 match node {
690 Expr::BoolOp(data) => self.unparse_expr_bool_op(data),
691 Expr::NamedExpr(data) => self.unparse_expr_named_expr(data),
692 Expr::BinOp(data) => self.unparse_expr_bin_op(data),
693 Expr::UnaryOp(data) => self.unparse_expr_unary_op(data),
694 Expr::Lambda(data) => self.unparse_expr_lambda(data),
695 Expr::IfExp(data) => self.unparse_expr_if_exp(data),
696 Expr::Dict(data) => self.unparse_expr_dict(data),
697 Expr::Set(data) => self.unparse_expr_set(data),
698 Expr::ListComp(data) => self.unparse_expr_list_comp(data),
699 Expr::SetComp(data) => self.unparse_expr_set_comp(data),
700 Expr::DictComp(data) => self.unparse_expr_dict_comp(data),
701 Expr::GeneratorExp(data) => self.unparse_expr_generator_exp(data),
702 Expr::Await(data) => self.unparse_expr_await(data),
703 Expr::Yield(data) => self.unparse_expr_yield(data),
704 Expr::YieldFrom(data) => self.unparse_expr_yield_from(data),
705 Expr::Compare(data) => self.unparse_expr_compare(data),
706 Expr::Call(data) => self.unparse_expr_call(data),
707 Expr::FormattedValue(data) => self.unparse_expr_formatted_value(data),
708 Expr::JoinedStr(data) => self.unparse_expr_joined_str(data, false),
709 Expr::Constant(data) => self.unparse_expr_constant(data),
710 Expr::Attribute(data) => self.unparse_expr_attribute(data),
711 Expr::Subscript(data) => self.unparse_expr_subscript(data),
712 Expr::Starred(data) => self.unparse_expr_starred(data),
713 Expr::Name(data) => self.unparse_expr_name(data),
714 Expr::List(data) => self.unparse_expr_list(data),
715 Expr::Tuple(data) => self.unparse_expr_tuple(data),
716 Expr::Slice(data) => self.unparse_expr_slice(data),
717 }
718 }
719
720 fn unparse_expr_bool_op(&mut self, node: &ExprBoolOp<TextRange>) {
721 let enum_member = Expr::BoolOp(node.to_owned());
722 let mut operator_precedence = get_precedence(&enum_member);
723 let operator = match node.op {
724 BoolOp::And => " and ",
725 BoolOp::Or => " or ",
726 };
727
728 let mut values_iter = node.values.iter().peekable();
729 self.delimit_precedence(&enum_member, |block_self| {
730 while let Some(expr) = values_iter.next() {
731 operator_precedence += 1;
732 block_self.with_precedence_num(operator_precedence, |prec_self| {
733 prec_self.unparse_expr(expr);
734 });
735 if values_iter.peek().is_some() {
736 block_self.write_str(operator);
737 }
738 }
739 });
740 }
741
742 fn unparse_expr_named_expr(&mut self, node: &ExprNamedExpr<TextRange>) {
743 let enum_member = Expr::NamedExpr(node.to_owned());
744 self.delimit_precedence(&enum_member, |block_self| {
745 block_self.with_precedence(Precedence::Atom, |prec_self| {
746 prec_self.unparse_expr(&node.target);
747 prec_self.write_str(" := ");
748 prec_self.unparse_expr(&node.value);
749 });
750 })
751 }
752
753 fn unparse_expr_bin_op(&mut self, node: &ExprBinOp<TextRange>) {
754 let enum_member = Expr::BinOp(node.to_owned());
755
756 self.delimit_precedence(&enum_member, |block_self| {
757 block_self.unparse_expr(&node.left);
758 block_self.write_str(" ");
759 block_self.unparse_operator(&node.op);
760 block_self.write_str(" ");
761 block_self.unparse_expr(&node.right);
762 })
763 }
764
765 fn unparse_expr_unary_op(&mut self, node: &ExprUnaryOp<TextRange>) {
766 let enum_member = Expr::UnaryOp(node.to_owned());
767 let operator = match node.op {
768 UnaryOp::Invert => "~",
769 UnaryOp::Not => "not ",
770 UnaryOp::UAdd => "+",
771 UnaryOp::USub => "-",
772 };
773
774 self.delimit_precedence(&enum_member, |block_self| {
775 block_self.write_str(&operator);
776 block_self.unparse_expr(&node.operand)
777 })
778 }
779 fn unparse_expr_lambda(&mut self, node: &ExprLambda<TextRange>) {
780 let enum_member = Expr::Lambda(node.to_owned());
781
782 self.delimit_precedence(&enum_member, |block_self| {
783 block_self.write_str("lambda ");
784 block_self.unparse_arguments(&node.args);
785 block_self.write_str(": ");
786 block_self.unparse_expr(&node.body);
787 })
788 }
789 fn unparse_expr_if_exp(&mut self, node: &ExprIfExp<TextRange>) {
790 let enum_member = Expr::IfExp(node.to_owned());
791 self.delimit_precedence(&enum_member, |block_self| {
792 block_self.unparse_expr(&node.body);
793 block_self.write_str(" if ");
794 block_self.unparse_expr(&node.test);
795 block_self.write_str(" else ");
796 block_self.unparse_expr(&node.orelse);
797 })
798 }
799
800 fn unparse_expr_dict(&mut self, node: &ExprDict<TextRange>) {
801 let mut zipped = node.keys.iter().zip(node.values.iter()).peekable();
802
803 self.write_str("{");
804 while let Some((key, value)) = zipped.next() {
805 match key {
806 Some(key_value) => {
807 self.unparse_expr(key_value);
808 self.write_str(": ");
809 }
810 None => {
811 self.write_str("**");
812 }
813 }
814 self.unparse_expr(value);
815 if zipped.peek().is_some() {
816 self.write_str(", ");
817 }
818 }
819 self.write_str("}");
820 }
821
822 fn unparse_expr_set(&mut self, node: &ExprSet<TextRange>) {
823 if node.elts.len() > 0 {
824 self.write_str("{");
825 let mut elts_iter = node.elts.iter().peekable();
826 while let Some(expr) = elts_iter.next() {
827 self.unparse_expr(expr);
828 if elts_iter.peek().is_some() {
829 self.write_str(", ");
830 }
831 }
832 self.write_str("}");
833 } else {
834 self.write_str("{*()}");
835 }
836 }
837
838 fn unparse_expr_list_comp(&mut self, node: &ExprListComp<TextRange>) {
839 self.write_str("[");
840 self.unparse_expr(&node.elt);
841 for generator in &node.generators {
842 self.unparse_comprehension(generator);
843 }
844 self.write_str("]");
845 }
846
847 fn unparse_expr_set_comp(&mut self, node: &ExprSetComp<TextRange>) {
848 self.write_str("{");
849 self.unparse_expr(&node.elt);
850
851 for generator in &node.generators {
852 self.unparse_comprehension(generator);
853 }
854 self.write_str("}");
855 }
856
857 fn unparse_expr_dict_comp(&mut self, node: &ExprDictComp<TextRange>) {
858 self.write_str("{");
859 self.unparse_expr(&node.key);
860 self.write_str(": ");
861 self.unparse_expr(&node.value);
862
863 for generator in &node.generators {
864 self.unparse_comprehension(generator);
865 }
866 self.write_str("}");
867 }
868
869 fn unparse_expr_generator_exp(&mut self, node: &ExprGeneratorExp<TextRange>) {
870 self.write_str("(");
871 self.unparse_expr(&node.elt);
872
873 for generator in &node.generators {
874 self.unparse_comprehension(generator);
875 }
876 self.write_str(")");
877 }
878
879 fn unparse_expr_await(&mut self, node: &ExprAwait<TextRange>) {
880 let enum_member = Expr::Await(node.to_owned());
881 self.delimit_precedence(&enum_member, |block_self| {
882 block_self.write_str("await ");
883 block_self.with_precedence(Precedence::Atom, |prec_self| {
884 prec_self.unparse_expr(&node.value);
885 });
886 })
887 }
888
889 fn unparse_expr_yield(&mut self, node: &ExprYield<TextRange>) {
890 let enum_member = Expr::Yield(node.to_owned());
891 self.delimit_precedence(&enum_member, |block_self| {
892 block_self.write_str("yield");
893 if let Some(expr) = &node.value {
894 block_self.write_str(" ");
895 block_self.with_precedence(Precedence::Atom, |prec_self| {
896 prec_self.unparse_expr(expr);
897 });
898 }
899 })
900 }
901
902 fn unparse_expr_yield_from(&mut self, node: &ExprYieldFrom<TextRange>) {
903 let enum_member = Expr::YieldFrom(node.to_owned());
904 self.delimit_precedence(&enum_member, |block_self| {
905 block_self.write_str("yield from ");
906
907 block_self.with_precedence(Precedence::Atom, |prec_self| {
908 prec_self.unparse_expr(&node.value);
909 });
910 })
911 }
912
913 fn unparse_expr_compare(&mut self, node: &ExprCompare<TextRange>) {
914 let enum_member = Expr::Compare(node.to_owned());
915 let zipped = node.ops.iter().zip(node.comparators.iter());
916 self.delimit_precedence(&enum_member, |block_self| {
917 block_self.unparse_expr(&node.left);
918 for (op, comp) in zipped {
919 let operator = match op {
920 CmpOp::Eq => " == ",
921 CmpOp::Gt => " > ",
922 CmpOp::GtE => " >= ",
923 CmpOp::In => " in ",
924 CmpOp::Is => " is ",
925 CmpOp::IsNot => " is not ",
926 CmpOp::Lt => " < ",
927 CmpOp::LtE => " <= ",
928 CmpOp::NotEq => " != ",
929 CmpOp::NotIn => " not in ",
930 };
931 block_self.write_str(&operator);
932 block_self.unparse_expr(comp);
933 }
934 })
935 }
936
937 fn unparse_expr_call(&mut self, node: &ExprCall<TextRange>) {
938 self.unparse_expr(&node.func);
939 let mut args_iter = node.args.iter().peekable();
940 let mut keywords_iter = node.keywords.iter().peekable();
941 self.write_str("(");
942 while let Some(arg) = args_iter.next() {
943 self.unparse_expr(arg);
944 if args_iter.peek().is_some() || keywords_iter.peek().is_some() {
945 self.write_str(", ");
946 }
947 }
948 while let Some(keyword) = keywords_iter.next() {
949 self.unparse_keyword(keyword);
950 if keywords_iter.peek().is_some() {
951 self.write_str(", ");
952 }
953 }
954 self.write_str(")");
955 }
956
957 fn unparse_expr_formatted_value(&mut self, node: &ExprFormattedValue<TextRange>) {
958 self.write_str("{");
959 let mut inner_unparser = Unparser::new();
960 inner_unparser.unparse_expr(&node.value);
961 let inner_expr = inner_unparser.source.as_str();
962 if inner_expr.starts_with("{") {
963 self.write_str(" ");
964 }
965 self.write_str(inner_expr);
966 if node.conversion != ConversionFlag::None {
967 self.write_str("!");
968 let buf = &[node.conversion as u8];
969 let c = std::str::from_utf8(buf).unwrap();
970 self.write_str(c);
971 }
972 if let Some(format_spec) = &node.format_spec {
973 self.write_str(":");
974 match format_spec.deref() {
975 Expr::JoinedStr(joined_str) => {
976 if joined_str.values.len() > 0 {
977 self.unparse_expr_joined_str(joined_str, true);
978 }
979 }
980 _ => self.unparse_expr(&format_spec),
981 };
982 }
983 self.write_str("}");
984 }
985
986 fn unparse_expr_joined_str(&mut self, node: &ExprJoinedStr<TextRange>, is_spec: bool) {
987 if !is_spec {
988 self.write_str("f");
989 }
990 let mut expr_source = String::new();
991
992 let mut formatted_values_sources: Vec<String> = Vec::new();
993 for expr in node.values.iter() {
994 let mut inner_unparser = Unparser::new();
995 match expr {
996 Expr::Constant(ExprConstant { value, .. }) => {
997 if let Constant::Str(str_) = value {
998 let escaped = str_.replace('{', "{{").replace('}', "}}");
999 inner_unparser.write_str(&escaped);
1000 } else {
1001 unreachable!()
1002 }
1003 expr_source += inner_unparser.source.as_str();
1004 }
1005 Expr::FormattedValue(formatted) => {
1006 expr_source += &("{".to_owned()
1007 + formatted_values_sources.len().to_string().as_str()
1008 + "}");
1009 inner_unparser.unparse_expr_formatted_value(formatted);
1010 formatted_values_sources.push(inner_unparser.source);
1011 }
1012 _ => {
1013 inner_unparser.unparse_expr(expr);
1014 expr_source += inner_unparser.source.as_str();
1015 }
1016 }
1017 }
1018
1019 if is_spec {
1020 for (i, formatted) in formatted_values_sources.iter().enumerate() {
1021 let to_replace = "{".to_owned() + i.to_string().as_str() + "}";
1022 expr_source = expr_source.replace(&to_replace, formatted)
1023 }
1024 self.write_str(&expr_source);
1025 } else {
1026 let mut escaped_source =
1027 rustpython_literal::escape::UnicodeEscape::new_repr(&expr_source)
1028 .str_repr()
1029 .to_string()
1030 .unwrap();
1031 for (i, formatted) in formatted_values_sources.iter().enumerate() {
1032 let to_replace = "{".to_owned() + i.to_string().as_str() + "}";
1033 escaped_source = escaped_source.replace(&to_replace, formatted)
1034 }
1035
1036 let has_single = escaped_source.contains("'");
1037 let has_double = escaped_source.contains("\"");
1038
1039 if has_single
1040 && has_double
1041 && escaped_source.starts_with("\"")
1042 && escaped_source.ends_with("\"")
1043 {
1044 escaped_source = replace_first_and_last(&escaped_source, "\"\"\"")
1045 } else if has_single
1046 && has_double
1047 && escaped_source.starts_with("'")
1048 && escaped_source.ends_with("'")
1049 {
1050 escaped_source = replace_first_and_last(&escaped_source, "'''")
1051 } else if has_single {
1052 escaped_source = replace_first_and_last(&escaped_source, "\"")
1053 }
1054
1055 self.write_str(&escaped_source);
1056 }
1057 }
1058
1059 fn _unparse_constant(&mut self, constant: &Constant) {
1060 let inf_str = "1e309";
1061 return match constant {
1062 Constant::Tuple(values) => {
1063 self.write_str("(");
1064 let mut values_iter = values.iter().peekable();
1065 while let Some(value) = values_iter.next() {
1066 self._unparse_constant(value);
1067 if values_iter.peek().is_some() || values.len() == 1 {
1068 self.write_str(", ");
1069 }
1070 }
1071 self.write_str(")");
1072 }
1073 Constant::Ellipsis => self.write_str("..."),
1074 Constant::Bool(value) => {
1075 if *value {
1076 self.write_str("True")
1077 } else {
1078 self.write_str("False")
1079 }
1080 }
1081 Constant::Bytes(value) => {
1082 let escaped = rustpython_literal::escape::AsciiEscape::new_repr(value)
1083 .bytes_repr()
1084 .to_string()
1085 .unwrap();
1086 self.write_str(&escaped);
1087 }
1088 Constant::Int(value) => self.write_str(&value.to_string()),
1089 Constant::Str(value) => {
1090 let escaped = rustpython_literal::escape::UnicodeEscape::new_repr(value)
1091 .str_repr()
1092 .to_string()
1093 .unwrap();
1094
1095 self.write_str(&escaped);
1096 }
1097 Constant::None => self.write_str("None"),
1098 Constant::Complex { real, imag } => {
1099 if real.is_infinite() || imag.is_infinite() {
1100 self.write_str(&constant.to_string().replace("inf", &inf_str));
1101 } else {
1102 self.write_str(&constant.to_string());
1103 }
1104 }
1105 Constant::Float(value) => {
1106 if value.is_infinite() {
1107 self.write_str(inf_str);
1108 } else {
1109 let mut str_value = value.to_string();
1110 if value.fract() == 0.0 {
1111 let mut trailing_zeroes = 0;
1112 while str_value.ends_with("0") {
1113 str_value.pop();
1114 trailing_zeroes += 1;
1115 }
1116 str_value = format!("{}e{}", str_value, trailing_zeroes);
1117 } else if str_value.starts_with(&format!("0.{}", "0".repeat(5))) {
1118 let mut trimmed = str_value[2..].to_owned();
1119 let mut factor = 1;
1120 while trimmed.starts_with("0") {
1121 trimmed = trimmed[1..].to_owned();
1122 factor += 1;
1123 }
1124 str_value = format!("{}e-{}", trimmed, factor);
1125 }
1126 self.write_str(&str_value);
1127 }
1128 }
1129 };
1130 }
1131
1132 fn unparse_expr_constant(&mut self, node: &ExprConstant<TextRange>) {
1133 if node.kind.as_deref().is_some_and(|kind| kind == "u") {
1134 self.write_str("u");
1135 }
1136 self._unparse_constant(&node.value)
1137 }
1138
1139 fn unparse_expr_attribute(&mut self, node: &ExprAttribute<TextRange>) {
1140 self.unparse_expr(&node.value);
1141 self.write_str(".");
1142 self.write_str(&node.attr);
1143 }
1144 fn unparse_expr_subscript(&mut self, node: &ExprSubscript<TextRange>) {
1145 self.with_precedence(Precedence::Atom, |prec_self| {
1146 prec_self.unparse_expr(&node.value);
1147 });
1148 self.write_str("[");
1149 self.unparse_expr(&node.slice);
1150 self.write_str("]");
1151 }
1152 fn unparse_expr_starred(&mut self, node: &ExprStarred<TextRange>) {
1153 self.write_str("*");
1154 self.with_precedence_num(EXPR_PRECEDENCE, |prec_self| {
1155 prec_self.unparse_expr(&node.value);
1156 });
1157 }
1158
1159 fn unparse_expr_name(&mut self, node: &ExprName<TextRange>) {
1160 self.write_str(&node.id.as_str())
1161 }
1162 fn unparse_expr_list(&mut self, node: &ExprList<TextRange>) {
1163 let mut elts_iter = node.elts.iter().peekable();
1164 self.write_str("[");
1165 while let Some(expr) = elts_iter.next() {
1166 self.unparse_expr(expr);
1167 if elts_iter.peek().is_some() {
1168 self.write_str(", ");
1169 }
1170 }
1171 self.write_str("]");
1172 }
1173
1174 fn unparse_expr_tuple(&mut self, node: &ExprTuple<TextRange>) {
1175 let mut elts_iter = node.elts.iter().peekable();
1176 self.write_str("(");
1177 while let Some(expr) = elts_iter.next() {
1178 self.unparse_expr(expr);
1179 if elts_iter.peek().is_some() || node.elts.len() == 1 {
1180 self.write_str(", ");
1181 }
1182 }
1183 self.write_str(")");
1184 }
1185
1186 fn unparse_expr_slice(&mut self, node: &ExprSlice<TextRange>) {
1187 if let Some(lower) = &node.lower {
1188 self.unparse_expr(lower);
1189 }
1190 self.write_str(":");
1191 if let Some(upper) = &node.upper {
1192 self.unparse_expr(upper);
1193 }
1194 if let Some(step) = &node.step {
1195 self.write_str(":");
1196 self.unparse_expr(step);
1197 }
1198 }
1199
1200 fn unparse_operator(&mut self, node: &Operator) {
1201 self.write_str(match node {
1202 Operator::Add => "+",
1203 Operator::Sub => "-",
1204 Operator::BitOr => "|",
1205 Operator::BitAnd => "&",
1206 Operator::BitXor => "^",
1207 Operator::Div => "/",
1208 Operator::FloorDiv => "//",
1209 Operator::LShift => "<<",
1210 Operator::MatMult => "@",
1211 Operator::Mod => "%",
1212 Operator::Pow => "**",
1213 Operator::RShift => ">>",
1214 Operator::Mult => "*",
1215 })
1216 }
1217
1218 fn unparse_comprehension(&mut self, node: &Comprehension<TextRange>) {
1219 if node.is_async {
1220 self.write_str(" async for ");
1221 } else {
1222 self.write_str(" for ");
1223 }
1224 self.unparse_expr(&node.target);
1225 self.write_str(" in ");
1226 self.unparse_expr(&node.iter);
1227 for if_ in &node.ifs {
1228 self.write_str(" if ");
1229 self.unparse_expr(if_);
1230 }
1231 }
1232
1233 fn unparse_excepthandler(&mut self, node: &ExceptHandler<TextRange>) {
1234 match node {
1235 ExceptHandler::ExceptHandler(data) => self.unparse_excepthandler_except_handler(data),
1236 }
1237 }
1238
1239 fn unparse_excepthandler_except_handler(
1240 &mut self,
1241 node: &ExceptHandlerExceptHandler<TextRange>,
1242 ) {
1243 self.fill("except");
1244 if self.in_try_star {
1245 self.write_str("*")
1246 }
1247
1248 if let Some(type_) = &node.type_ {
1249 self.write_str(" ");
1250 self.unparse_expr(type_);
1251 }
1252 if let Some(name) = &node.name {
1253 self.write_str(" as ");
1254 self.write_str(name);
1255 }
1256
1257 self.write_str(":");
1258 self.block(|block_self| {
1259 for stmt in &node.body {
1260 block_self.unparse_stmt(stmt);
1261 }
1262 });
1263 }
1264
1265 fn unparse_arguments(&mut self, node: &Arguments<TextRange>) {
1266 let mut posonly_iter = node.posonlyargs.iter().peekable();
1267 let mut args_iter = node.args.iter().peekable();
1268 let mut kw_iter = node.kwonlyargs.iter().peekable();
1269 while let Some(posonly) = posonly_iter.next() {
1270 self.unparse_arg(posonly.as_arg());
1271 if let Some(default) = &posonly.default {
1272 self.write_str("=");
1273 self.unparse_expr(default);
1274 }
1275
1276 if posonly_iter.peek().is_some() {
1277 self.write_str(", ");
1278 }
1279 }
1280
1281 if node.posonlyargs.len() > 0 {
1282 self.write_str(", /,");
1283 }
1284
1285 while let Some(arg) = args_iter.next() {
1286 self.unparse_arg(arg.as_arg());
1287 if let Some(default) = &arg.default {
1288 self.write_str("=");
1289 self.unparse_expr(default);
1290 }
1291 if args_iter.peek().is_some()
1292 || node.vararg.is_some()
1293 || kw_iter.peek().is_some()
1294 || node.kwarg.is_some()
1295 {
1296 self.write_str(", ");
1297 }
1298 }
1299
1300 if let Some(vararg) = &node.vararg {
1301 self.write_str("*");
1302 self.write_str(&vararg.arg);
1303
1304 if let Some(annotation) = &vararg.annotation {
1305 self.write_str(": ");
1306 self.unparse_expr(annotation);
1307 }
1308 if kw_iter.peek().is_some() || node.kwarg.is_some() {
1309 self.write_str(", ");
1310 }
1311 } else if node.kwonlyargs.len() > 0 {
1312 self.write_str("*, ");
1313 }
1314
1315 while let Some(kw) = kw_iter.next() {
1316 self.unparse_arg(kw.as_arg());
1317 if let Some(default) = &kw.default {
1318 self.write_str("=");
1319 self.unparse_expr(default);
1320 }
1321 if kw_iter.peek().is_some() || node.kwarg.is_some() {
1322 self.write_str(", ");
1323 }
1324 }
1325
1326 if let Some(kwarg) = &node.kwarg {
1327 self.write_str("**");
1328 self.write_str(&kwarg.arg);
1329 if let Some(annotation) = &kwarg.annotation {
1330 self.write_str(": ");
1331 self.unparse_expr(&annotation);
1332 }
1333 }
1334 }
1335
1336 fn unparse_arg(&mut self, node: &Arg<TextRange>) {
1337 self.write_str(node.arg.as_str());
1338 if let Some(annotation) = &node.annotation {
1339 self.write_str(": ");
1340 self.unparse_expr(annotation);
1341 }
1342 }
1343
1344 fn unparse_keyword(&mut self, node: &Keyword<TextRange>) {
1345 if let Some(arg) = &node.arg {
1346 self.write_str(arg.as_str());
1347 self.write_str("=");
1348 } else {
1349 self.write_str("**");
1350 }
1351
1352 self.unparse_expr(&node.value);
1353 }
1354
1355 fn unparse_alias(&mut self, node: &Alias<TextRange>) {
1356 self.write_str(node.name.as_str());
1357 if node.asname.is_some() {
1358 self.write_str(&format!(" as {}", node.asname.as_ref().unwrap()));
1359 }
1360 }
1361
1362 fn unparse_withitem(&mut self, node: &WithItem<TextRange>) {
1363 self.unparse_expr(&node.context_expr);
1364 if let Some(var) = &node.optional_vars {
1365 self.write_str(" as ");
1366 self.unparse_expr(var);
1367 }
1368 }
1369
1370 fn unparse_match_case(&mut self, node: &MatchCase<TextRange>) {
1371 self.fill("case ");
1372 self.unparse_pattern(&node.pattern);
1373 if let Some(guard) = &node.guard {
1374 self.write_str(" if ");
1375 self.unparse_expr(&guard);
1376 }
1377 self.write_str(":");
1378 self.block(|block_self| {
1379 for stmt in &node.body {
1380 block_self.unparse_stmt(stmt);
1381 }
1382 });
1383 }
1384
1385 fn unparse_pattern(&mut self, node: &Pattern<TextRange>) {
1386 match node {
1387 Pattern::MatchValue(data) => self.unparse_pattern_match_value(data),
1388 Pattern::MatchSingleton(data) => self.unparse_pattern_match_singleton(data),
1389 Pattern::MatchSequence(data) => self.unparse_pattern_match_sequence(data),
1390 Pattern::MatchMapping(data) => self.unparse_pattern_match_mapping(data),
1391 Pattern::MatchClass(data) => self.unparse_pattern_match_class(data),
1392 Pattern::MatchStar(data) => self.unparse_pattern_match_star(data),
1393 Pattern::MatchAs(data) => self.unparse_pattern_match_as(data),
1394 Pattern::MatchOr(data) => self.unparse_pattern_match_or(data),
1395 }
1396 }
1397
1398 fn unparse_pattern_match_value(&mut self, node: &PatternMatchValue<TextRange>) {
1399 self.unparse_expr(&node.value)
1400 }
1401
1402 fn unparse_pattern_match_singleton(&mut self, node: &PatternMatchSingleton<TextRange>) {
1403 self._unparse_constant(&node.value);
1404 }
1405
1406 fn unparse_pattern_match_sequence(&mut self, node: &PatternMatchSequence<TextRange>) {
1407 let mut patterns_iter = node.patterns.iter().peekable();
1408 self.write_str("[");
1409 while let Some(pattern) = patterns_iter.next() {
1410 self.unparse_pattern(pattern);
1411 if patterns_iter.peek().is_some() {
1412 self.write_str(" , ");
1413 }
1414 }
1415 self.write_str("]");
1416 }
1417
1418 fn unparse_pattern_match_mapping(&mut self, node: &PatternMatchMapping<TextRange>) {
1419 let mut pairs_iter = node.keys.iter().zip(node.patterns.iter()).peekable();
1420 self.write_str("{");
1421 while let Some((key, pattern)) = pairs_iter.next() {
1422 self.unparse_expr(key);
1423 self.write_str(": ");
1424 self.unparse_pattern(pattern);
1425 if pairs_iter.peek().is_some() {
1426 self.write_str(", ");
1427 }
1428 }
1429 if let Some(rest) = &node.rest {
1430 if node.keys.len() > 0 {
1431 self.write_str(", ");
1432 }
1433 self.write_str("**");
1434 self.write_str(rest.as_str());
1435 }
1436
1437 self.write_str("}");
1438 }
1439
1440 fn unparse_pattern_match_class(&mut self, node: &PatternMatchClass<TextRange>) {
1441 let mut patterns_iter = node.patterns.iter().peekable();
1442 let mut kwd_iter = node
1443 .kwd_attrs
1444 .iter()
1445 .zip(node.kwd_patterns.iter())
1446 .peekable();
1447 self.unparse_expr(&node.cls);
1448 self.write_str("(");
1449 while let Some(pattern) = patterns_iter.next() {
1450 self.unparse_pattern(pattern);
1451 if patterns_iter.peek().is_some() || kwd_iter.peek().is_some() {
1452 self.write_str(", ");
1453 }
1454 }
1455 while let Some((attr, pattern)) = kwd_iter.next() {
1456 self.write_str(attr.as_str());
1457 self.write_str("=");
1458 self.unparse_pattern(pattern);
1459 if kwd_iter.peek().is_some() {
1460 self.write_str(", ");
1461 }
1462 }
1463
1464 self.write_str(")");
1465 }
1466
1467 fn unparse_pattern_match_star(&mut self, node: &PatternMatchStar<TextRange>) {
1468 let name = match &node.name {
1469 Some(name) => name.as_str(),
1470 None => "_",
1471 };
1472 self.write_str("*");
1473 self.write_str(name);
1474 }
1475
1476 fn unparse_pattern_match_as(&mut self, node: &PatternMatchAs<TextRange>) {
1477 match &node.name {
1478 Some(name) => match &node.pattern {
1479 Some(pattern) => {
1480 let with_parens = self.precedence_level > Precedence::Test.value();
1481 if with_parens {
1482 self.write_str("(");
1483 }
1484 self.with_precedence(Precedence::Bor, |prec_self| {
1485 prec_self.unparse_pattern(pattern);
1486 });
1487 self.write_str(" as ");
1488 self.write_str(name);
1489
1490 if with_parens {
1491 self.write_str(")");
1492 }
1493 }
1494 None => {
1495 self.write_str(name);
1496 }
1497 },
1498 None => {
1499 self.write_str("_");
1500 }
1501 };
1502 }
1503
1504 fn unparse_pattern_match_or(&mut self, node: &PatternMatchOr<TextRange>) {
1505 let mut patterns_iter = node.patterns.iter().peekable();
1506 while let Some(pattern) = patterns_iter.next() {
1507 self.unparse_pattern(pattern);
1508 if patterns_iter.peek().is_some() {
1509 self.write_str(" | ");
1510 }
1511 }
1512 }
1513
1514 fn unparse_type_param(&mut self, node: &TypeParam<TextRange>) {
1515 match node {
1516 TypeParam::TypeVar(data) => self.unparse_type_param_type_var(data),
1517 TypeParam::ParamSpec(data) => self.unparse_type_param_param_spec(data),
1518 TypeParam::TypeVarTuple(data) => self.unparse_type_param_type_var_tuple(data),
1519 }
1520 }
1521
1522 fn unparse_type_param_type_var(&mut self, node: &TypeParamTypeVar<TextRange>) {
1523 self.write_str(&node.name);
1524 if let Some(bound) = &node.bound {
1525 self.write_str(": ");
1526 self.unparse_expr(bound);
1527 }
1528 }
1529
1530 fn unparse_type_param_param_spec(&mut self, node: &TypeParamParamSpec<TextRange>) {
1531 self.write_str("**");
1532 self.write_str(&node.name);
1533 }
1534
1535 fn unparse_type_param_type_var_tuple(&mut self, node: &TypeParamTypeVarTuple<TextRange>) {
1536 self.write_str("*");
1537 self.write_str(&node.name);
1538 }
1539}