You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1167 lines
29 KiB

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