blob: 1345271e599b5c465a25e3a10a849f8942d679ec [file] [log] [blame]
Guido van Rossum95e4d582018-01-26 08:20:18 -08001#include <stdbool.h>
2#include "Python.h"
3#include "Python-ast.h"
4
5static PyObject *_str_open_br;
6static PyObject *_str_dbl_open_br;
7static PyObject *_str_close_br;
8static PyObject *_str_dbl_close_br;
9
10/* Forward declarations for recursion via helper functions. */
11static PyObject *
12expr_as_unicode(expr_ty e, bool omit_parens);
13static int
14append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens);
15static int
16append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
17static int
18append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec);
19
20static int
21append_charp(_PyUnicodeWriter *writer, const char *charp)
22{
Stéphane Wirtel83ab9952018-02-01 17:59:27 +010023 return _PyUnicodeWriter_WriteASCIIString(writer, charp, -1);
Guido van Rossum95e4d582018-01-26 08:20:18 -080024}
25
26static int
27append_repr(_PyUnicodeWriter *writer, PyObject *obj)
28{
29 int ret;
30 PyObject *repr;
31 repr = PyObject_Repr(obj);
32 if (!repr) {
33 return -1;
34 }
35 ret = _PyUnicodeWriter_WriteStr(writer, repr);
36 Py_DECREF(repr);
37 return ret;
38}
39
40static int
41append_ast_boolop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
42{
43 Py_ssize_t i, value_count;
44 asdl_seq *values;
45
46 if (!omit_parens && -1 == append_charp(writer, "(")) {
47 return -1;
48 }
49
50 values = e->v.BoolOp.values;
51 value_count = asdl_seq_LEN(values) - 1;
52 assert(value_count >= 0);
53
54 if (-1 == append_ast_expr(writer,
55 (expr_ty)asdl_seq_GET(values, 0),
56 false)) {
57 return -1;
58 }
59
60 const char *op = (e->v.BoolOp.op == And) ? " and " : " or ";
61 for (i = 1; i <= value_count; ++i) {
62 if (-1 == append_charp(writer, op)) {
63 return -1;
64 }
65
66 if (-1 == append_ast_expr(writer,
67 (expr_ty)asdl_seq_GET(values, i),
68 false)) {
69 return -1;
70 }
71 }
72
73 return omit_parens ? 0 : append_charp(writer, ")");
74}
75
76static int
77append_ast_binop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
78{
79 const char *op;
80
81 if (!omit_parens && -1 == append_charp(writer, "(")) {
82 return -1;
83 }
84
85 if (-1 == append_ast_expr(writer, e->v.BinOp.left, false)) {
86 return -1;
87 }
88
89 switch(e->v.BinOp.op) {
90 case Add: op = " + "; break;
91 case Sub: op = " - "; break;
92 case Mult: op = " * "; break;
93 case MatMult: op = " @ "; break;
94 case Div: op = " / "; break;
95 case Mod: op = " % "; break;
96 case LShift: op = " << "; break;
97 case RShift: op = " >> "; break;
98 case BitOr: op = " | "; break;
99 case BitXor: op = " ^ "; break;
100 case BitAnd: op = " & "; break;
101 case FloorDiv: op = " // "; break;
102 case Pow: op = " ** "; break;
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100103 default:
104 Py_UNREACHABLE();
Guido van Rossum95e4d582018-01-26 08:20:18 -0800105 }
106
107 if (-1 == append_charp(writer, op)) {
108 return -1;
109 }
110
111 if (-1 == append_ast_expr(writer, e->v.BinOp.right, false)) {
112 return -1;
113 }
114
115 return omit_parens ? 0 : append_charp(writer, ")");
116}
117
118static int
119append_ast_unaryop(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
120{
121 const char *op;
122
123 if (!omit_parens && -1 == append_charp(writer, "(")) {
124 return -1;
125 }
126
127 switch(e->v.UnaryOp.op) {
128 case Invert: op = "~"; break;
129 case Not: op = "not "; break;
130 case UAdd: op = "+"; break;
131 case USub: op = "-"; break;
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100132 default:
133 Py_UNREACHABLE();
Guido van Rossum95e4d582018-01-26 08:20:18 -0800134 }
135
136 if (-1 == append_charp(writer, op)) {
137 return -1;
138 }
139
140 if (-1 == append_ast_expr(writer, e->v.UnaryOp.operand, false)) {
141 return -1;
142 }
143
144 return omit_parens ? 0 : append_charp(writer, ")");
145}
146
147static int
148append_ast_arg(_PyUnicodeWriter *writer, arg_ty arg)
149{
150 if (-1 == _PyUnicodeWriter_WriteStr(writer, arg->arg)) {
151 return -1;
152 }
153 if (arg->annotation) {
154 if (-1 == append_charp(writer, ": ")) {
155 return -1;
156 }
157 if (-1 == append_ast_expr(writer, arg->annotation, true)) {
158 return -1;
159 }
160 }
161 return 0;
162}
163
164static int
165append_ast_args(_PyUnicodeWriter *writer, arguments_ty args)
166{
167 bool first;
168 Py_ssize_t i, di, arg_count, default_count;
169 arg_ty arg;
170 expr_ty default_;
171
172 first = true;
173
174 /* positional arguments with defaults */
175 arg_count = asdl_seq_LEN(args->args);
176 default_count = asdl_seq_LEN(args->defaults);
177 for (i = 0; i < arg_count; i++) {
178 if (first) {
179 first = false;
180 }
181 else if (-1 == append_charp(writer, ", ")) {
182 return -1;
183 }
184
185 arg = (arg_ty)asdl_seq_GET(args->args, i);
186 if (-1 == append_ast_arg(writer, arg)) {
187 return -1;
188 }
189
190 di = i - arg_count + default_count;
191 if (di >= 0) {
192 if (-1 == append_charp(writer, "=")) {
193 return -1;
194 }
195 default_ = (expr_ty)asdl_seq_GET(args->defaults, di);
196 if (-1 == append_ast_expr(writer, default_, false)) {
197 return -1;
198 }
199 }
200 }
201
202 /* vararg, or bare '*' if no varargs but keyword-only arguments present */
203 if (args->vararg || args->kwonlyargs) {
204 if (first) {
205 first = false;
206 }
207 else if (-1 == append_charp(writer, ", ")) {
208 return -1;
209 }
210
211 if (-1 == append_charp(writer, "*")) {
212 return -1;
213 }
214
215 if (args->vararg) {
216 if (-1 == append_ast_arg(writer, args->vararg)) {
217 return -1;
218 }
219 }
220 }
221
222 /* keyword-only arguments */
223 arg_count = asdl_seq_LEN(args->kwonlyargs);
224 default_count = asdl_seq_LEN(args->kw_defaults);
225 for (i = 0; i < arg_count; i++) {
226 if (first) {
227 first = false;
228 }
229 else if (-1 == append_charp(writer, ", ")) {
230 return -1;
231 }
232
233 arg = (arg_ty)asdl_seq_GET(args->kwonlyargs, i);
234 if (-1 == append_ast_arg(writer, arg)) {
235 return -1;
236 }
237
238 di = i - arg_count + default_count;
239 if (di >= 0) {
240 if (-1 == append_charp(writer, "=")) {
241 return -1;
242 }
243 default_ = (expr_ty)asdl_seq_GET(args->kw_defaults, di);
244 if (-1 == append_ast_expr(writer, default_, false)) {
245 return -1;
246 }
247 }
248 }
249
250 /* **kwargs */
251 if (args->kwarg) {
252 if (first) {
253 first = false;
254 }
255 else if (-1 == append_charp(writer, ", ")) {
256 return -1;
257 }
258
259 if (-1 == append_charp(writer, "**")) {
260 return -1;
261 }
262
263 if (-1 == append_ast_arg(writer, args->kwarg)) {
264 return -1;
265 }
266 }
267
268 return 0;
269}
270
271static int
272append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
273{
274 if (!omit_parens && -1 == append_charp(writer, "(")) {
275 return -1;
276 }
277
278 if (-1 == append_charp(writer, "lambda ")) {
279 return -1;
280 }
281
282 if (-1 == append_ast_args(writer, e->v.Lambda.args)) {
283 return -1;
284 }
285
286 if (-1 == append_charp(writer, ": ")) {
287 return -1;
288 }
289
290 if (-1 == append_ast_expr(writer, e->v.Lambda.body, true)) {
291 return -1;
292 }
293
294 return omit_parens ? 0 : append_charp(writer, ")");
295}
296
297static int
298append_ast_ifexp(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
299{
300 if (!omit_parens && -1 == append_charp(writer, "(")) {
301 return -1;
302 }
303
304 if (-1 == append_ast_expr(writer, e->v.IfExp.body, false)) {
305 return -1;
306 }
307
308 if (-1 == append_charp(writer, " if ")) {
309 return -1;
310 }
311
312 if (-1 == append_ast_expr(writer, e->v.IfExp.test, false)) {
313 return -1;
314 }
315
316 if (-1 == append_charp(writer, " else ")) {
317 return -1;
318 }
319
320 if (-1 == append_ast_expr(writer, e->v.IfExp.orelse, false)) {
321 return -1;
322 }
323
324 return omit_parens ? 0 : append_charp(writer, ")");
325}
326
327static int
328append_ast_dict(_PyUnicodeWriter *writer, expr_ty e)
329{
330 Py_ssize_t i, value_count;
331 expr_ty key_node, value_node;
332
333 if (-1 == append_charp(writer, "{")) {
334 return -1;
335 }
336
337 value_count = asdl_seq_LEN(e->v.Dict.values);
338
339 for (i = 0; i < value_count; i++) {
340 if (i > 0 && -1 == append_charp(writer, ", ")) {
341 return -1;
342 }
343 key_node = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i);
344 if (key_node != NULL) {
345 if (-1 == append_ast_expr(writer, key_node, false)) {
346 return -1;
347 }
348
349 if (-1 == append_charp(writer, ": ")) {
350 return -1;
351 }
352 }
353 else if (-1 == append_charp(writer, "**")) {
354 return -1;
355 }
356
357 value_node = (expr_ty)asdl_seq_GET(e->v.Dict.values, i);
358 if (-1 == append_ast_expr(writer, value_node, false)) {
359 return -1;
360 }
361 }
362
363 return append_charp(writer, "}");
364}
365
366static int
367append_ast_set(_PyUnicodeWriter *writer, expr_ty e)
368{
369 Py_ssize_t i, elem_count;
370 expr_ty elem_node;
371
372 if (-1 == append_charp(writer, "{")) {
373 return -1;
374 }
375
376 elem_count = asdl_seq_LEN(e->v.Set.elts);
377 for (i = 0; i < elem_count; i++) {
378 if (i > 0 && -1 == append_charp(writer, ", ")) {
379 return -1;
380 }
381
382 elem_node = (expr_ty)asdl_seq_GET(e->v.Set.elts, i);
383 if (-1 == append_ast_expr(writer, elem_node, false)) {
384 return -1;
385 }
386 }
387
388 return append_charp(writer, "}");
389}
390
391static int
392append_ast_list(_PyUnicodeWriter *writer, expr_ty e)
393{
394 Py_ssize_t i, elem_count;
395 expr_ty elem_node;
396
397 if (-1 == append_charp(writer, "[")) {
398 return -1;
399 }
400
401 elem_count = asdl_seq_LEN(e->v.List.elts);
402 for (i = 0; i < elem_count; i++) {
403 if (i > 0 && -1 == append_charp(writer, ", ")) {
404 return -1;
405 }
406 elem_node = (expr_ty)asdl_seq_GET(e->v.List.elts, i);
407 if (-1 == append_ast_expr(writer, elem_node, false)) {
408 return -1;
409 }
410 }
411
412 return append_charp(writer, "]");
413}
414
415static int
416append_ast_tuple(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
417{
418 Py_ssize_t i, elem_count;
419 expr_ty elem_node;
420
421 elem_count = asdl_seq_LEN(e->v.Tuple.elts);
422
423 if (!omit_parens || elem_count < 2) {
424 if (-1 == append_charp(writer, "(")) {
425 return -1;
426 }
427 }
428
429 for (i = 0; i < elem_count; i++) {
430 if ((i > 0 || elem_count == 1) && -1 == append_charp(writer, ", ")) {
431 return -1;
432 }
433 elem_node = (expr_ty)asdl_seq_GET(e->v.Tuple.elts, i);
434 if (-1 == append_ast_expr(writer, elem_node, false)) {
435 return -1;
436 }
437 }
438
439 if (!omit_parens || elem_count < 2) {
440 return append_charp(writer, ")");
441 }
442
443 return 0;
444}
445
446static int
447append_ast_comprehension(_PyUnicodeWriter *writer, comprehension_ty gen)
448{
449 Py_ssize_t i, if_count;
450
451 if (-1 == append_charp(writer, gen->is_async ? " async for " : " for ")) {
452 return -1;
453 }
454
455 if (-1 == append_ast_expr(writer, gen->target, true)) {
456 return -1;
457 }
458
459 if (-1 == append_charp(writer, " in ")) {
460 return -1;
461 }
462
463 if (-1 == append_ast_expr(writer, gen->iter, false)) {
464 return -1;
465 }
466
467 if_count = asdl_seq_LEN(gen->ifs);
468 for (i = 0; i < if_count; i++) {
469 if (-1 == append_charp(writer, " if ")) {
470 return -1;
471 }
472
473 if (-1 == append_ast_expr(writer,
474 (expr_ty)asdl_seq_GET(gen->ifs, i),
475 false)) {
476 return -1;
477 }
478 }
479 return 0;
480}
481
482static int
483append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_seq *comprehensions)
484{
485 Py_ssize_t i, gen_count;
486 comprehension_ty comp_node;
487 gen_count = asdl_seq_LEN(comprehensions);
488
489 for (i = 0; i < gen_count; i++) {
490 comp_node = (comprehension_ty)asdl_seq_GET(comprehensions, i);
491 if (-1 == append_ast_comprehension(writer, comp_node)) {
492 return -1;
493 }
494 }
495
496 return 0;
497}
498
499static int
500append_ast_genexp(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
501{
502 if (!omit_parens && -1 == append_charp(writer, "(")) {
503 return -1;
504 }
505
506 if (-1 == append_ast_expr(writer, e->v.GeneratorExp.elt, false)) {
507 return -1;
508 }
509
510 if (-1 == append_ast_comprehensions(writer, e->v.GeneratorExp.generators)) {
511 return -1;
512 }
513
514 return omit_parens ? 0 : append_charp(writer, ")");
515}
516
517static int
518append_ast_listcomp(_PyUnicodeWriter *writer, expr_ty e)
519{
520 if (-1 == append_charp(writer, "[")) {
521 return -1;
522 }
523
524 if (-1 == append_ast_expr(writer, e->v.ListComp.elt, false)) {
525 return -1;
526 }
527
528 if (-1 == append_ast_comprehensions(writer, e->v.ListComp.generators)) {
529 return -1;
530 }
531
532 return append_charp(writer, "]");
533}
534
535static int
536append_ast_setcomp(_PyUnicodeWriter *writer, expr_ty e)
537{
538 if (-1 == append_charp(writer, "{")) {
539 return -1;
540 }
541
542 if (-1 == append_ast_expr(writer, e->v.SetComp.elt, false)) {
543 return -1;
544 }
545
546 if (-1 == append_ast_comprehensions(writer, e->v.SetComp.generators)) {
547 return -1;
548 }
549
550 return append_charp(writer, "}");
551}
552
553static int
554append_ast_dictcomp(_PyUnicodeWriter *writer, expr_ty e)
555{
556 if (-1 == append_charp(writer, "{")) {
557 return -1;
558 }
559
560 if (-1 == append_ast_expr(writer, e->v.DictComp.key, false)) {
561 return -1;
562 }
563
564 if (-1 == append_charp(writer, ": ")) {
565 return -1;
566 }
567
568 if (-1 == append_ast_expr(writer, e->v.DictComp.value, false)) {
569 return -1;
570 }
571
572 if (-1 == append_ast_comprehensions(writer, e->v.DictComp.generators)) {
573 return -1;
574 }
575
576 return append_charp(writer, "}");
577}
578
579static int
580append_ast_compare(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
581{
582 const char *op;
583 Py_ssize_t i, comparator_count;
584 asdl_seq *comparators;
585 asdl_int_seq *ops;
586
587 if (!omit_parens && -1 == append_charp(writer, "(")) {
588 return -1;
589 }
590
591 comparators = e->v.Compare.comparators;
592 ops = e->v.Compare.ops;
593 comparator_count = asdl_seq_LEN(comparators);
594 assert(comparator_count > 0);
595 assert(comparator_count == asdl_seq_LEN(ops));
596
597 if (-1 == append_ast_expr(writer, e->v.Compare.left, false)) {
598 return -1;
599 }
600
601 for (i = 0; i < comparator_count; i++) {
602 switch ((cmpop_ty)asdl_seq_GET(ops, i)) {
603 case Eq:
604 op = " == ";
605 break;
606 case NotEq:
607 op = " != ";
608 break;
609 case Lt:
610 op = " < ";
611 break;
612 case LtE:
613 op = " <= ";
614 break;
615 case Gt:
616 op = " > ";
617 break;
618 case GtE:
619 op = " >= ";
620 break;
621 case Is:
622 op = " is ";
623 break;
624 case IsNot:
625 op = " is not ";
626 break;
627 case In:
628 op = " in ";
629 break;
630 case NotIn:
631 op = " not in ";
632 break;
633 default:
634 PyErr_SetString(PyExc_SystemError,
635 "unexpected comparison kind");
636 return -1;
637 }
638
639 if (-1 == append_charp(writer, op)) {
640 return -1;
641 }
642
643 if (-1 == append_ast_expr(writer,
644 (expr_ty)asdl_seq_GET(comparators, i),
645 false)) {
646 return -1;
647 }
648 }
649
650 return omit_parens ? 0 : append_charp(writer, ")");
651}
652
653static int
654append_ast_keyword(_PyUnicodeWriter *writer, keyword_ty kw)
655{
656 if (kw->arg == NULL) {
657 if (-1 == append_charp(writer, "**")) {
658 return -1;
659 }
660 }
661 else {
662 if (-1 == _PyUnicodeWriter_WriteStr(writer, kw->arg)) {
663 return -1;
664 }
665
666 if (-1 == append_charp(writer, "=")) {
667 return -1;
668 }
669 }
670
671 return append_ast_expr(writer, kw->value, false);
672}
673
674static int
675append_ast_call(_PyUnicodeWriter *writer, expr_ty e)
676{
677 bool first;
678 Py_ssize_t i, arg_count, kw_count;
679 expr_ty expr;
680 keyword_ty kw;
681
682 if (-1 == append_ast_expr(writer, e->v.Call.func, false)) {
683 return -1;
684 }
685
686 if (-1 == append_charp(writer, "(")) {
687 return -1;
688 }
689
690 first = true;
691 arg_count = asdl_seq_LEN(e->v.Call.args);
692 for (i = 0; i < arg_count; i++) {
693 if (first) {
694 first = false;
695 }
696 else if (-1 == append_charp(writer, ", ")) {
697 return -1;
698 }
699
700 expr = (expr_ty)asdl_seq_GET(e->v.Call.args, i);
701 if (-1 == append_ast_expr(writer, expr, false)) {
702 return -1;
703 }
704 }
705
706 kw_count = asdl_seq_LEN(e->v.Call.keywords);
707 for (i = 0; i < kw_count; i++) {
708 if (first) {
709 first = false;
710 }
711 else if (-1 == append_charp(writer, ", ")) {
712 return -1;
713 }
714
715 kw = (keyword_ty)asdl_seq_GET(e->v.Call.keywords, i);
716 if (-1 == append_ast_keyword(writer, kw)) {
717 return -1;
718 }
719 }
720
721 return append_charp(writer, ")");
722}
723
724static PyObject *
725escape_braces(PyObject *orig)
726{
727 PyObject *temp;
728 PyObject *result;
729 temp = PyUnicode_Replace(orig, _str_open_br, _str_dbl_open_br, -1);
730 if (!temp) {
731 return NULL;
732 }
733 result = PyUnicode_Replace(temp, _str_close_br, _str_dbl_close_br, -1);
734 Py_DECREF(temp);
735 return result;
736}
737
738static int
739append_fstring_unicode(_PyUnicodeWriter *writer, PyObject *unicode)
740{
741 PyObject *escaped;
742 int result = -1;
743 escaped = escape_braces(unicode);
744 if (escaped) {
745 result = _PyUnicodeWriter_WriteStr(writer, escaped);
746 Py_DECREF(escaped);
747 }
748 return result;
749}
750
751static int
752append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
753{
754 switch (e->kind) {
755 case Constant_kind:
756 return append_fstring_unicode(writer, e->v.Constant.value);
757 case Str_kind:
758 return append_fstring_unicode(writer, e->v.Str.s);
759 case JoinedStr_kind:
760 return append_joinedstr(writer, e, is_format_spec);
761 case FormattedValue_kind:
762 return append_formattedvalue(writer, e, is_format_spec);
763 default:
764 PyErr_SetString(PyExc_SystemError,
765 "unknown expression kind inside f-string");
766 return -1;
767 }
768}
769
770/* Build body separately to enable wrapping the entire stream of Strs,
771 Constants and FormattedValues in one opening and one closing quote. */
772static PyObject *
773build_fstring_body(asdl_seq *values, bool is_format_spec)
774{
775 Py_ssize_t i, value_count;
776 _PyUnicodeWriter body_writer;
777 _PyUnicodeWriter_Init(&body_writer);
778 body_writer.min_length = 256;
779 body_writer.overallocate = 1;
780
781 value_count = asdl_seq_LEN(values) - 1;
782 assert(value_count >= 0);
783 for (i = 0; i <= value_count; ++i) {
784 if (-1 == append_fstring_element(&body_writer,
785 (expr_ty)asdl_seq_GET(values, i),
786 is_format_spec
787 )) {
788 _PyUnicodeWriter_Dealloc(&body_writer);
789 return NULL;
790 }
791 }
792
793 return _PyUnicodeWriter_Finish(&body_writer);
794}
795
796static int
797append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
798{
799 int result = -1;
800 PyObject *body = build_fstring_body(e->v.JoinedStr.values, is_format_spec);
801 if (!body) {
802 return -1;
803 }
804
805 if (!is_format_spec) {
806 if (-1 != append_charp(writer, "f") &&
807 -1 != append_repr(writer, body))
808 {
809 result = 0;
810 }
811 }
812 else {
813 result = _PyUnicodeWriter_WriteStr(writer, body);
814 }
815 Py_DECREF(body);
816 return result;
817}
818
819static int
820append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
821{
822 char *conversion;
823 char *outer_brace = "{";
824 PyObject *temp_fv_str = expr_as_unicode(e->v.FormattedValue.value, true);
825 if (!temp_fv_str) {
826 return -1;
827 }
828 if (PyUnicode_Find(temp_fv_str, _str_open_br, 0, 1, 1) == 0) {
829 /* Expression starts with a brace, split it with a space from the outer
830 one. */
831 outer_brace = "{ ";
832 }
833 if (-1 == append_charp(writer, outer_brace)) {
834 Py_DECREF(temp_fv_str);
835 return -1;
836 }
837 if (-1 == _PyUnicodeWriter_WriteStr(writer, temp_fv_str)) {
838 Py_DECREF(temp_fv_str);
839 return -1;
840 }
841 Py_DECREF(temp_fv_str);
842
843 if (e->v.FormattedValue.conversion > 0) {
844 switch (e->v.FormattedValue.conversion) {
845 case 97:
846 conversion = "!a";
847 break;
848 case 114:
849 conversion = "!r";
850 break;
851 case 115:
852 conversion = "!s";
853 break;
854 default:
855 PyErr_SetString(PyExc_SystemError,
856 "unknown f-value conversion kind");
857 return -1;
858 }
859 if (-1 == append_charp(writer, conversion)) {
860 return -1;
861 }
862 }
Stéphane Wirtel83ab9952018-02-01 17:59:27 +0100863 if (e->v.FormattedValue.format_spec) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800864 if (-1 == _PyUnicodeWriter_WriteASCIIString(writer, ":", 1) ||
865 -1 == append_fstring_element(writer,
866 e->v.FormattedValue.format_spec,
867 true
868 ))
869 {
870 return -1;
871 }
872 }
873 return append_charp(writer, "}");
874}
875
876static int
877append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e)
878{
879 const char *period;
880 if (-1 == append_ast_expr(writer, e->v.Attribute.value, false)) {
881 return -1;
882 }
883
884 /* Special case: integers require a space for attribute access to be
885 unambiguous. Floats and complex numbers don't but work with it, too. */
886 if (e->v.Attribute.value->kind == Num_kind ||
887 e->v.Attribute.value->kind == Constant_kind)
888 {
889 period = " .";
890 }
891 else {
892 period = ".";
893 }
894 if (-1 == append_charp(writer, period)) {
895 return -1;
896 }
897
898 return _PyUnicodeWriter_WriteStr(writer, e->v.Attribute.attr);
899}
900
901static int
902append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice)
903{
904 if (slice->v.Slice.lower) {
905 if (-1 == append_ast_expr(writer, slice->v.Slice.lower, false)) {
906 return -1;
907 }
908 }
909
910 if (-1 == append_charp(writer, ":")) {
911 return -1;
912 }
913
914 if (slice->v.Slice.upper) {
915 if (-1 == append_ast_expr(writer, slice->v.Slice.upper, false)) {
916 return -1;
917 }
918 }
919
920 if (slice->v.Slice.step) {
921 if (-1 == append_charp(writer, ":")) {
922 return -1;
923 }
924 if (-1 == append_ast_expr(writer, slice->v.Slice.step, false)) {
925 return -1;
926 }
927 }
928 return 0;
929}
930
931static int
932append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice)
933{
934 Py_ssize_t i, dims_count;
935 dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims);
936 for (i = 0; i < dims_count; i++) {
937 if (i > 0 && -1 == append_charp(writer, ", ")) {
938 return -1;
939 }
940 if (-1 == append_ast_expr(writer,
941 (expr_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i),
942 false)) {
943 return -1;
944 }
945 }
946 return 0;
947}
948
949static int
950append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice, bool omit_parens)
951{
952 switch(slice->kind) {
953 case Slice_kind:
954 return append_ast_simple_slice(writer, slice);
955 case ExtSlice_kind:
956 return append_ast_ext_slice(writer, slice);
957 case Index_kind:
958 return append_ast_expr(writer, slice->v.Index.value, omit_parens);
959 default:
960 PyErr_SetString(PyExc_SystemError,
961 "unexpected slice kind");
962 return -1;
963 }
964}
965
966static int
967append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e)
968{
969 if (-1 == append_ast_expr(writer, e->v.Subscript.value, false)) {
970 return -1;
971 }
972
973 if (-1 == append_charp(writer, "[")) {
974 return -1;
975 }
976
977 if (-1 == append_ast_slice(writer, e->v.Subscript.slice, true)) {
978 return -1;
979 }
980
981 return append_charp(writer, "]");
982}
983
984static int
985append_ast_starred(_PyUnicodeWriter *writer, expr_ty e)
986{
987 if (-1 == append_charp(writer, "*")) {
988 return -1;
989 }
990
991 return append_ast_expr(writer, e->v.Starred.value, false);
992}
993
994static int
995append_ast_yield(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
996{
997 if (!omit_parens && -1 == append_charp(writer, "(")) {
998 return -1;
999 }
1000
1001 if (-1 == append_charp(writer, e->v.Yield.value ? "yield " : "yield")) {
1002 return -1;
1003 }
1004
1005 if (e->v.Yield.value) {
1006 if (-1 == append_ast_expr(writer, e->v.Yield.value, false)) {
1007 return -1;
1008 }
1009 }
1010 return omit_parens ? 0 : append_charp(writer, ")");
1011}
1012
1013static int
1014append_ast_yield_from(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
1015{
1016 if (!omit_parens && -1 == append_charp(writer, "(")) {
1017 return -1;
1018 }
1019
1020 if (-1 == append_charp(writer,
1021 e->v.YieldFrom.value ? "yield from " : "yield from")) {
1022 return -1;
1023 }
1024
1025 if (e->v.YieldFrom.value) {
1026 if (-1 == append_ast_expr(writer, e->v.YieldFrom.value, false)) {
1027 return -1;
1028 }
1029 }
1030 return omit_parens ? 0 : append_charp(writer, ")");
1031}
1032
1033static int
1034append_ast_await(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
1035{
1036 if (!omit_parens && -1 == append_charp(writer, "(")) {
1037 return -1;
1038 }
1039
1040 if (-1 == append_charp(writer, e->v.Await.value ? "await " : "await")) {
1041 return -1;
1042 }
1043
1044 if (e->v.Await.value) {
1045 if (-1 == append_ast_expr(writer, e->v.Await.value, false)) {
1046 return -1;
1047 }
1048 }
1049 return omit_parens ? 0 : append_charp(writer, ")");
1050}
1051
1052static int
1053append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, bool omit_parens)
1054{
1055 switch (e->kind) {
1056 case BoolOp_kind:
1057 return append_ast_boolop(writer, e, omit_parens);
1058 case BinOp_kind:
1059 return append_ast_binop(writer, e, omit_parens);
1060 case UnaryOp_kind:
1061 return append_ast_unaryop(writer, e, omit_parens);
1062 case Lambda_kind:
1063 return append_ast_lambda(writer, e, omit_parens);
1064 case IfExp_kind:
1065 return append_ast_ifexp(writer, e, omit_parens);
1066 case Dict_kind:
1067 return append_ast_dict(writer, e);
1068 case Set_kind:
1069 return append_ast_set(writer, e);
1070 case GeneratorExp_kind:
1071 return append_ast_genexp(writer, e, omit_parens);
1072 case ListComp_kind:
1073 return append_ast_listcomp(writer, e);
1074 case SetComp_kind:
1075 return append_ast_setcomp(writer, e);
1076 case DictComp_kind:
1077 return append_ast_dictcomp(writer, e);
1078 case Yield_kind:
1079 return append_ast_yield(writer, e, omit_parens);
1080 case YieldFrom_kind:
1081 return append_ast_yield_from(writer, e, omit_parens);
1082 case Await_kind:
1083 return append_ast_await(writer, e, omit_parens);
1084 case Compare_kind:
1085 return append_ast_compare(writer, e, omit_parens);
1086 case Call_kind:
1087 return append_ast_call(writer, e);
1088 case Constant_kind:
1089 return append_repr(writer, e->v.Constant.value);
1090 case Num_kind:
1091 return append_repr(writer, e->v.Num.n);
1092 case Str_kind:
1093 return append_repr(writer, e->v.Str.s);
1094 case JoinedStr_kind:
1095 return append_joinedstr(writer, e, false);
1096 case FormattedValue_kind:
1097 return append_formattedvalue(writer, e, false);
1098 case Bytes_kind:
1099 return append_repr(writer, e->v.Bytes.s);
1100 case Ellipsis_kind:
1101 return append_charp(writer, "...");
1102 case NameConstant_kind:
1103 return append_repr(writer, e->v.NameConstant.value);
1104 /* The following exprs can be assignment targets. */
1105 case Attribute_kind:
1106 return append_ast_attribute(writer, e);
1107 case Subscript_kind:
1108 return append_ast_subscript(writer, e);
1109 case Starred_kind:
1110 return append_ast_starred(writer, e);
1111 case Name_kind:
1112 return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id);
1113 /* child nodes of List and Tuple will have expr_context set */
1114 case List_kind:
1115 return append_ast_list(writer, e);
1116 case Tuple_kind:
1117 return append_ast_tuple(writer, e, omit_parens);
1118 default:
1119 PyErr_SetString(PyExc_SystemError,
1120 "unknown expression kind");
1121 return -1;
1122 }
1123}
1124
1125static int
Stéphane Wirtel83ab9952018-02-01 17:59:27 +01001126maybe_init_static_strings(void)
Guido van Rossum95e4d582018-01-26 08:20:18 -08001127{
1128 if (!_str_open_br &&
1129 !(_str_open_br = PyUnicode_InternFromString("{"))) {
1130 return -1;
1131 }
1132 if (!_str_dbl_open_br &&
1133 !(_str_dbl_open_br = PyUnicode_InternFromString("{{"))) {
1134 return -1;
1135 }
1136 if (!_str_close_br &&
1137 !(_str_close_br = PyUnicode_InternFromString("}"))) {
1138 return -1;
1139 }
1140 if (!_str_dbl_close_br &&
1141 !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) {
1142 return -1;
1143 }
1144 return 0;
1145}
1146
1147static PyObject *
1148expr_as_unicode(expr_ty e, bool omit_parens)
1149{
1150 _PyUnicodeWriter writer;
1151 _PyUnicodeWriter_Init(&writer);
1152 writer.min_length = 256;
1153 writer.overallocate = 1;
1154 if (-1 == maybe_init_static_strings() ||
1155 -1 == append_ast_expr(&writer, e, omit_parens))
1156 {
1157 _PyUnicodeWriter_Dealloc(&writer);
1158 return NULL;
1159 }
1160 return _PyUnicodeWriter_Finish(&writer);
1161}
1162
1163PyObject *
1164_PyAST_ExprAsUnicode(expr_ty e, bool omit_parens)
1165{
1166 return expr_as_unicode(e, omit_parens);
1167}