summaryrefslogtreecommitdiff
path: root/Python/compile.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2018-01-26 08:20:18 -0800
committerƁukasz Langa <lukasz@langa.pl>2018-01-26 08:20:18 -0800
commit95e4d589137260530e18ef98a2ed84ee3ec57e12 (patch)
tree9d0c3bc48158e9f0c83f1b9cb509c1fbebd9cfde /Python/compile.c
parentd7773d92bd11640a8c950d6c36a9cef1cee36f96 (diff)
downloadcpython-git-95e4d589137260530e18ef98a2ed84ee3ec57e12.tar.gz
String annotations [PEP 563] (#4390)
* Document `from __future__ import annotations` * Provide plumbing and tests for `from __future__ import annotations` * Implement unparsing the AST back to string form This is required for PEP 563 and as such only implements a part of the unparsing process that covers expressions.
Diffstat (limited to 'Python/compile.c')
-rw-r--r--Python/compile.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/Python/compile.c b/Python/compile.c
index 31efc28da4..3e8323b933 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -1700,12 +1700,29 @@ error:
}
static int
+compiler_visit_annexpr(struct compiler *c, expr_ty annotation)
+{
+ PyObject *ann_as_str;
+ ann_as_str = _PyAST_ExprAsUnicode(annotation, 1);
+ if (!ann_as_str) {
+ return 0;
+ }
+ ADDOP_N(c, LOAD_CONST, ann_as_str, consts);
+ return 1;
+}
+
+static int
compiler_visit_argannotation(struct compiler *c, identifier id,
expr_ty annotation, PyObject *names)
{
if (annotation) {
PyObject *mangled;
- VISIT(c, expr, annotation);
+ if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
+ VISIT(c, annexpr, annotation)
+ }
+ else {
+ VISIT(c, expr, annotation);
+ }
mangled = _Py_Mangle(c->u->u_private, id);
if (!mangled)
return 0;
@@ -4688,7 +4705,12 @@ compiler_annassign(struct compiler *c, stmt_ty s)
if (!mangled) {
return 0;
}
- VISIT(c, expr, s->v.AnnAssign.annotation);
+ if (c->c_future->ff_features & CO_FUTURE_ANNOTATIONS) {
+ VISIT(c, annexpr, s->v.AnnAssign.annotation)
+ }
+ else {
+ VISIT(c, expr, s->v.AnnAssign.annotation);
+ }
/* ADDOP_N decrefs its argument */
ADDOP_N(c, STORE_ANNOTATION, mangled, names);
}