blob: 43453f567b05a151eed9fce2b178a06bbe2fa015 [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 *
Serhiy Storchakab32f8892018-05-20 18:06:08 +030012expr_as_unicode(expr_ty e, int level);
Guido van Rossum95e4d582018-01-26 08:20:18 -080013static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +030014append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level);
Guido van Rossum95e4d582018-01-26 08:20:18 -080015static 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);
Serhiy Storchakab32f8892018-05-20 18:06:08 +030019static int
20append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice);
Guido van Rossum95e4d582018-01-26 08:20:18 -080021
22static int
23append_charp(_PyUnicodeWriter *writer, const char *charp)
24{
Miss Islington (bot)78758f22018-02-01 09:41:24 -080025 return _PyUnicodeWriter_WriteASCIIString(writer, charp, -1);
Guido van Rossum95e4d582018-01-26 08:20:18 -080026}
27
Serhiy Storchakab32f8892018-05-20 18:06:08 +030028#define APPEND_STR_FINISH(str) do { \
29 return append_charp(writer, (str)); \
30 } while (0)
31
32#define APPEND_STR(str) do { \
33 if (-1 == append_charp(writer, (str))) { \
34 return -1; \
35 } \
36 } while (0)
37
38#define APPEND_STR_IF(cond, str) do { \
39 if ((cond) && -1 == append_charp(writer, (str))) { \
40 return -1; \
41 } \
42 } while (0)
43
44#define APPEND_STR_IF_NOT_FIRST(str) do { \
45 APPEND_STR_IF(!first, (str)); \
46 first = false; \
47 } while (0)
48
49#define APPEND_EXPR(expr, pr) do { \
50 if (-1 == append_ast_expr(writer, (expr), (pr))) { \
51 return -1; \
52 } \
53 } while (0)
54
55#define APPEND(type, value) do { \
56 if (-1 == append_ast_ ## type(writer, (value))) { \
57 return -1; \
58 } \
59 } while (0)
60
Guido van Rossum95e4d582018-01-26 08:20:18 -080061static int
62append_repr(_PyUnicodeWriter *writer, PyObject *obj)
63{
64 int ret;
65 PyObject *repr;
66 repr = PyObject_Repr(obj);
67 if (!repr) {
68 return -1;
69 }
70 ret = _PyUnicodeWriter_WriteStr(writer, repr);
71 Py_DECREF(repr);
72 return ret;
73}
74
Serhiy Storchakab32f8892018-05-20 18:06:08 +030075/* Priority levels */
76
77enum {
78 PR_TUPLE,
79 PR_TEST, /* 'if'-'else', 'lambda' */
80 PR_OR, /* 'or' */
81 PR_AND, /* 'and' */
82 PR_NOT, /* 'not' */
83 PR_CMP, /* '<', '>', '==', '>=', '<=', '!=',
84 'in', 'not in', 'is', 'is not' */
85 PR_EXPR,
86 PR_BOR = PR_EXPR, /* '|' */
87 PR_BXOR, /* '^' */
88 PR_BAND, /* '&' */
89 PR_SHIFT, /* '<<', '>>' */
90 PR_ARITH, /* '+', '-' */
91 PR_TERM, /* '*', '@', '/', '%', '//' */
92 PR_FACTOR, /* unary '+', '-', '~' */
93 PR_POWER, /* '**' */
94 PR_AWAIT, /* 'await' */
95 PR_ATOM,
96};
97
Guido van Rossum95e4d582018-01-26 08:20:18 -080098static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +030099append_ast_boolop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800100{
101 Py_ssize_t i, value_count;
102 asdl_seq *values;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300103 const char *op = (e->v.BoolOp.op == And) ? " and " : " or ";
104 int pr = (e->v.BoolOp.op == And) ? PR_AND : PR_OR;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800105
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300106 APPEND_STR_IF(level > pr, "(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800107
108 values = e->v.BoolOp.values;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300109 value_count = asdl_seq_LEN(values);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800110
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300111 for (i = 0; i < value_count; ++i) {
112 APPEND_STR_IF(i > 0, op);
113 APPEND_EXPR((expr_ty)asdl_seq_GET(values, i), pr + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800114 }
115
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300116 APPEND_STR_IF(level > pr, ")");
117 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800118}
119
120static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300121append_ast_binop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800122{
123 const char *op;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300124 int pr;
125 bool rassoc = false; /* is right-associative? */
Guido van Rossum95e4d582018-01-26 08:20:18 -0800126
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300127 switch (e->v.BinOp.op) {
128 case Add: op = " + "; pr = PR_ARITH; break;
129 case Sub: op = " - "; pr = PR_ARITH; break;
130 case Mult: op = " * "; pr = PR_TERM; break;
131 case MatMult: op = " @ "; pr = PR_TERM; break;
132 case Div: op = " / "; pr = PR_TERM; break;
133 case Mod: op = " % "; pr = PR_TERM; break;
134 case LShift: op = " << "; pr = PR_SHIFT; break;
135 case RShift: op = " >> "; pr = PR_SHIFT; break;
136 case BitOr: op = " | "; pr = PR_BOR; break;
137 case BitXor: op = " ^ "; pr = PR_BXOR; break;
138 case BitAnd: op = " & "; pr = PR_BAND; break;
139 case FloorDiv: op = " // "; pr = PR_TERM; break;
140 case Pow: op = " ** "; pr = PR_POWER; rassoc = true; break;
Miss Islington (bot)78758f22018-02-01 09:41:24 -0800141 default:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300142 PyErr_SetString(PyExc_SystemError,
143 "unknown binary operator");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800144 return -1;
145 }
146
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300147 APPEND_STR_IF(level > pr, "(");
148 APPEND_EXPR(e->v.BinOp.left, pr + rassoc);
149 APPEND_STR(op);
150 APPEND_EXPR(e->v.BinOp.right, pr + !rassoc);
151 APPEND_STR_IF(level > pr, ")");
152 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800153}
154
155static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300156append_ast_unaryop(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800157{
158 const char *op;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300159 int pr;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800160
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300161 switch (e->v.UnaryOp.op) {
162 case Invert: op = "~"; pr = PR_FACTOR; break;
163 case Not: op = "not "; pr = PR_NOT; break;
164 case UAdd: op = "+"; pr = PR_FACTOR; break;
165 case USub: op = "-"; pr = PR_FACTOR; break;
Miss Islington (bot)78758f22018-02-01 09:41:24 -0800166 default:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300167 PyErr_SetString(PyExc_SystemError,
168 "unknown unary operator");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800169 return -1;
170 }
171
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300172 APPEND_STR_IF(level > pr, "(");
173 APPEND_STR(op);
174 APPEND_EXPR(e->v.UnaryOp.operand, pr);
175 APPEND_STR_IF(level > pr, ")");
176 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800177}
178
179static int
180append_ast_arg(_PyUnicodeWriter *writer, arg_ty arg)
181{
182 if (-1 == _PyUnicodeWriter_WriteStr(writer, arg->arg)) {
183 return -1;
184 }
185 if (arg->annotation) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300186 APPEND_STR(": ");
187 APPEND_EXPR(arg->annotation, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800188 }
189 return 0;
190}
191
192static int
193append_ast_args(_PyUnicodeWriter *writer, arguments_ty args)
194{
195 bool first;
196 Py_ssize_t i, di, arg_count, default_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800197
198 first = true;
199
200 /* positional arguments with defaults */
201 arg_count = asdl_seq_LEN(args->args);
202 default_count = asdl_seq_LEN(args->defaults);
203 for (i = 0; i < arg_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300204 APPEND_STR_IF_NOT_FIRST(", ");
205 APPEND(arg, (arg_ty)asdl_seq_GET(args->args, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800206
207 di = i - arg_count + default_count;
208 if (di >= 0) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300209 APPEND_STR("=");
210 APPEND_EXPR((expr_ty)asdl_seq_GET(args->defaults, di), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800211 }
212 }
213
214 /* vararg, or bare '*' if no varargs but keyword-only arguments present */
Miss Islington (bot)0f161b32018-09-30 11:19:15 -0700215 if (args->vararg || asdl_seq_LEN(args->kwonlyargs)) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300216 APPEND_STR_IF_NOT_FIRST(", ");
217 APPEND_STR("*");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800218 if (args->vararg) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300219 APPEND(arg, args->vararg);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800220 }
221 }
222
223 /* keyword-only arguments */
224 arg_count = asdl_seq_LEN(args->kwonlyargs);
225 default_count = asdl_seq_LEN(args->kw_defaults);
226 for (i = 0; i < arg_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300227 APPEND_STR_IF_NOT_FIRST(", ");
228 APPEND(arg, (arg_ty)asdl_seq_GET(args->kwonlyargs, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800229
230 di = i - arg_count + default_count;
231 if (di >= 0) {
Miss Islington (bot)0f161b32018-09-30 11:19:15 -0700232 expr_ty default_ = (expr_ty)asdl_seq_GET(args->kw_defaults, di);
233 if (default_) {
234 APPEND_STR("=");
235 APPEND_EXPR(default_, PR_TEST);
236 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800237 }
238 }
239
240 /* **kwargs */
241 if (args->kwarg) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300242 APPEND_STR_IF_NOT_FIRST(", ");
243 APPEND_STR("**");
244 APPEND(arg, args->kwarg);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800245 }
246
247 return 0;
248}
249
250static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300251append_ast_lambda(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800252{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300253 APPEND_STR_IF(level > PR_TEST, "(");
Miss Islington (bot)0f161b32018-09-30 11:19:15 -0700254 APPEND_STR(asdl_seq_LEN(e->v.Lambda.args->args) ? "lambda " : "lambda");
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300255 APPEND(args, e->v.Lambda.args);
256 APPEND_STR(": ");
257 APPEND_EXPR(e->v.Lambda.body, PR_TEST);
258 APPEND_STR_IF(level > PR_TEST, ")");
259 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800260}
261
262static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300263append_ast_ifexp(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800264{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300265 APPEND_STR_IF(level > PR_TEST, "(");
266 APPEND_EXPR(e->v.IfExp.body, PR_TEST + 1);
267 APPEND_STR(" if ");
268 APPEND_EXPR(e->v.IfExp.test, PR_TEST + 1);
269 APPEND_STR(" else ");
270 APPEND_EXPR(e->v.IfExp.orelse, PR_TEST);
271 APPEND_STR_IF(level > PR_TEST, ")");
272 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800273}
274
275static int
276append_ast_dict(_PyUnicodeWriter *writer, expr_ty e)
277{
278 Py_ssize_t i, value_count;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300279 expr_ty key_node;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800280
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300281 APPEND_STR("{");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800282 value_count = asdl_seq_LEN(e->v.Dict.values);
283
284 for (i = 0; i < value_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300285 APPEND_STR_IF(i > 0, ", ");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800286 key_node = (expr_ty)asdl_seq_GET(e->v.Dict.keys, i);
287 if (key_node != NULL) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300288 APPEND_EXPR(key_node, PR_TEST);
289 APPEND_STR(": ");
290 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Dict.values, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800291 }
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300292 else {
293 APPEND_STR("**");
294 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Dict.values, i), PR_EXPR);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800295 }
296 }
297
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300298 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800299}
300
301static int
302append_ast_set(_PyUnicodeWriter *writer, expr_ty e)
303{
304 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800305
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300306 APPEND_STR("{");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800307 elem_count = asdl_seq_LEN(e->v.Set.elts);
308 for (i = 0; i < elem_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300309 APPEND_STR_IF(i > 0, ", ");
310 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Set.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800311 }
312
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300313 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800314}
315
316static int
317append_ast_list(_PyUnicodeWriter *writer, expr_ty e)
318{
319 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800320
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300321 APPEND_STR("[");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800322 elem_count = asdl_seq_LEN(e->v.List.elts);
323 for (i = 0; i < elem_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300324 APPEND_STR_IF(i > 0, ", ");
325 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.List.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800326 }
327
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300328 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800329}
330
331static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300332append_ast_tuple(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800333{
334 Py_ssize_t i, elem_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800335
336 elem_count = asdl_seq_LEN(e->v.Tuple.elts);
337
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300338 if (elem_count == 0) {
339 APPEND_STR_FINISH("()");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800340 }
341
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300342 APPEND_STR_IF(level > PR_TUPLE, "(");
343
Guido van Rossum95e4d582018-01-26 08:20:18 -0800344 for (i = 0; i < elem_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300345 APPEND_STR_IF(i > 0, ", ");
346 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Tuple.elts, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800347 }
348
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300349 APPEND_STR_IF(elem_count == 1, ",");
350 APPEND_STR_IF(level > PR_TUPLE, ")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800351 return 0;
352}
353
354static int
355append_ast_comprehension(_PyUnicodeWriter *writer, comprehension_ty gen)
356{
357 Py_ssize_t i, if_count;
358
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300359 APPEND_STR(gen->is_async ? " async for " : " for ");
360 APPEND_EXPR(gen->target, PR_TUPLE);
361 APPEND_STR(" in ");
362 APPEND_EXPR(gen->iter, PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800363
364 if_count = asdl_seq_LEN(gen->ifs);
365 for (i = 0; i < if_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300366 APPEND_STR(" if ");
367 APPEND_EXPR((expr_ty)asdl_seq_GET(gen->ifs, i), PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800368 }
369 return 0;
370}
371
372static int
373append_ast_comprehensions(_PyUnicodeWriter *writer, asdl_seq *comprehensions)
374{
375 Py_ssize_t i, gen_count;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800376 gen_count = asdl_seq_LEN(comprehensions);
377
378 for (i = 0; i < gen_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300379 APPEND(comprehension, (comprehension_ty)asdl_seq_GET(comprehensions, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800380 }
381
382 return 0;
383}
384
385static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300386append_ast_genexp(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800387{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300388 APPEND_STR("(");
389 APPEND_EXPR(e->v.GeneratorExp.elt, PR_TEST);
390 APPEND(comprehensions, e->v.GeneratorExp.generators);
391 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800392}
393
394static int
395append_ast_listcomp(_PyUnicodeWriter *writer, expr_ty e)
396{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300397 APPEND_STR("[");
398 APPEND_EXPR(e->v.ListComp.elt, PR_TEST);
399 APPEND(comprehensions, e->v.ListComp.generators);
400 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800401}
402
403static int
404append_ast_setcomp(_PyUnicodeWriter *writer, expr_ty e)
405{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300406 APPEND_STR("{");
407 APPEND_EXPR(e->v.SetComp.elt, PR_TEST);
408 APPEND(comprehensions, e->v.SetComp.generators);
409 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800410}
411
412static int
413append_ast_dictcomp(_PyUnicodeWriter *writer, expr_ty e)
414{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300415 APPEND_STR("{");
416 APPEND_EXPR(e->v.DictComp.key, PR_TEST);
417 APPEND_STR(": ");
418 APPEND_EXPR(e->v.DictComp.value, PR_TEST);
419 APPEND(comprehensions, e->v.DictComp.generators);
420 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800421}
422
423static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300424append_ast_compare(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800425{
426 const char *op;
427 Py_ssize_t i, comparator_count;
428 asdl_seq *comparators;
429 asdl_int_seq *ops;
430
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300431 APPEND_STR_IF(level > PR_CMP, "(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800432
433 comparators = e->v.Compare.comparators;
434 ops = e->v.Compare.ops;
435 comparator_count = asdl_seq_LEN(comparators);
436 assert(comparator_count > 0);
437 assert(comparator_count == asdl_seq_LEN(ops));
438
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300439 APPEND_EXPR(e->v.Compare.left, PR_CMP + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800440
441 for (i = 0; i < comparator_count; i++) {
442 switch ((cmpop_ty)asdl_seq_GET(ops, i)) {
443 case Eq:
444 op = " == ";
445 break;
446 case NotEq:
447 op = " != ";
448 break;
449 case Lt:
450 op = " < ";
451 break;
452 case LtE:
453 op = " <= ";
454 break;
455 case Gt:
456 op = " > ";
457 break;
458 case GtE:
459 op = " >= ";
460 break;
461 case Is:
462 op = " is ";
463 break;
464 case IsNot:
465 op = " is not ";
466 break;
467 case In:
468 op = " in ";
469 break;
470 case NotIn:
471 op = " not in ";
472 break;
473 default:
474 PyErr_SetString(PyExc_SystemError,
475 "unexpected comparison kind");
476 return -1;
477 }
478
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300479 APPEND_STR(op);
480 APPEND_EXPR((expr_ty)asdl_seq_GET(comparators, i), PR_CMP + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800481 }
482
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300483 APPEND_STR_IF(level > PR_CMP, ")");
484 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800485}
486
487static int
488append_ast_keyword(_PyUnicodeWriter *writer, keyword_ty kw)
489{
490 if (kw->arg == NULL) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300491 APPEND_STR("**");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800492 }
493 else {
494 if (-1 == _PyUnicodeWriter_WriteStr(writer, kw->arg)) {
495 return -1;
496 }
497
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300498 APPEND_STR("=");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800499 }
500
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300501 APPEND_EXPR(kw->value, PR_TEST);
502 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800503}
504
505static int
506append_ast_call(_PyUnicodeWriter *writer, expr_ty e)
507{
508 bool first;
509 Py_ssize_t i, arg_count, kw_count;
510 expr_ty expr;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800511
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300512 APPEND_EXPR(e->v.Call.func, PR_ATOM);
513
514 arg_count = asdl_seq_LEN(e->v.Call.args);
515 kw_count = asdl_seq_LEN(e->v.Call.keywords);
516 if (arg_count == 1 && kw_count == 0) {
517 expr = (expr_ty)asdl_seq_GET(e->v.Call.args, 0);
518 if (expr->kind == GeneratorExp_kind) {
519 /* Special case: a single generator expression. */
520 return append_ast_genexp(writer, expr);
521 }
Guido van Rossum95e4d582018-01-26 08:20:18 -0800522 }
523
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300524 APPEND_STR("(");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800525
526 first = true;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800527 for (i = 0; i < arg_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300528 APPEND_STR_IF_NOT_FIRST(", ");
529 APPEND_EXPR((expr_ty)asdl_seq_GET(e->v.Call.args, i), PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800530 }
531
Guido van Rossum95e4d582018-01-26 08:20:18 -0800532 for (i = 0; i < kw_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300533 APPEND_STR_IF_NOT_FIRST(", ");
534 APPEND(keyword, (keyword_ty)asdl_seq_GET(e->v.Call.keywords, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800535 }
536
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300537 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800538}
539
540static PyObject *
541escape_braces(PyObject *orig)
542{
543 PyObject *temp;
544 PyObject *result;
545 temp = PyUnicode_Replace(orig, _str_open_br, _str_dbl_open_br, -1);
546 if (!temp) {
547 return NULL;
548 }
549 result = PyUnicode_Replace(temp, _str_close_br, _str_dbl_close_br, -1);
550 Py_DECREF(temp);
551 return result;
552}
553
554static int
555append_fstring_unicode(_PyUnicodeWriter *writer, PyObject *unicode)
556{
557 PyObject *escaped;
558 int result = -1;
559 escaped = escape_braces(unicode);
560 if (escaped) {
561 result = _PyUnicodeWriter_WriteStr(writer, escaped);
562 Py_DECREF(escaped);
563 }
564 return result;
565}
566
567static int
568append_fstring_element(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
569{
570 switch (e->kind) {
571 case Constant_kind:
572 return append_fstring_unicode(writer, e->v.Constant.value);
573 case Str_kind:
574 return append_fstring_unicode(writer, e->v.Str.s);
575 case JoinedStr_kind:
576 return append_joinedstr(writer, e, is_format_spec);
577 case FormattedValue_kind:
578 return append_formattedvalue(writer, e, is_format_spec);
579 default:
580 PyErr_SetString(PyExc_SystemError,
581 "unknown expression kind inside f-string");
582 return -1;
583 }
584}
585
586/* Build body separately to enable wrapping the entire stream of Strs,
587 Constants and FormattedValues in one opening and one closing quote. */
588static PyObject *
589build_fstring_body(asdl_seq *values, bool is_format_spec)
590{
591 Py_ssize_t i, value_count;
592 _PyUnicodeWriter body_writer;
593 _PyUnicodeWriter_Init(&body_writer);
594 body_writer.min_length = 256;
595 body_writer.overallocate = 1;
596
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300597 value_count = asdl_seq_LEN(values);
598 for (i = 0; i < value_count; ++i) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800599 if (-1 == append_fstring_element(&body_writer,
600 (expr_ty)asdl_seq_GET(values, i),
601 is_format_spec
602 )) {
603 _PyUnicodeWriter_Dealloc(&body_writer);
604 return NULL;
605 }
606 }
607
608 return _PyUnicodeWriter_Finish(&body_writer);
609}
610
611static int
612append_joinedstr(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
613{
614 int result = -1;
615 PyObject *body = build_fstring_body(e->v.JoinedStr.values, is_format_spec);
616 if (!body) {
617 return -1;
618 }
619
620 if (!is_format_spec) {
621 if (-1 != append_charp(writer, "f") &&
622 -1 != append_repr(writer, body))
623 {
624 result = 0;
625 }
626 }
627 else {
628 result = _PyUnicodeWriter_WriteStr(writer, body);
629 }
630 Py_DECREF(body);
631 return result;
632}
633
634static int
635append_formattedvalue(_PyUnicodeWriter *writer, expr_ty e, bool is_format_spec)
636{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300637 const char *conversion;
638 const char *outer_brace = "{";
639 /* Grammar allows PR_TUPLE, but use >PR_TEST for adding parenthesis
640 around a lambda with ':' */
641 PyObject *temp_fv_str = expr_as_unicode(e->v.FormattedValue.value, PR_TEST + 1);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800642 if (!temp_fv_str) {
643 return -1;
644 }
645 if (PyUnicode_Find(temp_fv_str, _str_open_br, 0, 1, 1) == 0) {
646 /* Expression starts with a brace, split it with a space from the outer
647 one. */
648 outer_brace = "{ ";
649 }
650 if (-1 == append_charp(writer, outer_brace)) {
651 Py_DECREF(temp_fv_str);
652 return -1;
653 }
654 if (-1 == _PyUnicodeWriter_WriteStr(writer, temp_fv_str)) {
655 Py_DECREF(temp_fv_str);
656 return -1;
657 }
658 Py_DECREF(temp_fv_str);
659
660 if (e->v.FormattedValue.conversion > 0) {
661 switch (e->v.FormattedValue.conversion) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300662 case 'a':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800663 conversion = "!a";
664 break;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300665 case 'r':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800666 conversion = "!r";
667 break;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300668 case 's':
Guido van Rossum95e4d582018-01-26 08:20:18 -0800669 conversion = "!s";
670 break;
671 default:
672 PyErr_SetString(PyExc_SystemError,
673 "unknown f-value conversion kind");
674 return -1;
675 }
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300676 APPEND_STR(conversion);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800677 }
Miss Islington (bot)78758f22018-02-01 09:41:24 -0800678 if (e->v.FormattedValue.format_spec) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800679 if (-1 == _PyUnicodeWriter_WriteASCIIString(writer, ":", 1) ||
680 -1 == append_fstring_element(writer,
681 e->v.FormattedValue.format_spec,
682 true
683 ))
684 {
685 return -1;
686 }
687 }
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300688
689 APPEND_STR_FINISH("}");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800690}
691
692static int
693append_ast_attribute(_PyUnicodeWriter *writer, expr_ty e)
694{
695 const char *period;
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300696 APPEND_EXPR(e->v.Attribute.value, PR_ATOM);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800697
698 /* Special case: integers require a space for attribute access to be
699 unambiguous. Floats and complex numbers don't but work with it, too. */
700 if (e->v.Attribute.value->kind == Num_kind ||
701 e->v.Attribute.value->kind == Constant_kind)
702 {
703 period = " .";
704 }
705 else {
706 period = ".";
707 }
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300708 APPEND_STR(period);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800709
710 return _PyUnicodeWriter_WriteStr(writer, e->v.Attribute.attr);
711}
712
713static int
714append_ast_simple_slice(_PyUnicodeWriter *writer, slice_ty slice)
715{
716 if (slice->v.Slice.lower) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300717 APPEND_EXPR(slice->v.Slice.lower, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800718 }
719
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300720 APPEND_STR(":");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800721
722 if (slice->v.Slice.upper) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300723 APPEND_EXPR(slice->v.Slice.upper, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800724 }
725
726 if (slice->v.Slice.step) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300727 APPEND_STR(":");
728 APPEND_EXPR(slice->v.Slice.step, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800729 }
730 return 0;
731}
732
733static int
734append_ast_ext_slice(_PyUnicodeWriter *writer, slice_ty slice)
735{
736 Py_ssize_t i, dims_count;
737 dims_count = asdl_seq_LEN(slice->v.ExtSlice.dims);
738 for (i = 0; i < dims_count; i++) {
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300739 APPEND_STR_IF(i > 0, ", ");
740 APPEND(slice, (slice_ty)asdl_seq_GET(slice->v.ExtSlice.dims, i));
Guido van Rossum95e4d582018-01-26 08:20:18 -0800741 }
742 return 0;
743}
744
745static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300746append_ast_slice(_PyUnicodeWriter *writer, slice_ty slice)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800747{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300748 switch (slice->kind) {
Guido van Rossum95e4d582018-01-26 08:20:18 -0800749 case Slice_kind:
750 return append_ast_simple_slice(writer, slice);
751 case ExtSlice_kind:
752 return append_ast_ext_slice(writer, slice);
753 case Index_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300754 APPEND_EXPR(slice->v.Index.value, PR_TUPLE);
755 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800756 default:
757 PyErr_SetString(PyExc_SystemError,
758 "unexpected slice kind");
759 return -1;
760 }
761}
762
763static int
764append_ast_subscript(_PyUnicodeWriter *writer, expr_ty e)
765{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300766 APPEND_EXPR(e->v.Subscript.value, PR_ATOM);
767 APPEND_STR("[");
768 APPEND(slice, e->v.Subscript.slice);
769 APPEND_STR_FINISH("]");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800770}
771
772static int
773append_ast_starred(_PyUnicodeWriter *writer, expr_ty e)
774{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300775 APPEND_STR("*");
776 APPEND_EXPR(e->v.Starred.value, PR_EXPR);
777 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800778}
779
780static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300781append_ast_yield(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800782{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300783 if (!e->v.Yield.value) {
784 APPEND_STR_FINISH("(yield)");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800785 }
786
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300787 APPEND_STR("(yield ");
788 APPEND_EXPR(e->v.Yield.value, PR_TEST);
789 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800790}
791
792static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300793append_ast_yield_from(_PyUnicodeWriter *writer, expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800794{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300795 APPEND_STR("(yield from ");
796 APPEND_EXPR(e->v.YieldFrom.value, PR_TEST);
797 APPEND_STR_FINISH(")");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800798}
799
800static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300801append_ast_await(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800802{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300803 APPEND_STR_IF(level > PR_AWAIT, "(");
804 APPEND_STR("await ");
805 APPEND_EXPR(e->v.Await.value, PR_ATOM);
806 APPEND_STR_IF(level > PR_AWAIT, ")");
807 return 0;
Guido van Rossum95e4d582018-01-26 08:20:18 -0800808}
809
810static int
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300811append_ast_expr(_PyUnicodeWriter *writer, expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800812{
813 switch (e->kind) {
814 case BoolOp_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300815 return append_ast_boolop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800816 case BinOp_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300817 return append_ast_binop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800818 case UnaryOp_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300819 return append_ast_unaryop(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800820 case Lambda_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300821 return append_ast_lambda(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800822 case IfExp_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300823 return append_ast_ifexp(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800824 case Dict_kind:
825 return append_ast_dict(writer, e);
826 case Set_kind:
827 return append_ast_set(writer, e);
828 case GeneratorExp_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300829 return append_ast_genexp(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800830 case ListComp_kind:
831 return append_ast_listcomp(writer, e);
832 case SetComp_kind:
833 return append_ast_setcomp(writer, e);
834 case DictComp_kind:
835 return append_ast_dictcomp(writer, e);
836 case Yield_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300837 return append_ast_yield(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800838 case YieldFrom_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300839 return append_ast_yield_from(writer, e);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800840 case Await_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300841 return append_ast_await(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800842 case Compare_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300843 return append_ast_compare(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800844 case Call_kind:
845 return append_ast_call(writer, e);
846 case Constant_kind:
847 return append_repr(writer, e->v.Constant.value);
848 case Num_kind:
849 return append_repr(writer, e->v.Num.n);
850 case Str_kind:
851 return append_repr(writer, e->v.Str.s);
852 case JoinedStr_kind:
853 return append_joinedstr(writer, e, false);
854 case FormattedValue_kind:
855 return append_formattedvalue(writer, e, false);
856 case Bytes_kind:
857 return append_repr(writer, e->v.Bytes.s);
858 case Ellipsis_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300859 APPEND_STR_FINISH("...");
Guido van Rossum95e4d582018-01-26 08:20:18 -0800860 case NameConstant_kind:
861 return append_repr(writer, e->v.NameConstant.value);
862 /* The following exprs can be assignment targets. */
863 case Attribute_kind:
864 return append_ast_attribute(writer, e);
865 case Subscript_kind:
866 return append_ast_subscript(writer, e);
867 case Starred_kind:
868 return append_ast_starred(writer, e);
869 case Name_kind:
870 return _PyUnicodeWriter_WriteStr(writer, e->v.Name.id);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800871 case List_kind:
872 return append_ast_list(writer, e);
873 case Tuple_kind:
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300874 return append_ast_tuple(writer, e, level);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800875 default:
876 PyErr_SetString(PyExc_SystemError,
877 "unknown expression kind");
878 return -1;
879 }
880}
881
882static int
Miss Islington (bot)78758f22018-02-01 09:41:24 -0800883maybe_init_static_strings(void)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800884{
885 if (!_str_open_br &&
886 !(_str_open_br = PyUnicode_InternFromString("{"))) {
887 return -1;
888 }
889 if (!_str_dbl_open_br &&
890 !(_str_dbl_open_br = PyUnicode_InternFromString("{{"))) {
891 return -1;
892 }
893 if (!_str_close_br &&
894 !(_str_close_br = PyUnicode_InternFromString("}"))) {
895 return -1;
896 }
897 if (!_str_dbl_close_br &&
898 !(_str_dbl_close_br = PyUnicode_InternFromString("}}"))) {
899 return -1;
900 }
901 return 0;
902}
903
904static PyObject *
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300905expr_as_unicode(expr_ty e, int level)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800906{
907 _PyUnicodeWriter writer;
908 _PyUnicodeWriter_Init(&writer);
909 writer.min_length = 256;
910 writer.overallocate = 1;
911 if (-1 == maybe_init_static_strings() ||
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300912 -1 == append_ast_expr(&writer, e, level))
Guido van Rossum95e4d582018-01-26 08:20:18 -0800913 {
914 _PyUnicodeWriter_Dealloc(&writer);
915 return NULL;
916 }
917 return _PyUnicodeWriter_Finish(&writer);
918}
919
920PyObject *
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300921_PyAST_ExprAsUnicode(expr_ty e)
Guido van Rossum95e4d582018-01-26 08:20:18 -0800922{
Serhiy Storchakab32f8892018-05-20 18:06:08 +0300923 return expr_as_unicode(e, PR_TEST);
Guido van Rossum95e4d582018-01-26 08:20:18 -0800924}