1.1 --- a/compiler/ast.py Tue Jun 12 00:17:27 2012 +0200
1.2 +++ b/compiler/ast.py Thu Jul 05 23:51:51 2012 +0200
1.3 @@ -18,6 +18,26 @@
1.4 def flatten_nodes(seq):
1.5 return [n for n in flatten(seq) if isinstance(n, Node)]
1.6
1.7 +def indent(s):
1.8 + return s.replace("\n", "\n\t")
1.9 +
1.10 +def decode_function(node):
1.11 + star = (node.flags & 4 != 0) and 1 or 0
1.12 + dstar = (node.flags & 8 != 0) and 1 or 0
1.13 + argnames = node.argnames[:]
1.14 +
1.15 + # Add stars to star and dstar parameters.
1.16 +
1.17 + if star:
1.18 + argnames[-dstar-star] = "*%s" % argnames[-dstar-star]
1.19 + if dstar:
1.20 + argnames[-dstar] = "**%s" % argnames[-dstar]
1.21 +
1.22 + # Map defaults to parameters.
1.23 +
1.24 + defaults = [None] * (len(node.argnames) - star - dstar - len(node.defaults)) + list(node.defaults) + [None] * (star + dstar)
1.25 + return [(default and "%s=%s" % (argname, default) or argname) for (argname, default) in zip(argnames, defaults)]
1.26 +
1.27 nodes = {}
1.28
1.29 class Node:
1.30 @@ -52,6 +72,9 @@
1.31 def __repr__(self):
1.32 return "Expression(%r)" % (self.node,)
1.33
1.34 + def __str__(self):
1.35 + return str(self.node)
1.36 +
1.37 def visit(self, visitor, *args):
1.38 return visitor.visitExpression(self, *args)
1.39
1.40 @@ -70,6 +93,9 @@
1.41 def __repr__(self):
1.42 return "Add((%r, %r))" % (self.left, self.right)
1.43
1.44 + def __str__(self):
1.45 + return "%s + %s" % (self.left, self.right)
1.46 +
1.47 def visit(self, visitor, *args):
1.48 return visitor.visitAdd(self, *args)
1.49
1.50 @@ -89,6 +115,9 @@
1.51 def __repr__(self):
1.52 return "And(%r)" % (self.nodes,)
1.53
1.54 + def __str__(self):
1.55 + return " and ".join(map(str, self.nodes))
1.56 +
1.57 def visit(self, visitor, *args):
1.58 return visitor.visitAnd(self, *args)
1.59
1.60 @@ -108,6 +137,9 @@
1.61 def __repr__(self):
1.62 return "AssAttr(%r, %r, %r)" % (self.expr, self.attrname, self.flags)
1.63
1.64 + def __str__(self):
1.65 + return "%s.%s" % (self.expr, self.attrname) # NOTE: self.flags not used
1.66 +
1.67 def visit(self, visitor, *args):
1.68 return visitor.visitAssAttr(self, *args)
1.69
1.70 @@ -127,6 +159,9 @@
1.71 def __repr__(self):
1.72 return "AssList(%r)" % (self.nodes,)
1.73
1.74 + def __str__(self):
1.75 + return "[%s]" % ", ".join(map(str, self.nodes))
1.76 +
1.77 def visit(self, visitor, *args):
1.78 return visitor.visitAssList(self, *args)
1.79
1.80 @@ -145,6 +180,9 @@
1.81 def __repr__(self):
1.82 return "AssName(%r, %r)" % (self.name, self.flags)
1.83
1.84 + def __str__(self):
1.85 + return str(self.name) # NOTE: self.flags not used
1.86 +
1.87 def visit(self, visitor, *args):
1.88 return visitor.visitAssName(self, *args)
1.89
1.90 @@ -164,6 +202,9 @@
1.91 def __repr__(self):
1.92 return "AssTuple(%r)" % (self.nodes,)
1.93
1.94 + def __str__(self):
1.95 + return "(%s)" % ", ".join(map(str, self.nodes))
1.96 +
1.97 def visit(self, visitor, *args):
1.98 return visitor.visitAssTuple(self, *args)
1.99
1.100 @@ -189,6 +230,9 @@
1.101 def __repr__(self):
1.102 return "Assert(%r, %r)" % (self.test, self.fail)
1.103
1.104 + def __str__(self):
1.105 + return "assert %s%s" % (self.test, self.fail and ", %s" % self.fail or "")
1.106 +
1.107 def visit(self, visitor, *args):
1.108 return visitor.visitAssert(self, *args)
1.109
1.110 @@ -213,6 +257,9 @@
1.111 def __repr__(self):
1.112 return "Assign(%r, %r)" % (self.nodes, self.expr)
1.113
1.114 + def __str__(self):
1.115 + return "%s = %s" % (", ".join(map(str, self.nodes)), self.expr)
1.116 +
1.117 def visit(self, visitor, *args):
1.118 return visitor.visitAssign(self, *args)
1.119
1.120 @@ -232,6 +279,9 @@
1.121 def __repr__(self):
1.122 return "AugAssign(%r, %r, %r)" % (self.node, self.op, self.expr)
1.123
1.124 + def __str__(self):
1.125 + return "%s %s %s" % (self.node, self.op, self.expr)
1.126 +
1.127 def visit(self, visitor, *args):
1.128 return visitor.visitAugAssign(self, *args)
1.129
1.130 @@ -249,6 +299,9 @@
1.131 def __repr__(self):
1.132 return "Backquote(%r)" % (self.expr,)
1.133
1.134 + def __str__(self):
1.135 + return "`%s`" % self.expr
1.136 +
1.137 def visit(self, visitor, *args):
1.138 return visitor.visitBackquote(self, *args)
1.139
1.140 @@ -268,6 +321,9 @@
1.141 def __repr__(self):
1.142 return "Bitand(%r)" % (self.nodes,)
1.143
1.144 + def __str__(self):
1.145 + return " & ".join(map(str, self.nodes))
1.146 +
1.147 def visit(self, visitor, *args):
1.148 return visitor.visitBitand(self, *args)
1.149
1.150 @@ -287,6 +343,9 @@
1.151 def __repr__(self):
1.152 return "Bitor(%r)" % (self.nodes,)
1.153
1.154 + def __str__(self):
1.155 + return " | ".join(map(str, self.nodes))
1.156 +
1.157 def visit(self, visitor, *args):
1.158 return visitor.visitBitor(self, *args)
1.159
1.160 @@ -306,6 +365,9 @@
1.161 def __repr__(self):
1.162 return "Bitxor(%r)" % (self.nodes,)
1.163
1.164 + def __str__(self):
1.165 + return " ^ ".join(map(str, self.nodes))
1.166 +
1.167 def visit(self, visitor, *args):
1.168 return visitor.visitBitxor(self, *args)
1.169
1.170 @@ -322,6 +384,9 @@
1.171 def __repr__(self):
1.172 return "Break()"
1.173
1.174 + def __str__(self):
1.175 + return "break"
1.176 +
1.177 def visit(self, visitor, *args):
1.178 return visitor.visitBreak(self, *args)
1.179
1.180 @@ -354,6 +419,11 @@
1.181 def __repr__(self):
1.182 return "CallFunc(%r, %r, %r, %r)" % (self.node, self.args, self.star_args, self.dstar_args)
1.183
1.184 + def __str__(self):
1.185 + star_args = self.star_args and ["*%s" % self.star_args] or []
1.186 + dstar_args = self.dstar_args and ["**%s" % self.dstar_args] or []
1.187 + return "%s(%s)" % (self.node, ", ".join(map(str, self.args + star_args + dstar_args)))
1.188 +
1.189 def visit(self, visitor, *args):
1.190 return visitor.visitCallFunc(self, *args)
1.191
1.192 @@ -386,6 +456,15 @@
1.193 def __repr__(self):
1.194 return "Class(%r, %r, %r, %r, %r)" % (self.name, self.bases, self.doc, self.code, self.decorators)
1.195
1.196 + def __str__(self):
1.197 + return "%sclass %s%s:%s%s" % (
1.198 + self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.199 + self.name,
1.200 + self.bases and "(%s)" % ", ".join(map(str, self.bases)) or "",
1.201 + indent(self.doc and "\n%r" % self.doc or ""),
1.202 + indent("\n%s" % self.code)
1.203 + )
1.204 +
1.205 def visit(self, visitor, *args):
1.206 return visitor.visitClass(self, *args)
1.207
1.208 @@ -410,6 +489,9 @@
1.209 def __repr__(self):
1.210 return "Compare(%r, %r)" % (self.expr, self.ops)
1.211
1.212 + def __str__(self):
1.213 + return "%s %s" % (self.expr, " ".join([("%s %s" % op) for op in self.ops]))
1.214 +
1.215 def visit(self, visitor, *args):
1.216 return visitor.visitCompare(self, *args)
1.217
1.218 @@ -427,6 +509,9 @@
1.219 def __repr__(self):
1.220 return "Const(%r)" % (self.value,)
1.221
1.222 + def __str__(self):
1.223 + return repr(self.value)
1.224 +
1.225 def visit(self, visitor, *args):
1.226 return visitor.visitConst(self, *args)
1.227
1.228 @@ -443,6 +528,9 @@
1.229 def __repr__(self):
1.230 return "Continue()"
1.231
1.232 + def __str__(self):
1.233 + return "continue"
1.234 +
1.235 def visit(self, visitor, *args):
1.236 return visitor.visitContinue(self, *args)
1.237
1.238 @@ -462,6 +550,9 @@
1.239 def __repr__(self):
1.240 return "Decorators(%r)" % (self.nodes,)
1.241
1.242 + def __str__(self):
1.243 + return "\n".join([("@%s" % node) for node in self.nodes])
1.244 +
1.245 def visit(self, visitor, *args):
1.246 return visitor.visitDecorators(self, *args)
1.247
1.248 @@ -481,6 +572,9 @@
1.249 def __repr__(self):
1.250 return "Dict(%r)" % (self.items,)
1.251
1.252 + def __str__(self):
1.253 + return "{%s}" % ", ".join(map(str, self.items))
1.254 +
1.255 def visit(self, visitor, *args):
1.256 return visitor.visitDict(self, *args)
1.257
1.258 @@ -498,6 +592,9 @@
1.259 def __repr__(self):
1.260 return "Discard(%r)" % (self.expr,)
1.261
1.262 + def __str__(self):
1.263 + return str(self.expr)
1.264 +
1.265 def visit(self, visitor, *args):
1.266 return visitor.visitDiscard(self, *args)
1.267
1.268 @@ -516,6 +613,9 @@
1.269 def __repr__(self):
1.270 return "Div((%r, %r))" % (self.left, self.right)
1.271
1.272 + def __str__(self):
1.273 + return "%s / %s" % (self.left, self.right)
1.274 +
1.275 def visit(self, visitor, *args):
1.276 return visitor.visitDiv(self, *args)
1.277
1.278 @@ -532,6 +632,9 @@
1.279 def __repr__(self):
1.280 return "Ellipsis()"
1.281
1.282 + def __str__(self):
1.283 + return "..."
1.284 +
1.285 def visit(self, visitor, *args):
1.286 return visitor.visitEllipsis(self, *args)
1.287
1.288 @@ -561,6 +664,10 @@
1.289 def __repr__(self):
1.290 return "Exec(%r, %r, %r)" % (self.expr, self.locals, self.globals)
1.291
1.292 + def __str__(self):
1.293 + return "exec %s%s%s" % (self.expr, self.locals and ", %s" % self.locals or "",
1.294 + self.globals and ", %s" % self.globals or "")
1.295 +
1.296 def visit(self, visitor, *args):
1.297 return visitor.visitExec(self, *args)
1.298
1.299 @@ -579,6 +686,9 @@
1.300 def __repr__(self):
1.301 return "FloorDiv((%r, %r))" % (self.left, self.right)
1.302
1.303 + def __str__(self):
1.304 + return "%s // %s" % (self.left, self.right)
1.305 +
1.306 def visit(self, visitor, *args):
1.307 return visitor.visitFloorDiv(self, *args)
1.308
1.309 @@ -610,6 +720,13 @@
1.310 def __repr__(self):
1.311 return "For(%r, %r, %r, %r)" % (self.assign, self.list, self.body, self.else_)
1.312
1.313 + def __str__(self):
1.314 + return "for %s in %s:%s%s" % (
1.315 + self.assign, self.list,
1.316 + indent("\n%s" % self.body),
1.317 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.318 + )
1.319 +
1.320 def visit(self, visitor, *args):
1.321 return visitor.visitFor(self, *args)
1.322
1.323 @@ -629,6 +746,10 @@
1.324 def __repr__(self):
1.325 return "From(%r, %r, %r)" % (self.modname, self.names, self.level)
1.326
1.327 + def __str__(self):
1.328 + return "from %s import %s" % (self.modname,
1.329 + ", ".join([(alias and "%s as %s" % (name, alias) or name) for (name, alias) in self.names]))
1.330 +
1.331 def visit(self, visitor, *args):
1.332 return visitor.visitFrom(self, *args)
1.333
1.334 @@ -648,7 +769,6 @@
1.335 if flags & CO_VARKEYWORDS:
1.336 self.kwargs = 1
1.337
1.338 -
1.339 def getChildren(self):
1.340 children = []
1.341 children.append(self.decorators)
1.342 @@ -671,6 +791,17 @@
1.343 def __repr__(self):
1.344 return "Function(%r, %r, %r, %r, %r, %r, %r)" % (self.decorators, self.name, self.argnames, self.defaults, self.flags, self.doc, self.code)
1.345
1.346 + def __str__(self):
1.347 + parameters = decode_function(self)
1.348 +
1.349 + return "%sdef %s(%s):%s%s" % (
1.350 + self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.351 + self.name,
1.352 + ", ".join(parameters),
1.353 + indent(self.doc and "\n%r" % self.doc or ""),
1.354 + indent("\n%s" % self.code)
1.355 + )
1.356 +
1.357 def visit(self, visitor, *args):
1.358 return visitor.visitFunction(self, *args)
1.359
1.360 @@ -681,7 +812,6 @@
1.361 self.argnames = ['.0']
1.362 self.varargs = self.kwargs = None
1.363
1.364 -
1.365 def getChildren(self):
1.366 return self.code,
1.367
1.368 @@ -691,6 +821,9 @@
1.369 def __repr__(self):
1.370 return "GenExpr(%r)" % (self.code,)
1.371
1.372 + def __str__(self):
1.373 + return str(self.code)
1.374 +
1.375 def visit(self, visitor, *args):
1.376 return visitor.visitGenExpr(self, *args)
1.377
1.378 @@ -719,6 +852,12 @@
1.379 def __repr__(self):
1.380 return "GenExprFor(%r, %r, %r)" % (self.assign, self.iter, self.ifs)
1.381
1.382 + def __str__(self):
1.383 + return "for %s in %s%s" % (
1.384 + self.assign, self.iter,
1.385 + self.ifs and " ".join(map(str, self.ifs)) or ""
1.386 + )
1.387 +
1.388 def visit(self, visitor, *args):
1.389 return visitor.visitGenExprFor(self, *args)
1.390
1.391 @@ -736,6 +875,9 @@
1.392 def __repr__(self):
1.393 return "GenExprIf(%r)" % (self.test,)
1.394
1.395 + def __str__(self):
1.396 + return "if %s" % self.test
1.397 +
1.398 def visit(self, visitor, *args):
1.399 return visitor.visitGenExprIf(self, *args)
1.400
1.401 @@ -760,6 +902,9 @@
1.402 def __repr__(self):
1.403 return "GenExprInner(%r, %r)" % (self.expr, self.quals)
1.404
1.405 + def __str__(self):
1.406 + return "%s %s" % (self.expr, " ".join(map(str, self.quals)))
1.407 +
1.408 def visit(self, visitor, *args):
1.409 return visitor.visitGenExprInner(self, *args)
1.410
1.411 @@ -778,6 +923,9 @@
1.412 def __repr__(self):
1.413 return "Getattr(%r, %r)" % (self.expr, self.attrname)
1.414
1.415 + def __str__(self):
1.416 + return "%s.%s" % (self.expr, self.attrname)
1.417 +
1.418 def visit(self, visitor, *args):
1.419 return visitor.visitGetattr(self, *args)
1.420
1.421 @@ -795,6 +943,9 @@
1.422 def __repr__(self):
1.423 return "Global(%r)" % (self.names,)
1.424
1.425 + def __str__(self):
1.426 + return "global %s" % ", ".join(map(str, self.names))
1.427 +
1.428 def visit(self, visitor, *args):
1.429 return visitor.visitGlobal(self, *args)
1.430
1.431 @@ -820,6 +971,13 @@
1.432 def __repr__(self):
1.433 return "If(%r, %r)" % (self.tests, self.else_)
1.434
1.435 + def __str__(self):
1.436 + tests = [("%sif %s:%s" % (i > 0 and "el" or "", test, indent("\n%s" % body))) for (i, (test, body)) in enumerate(self.tests)]
1.437 + return "%s%s" % (
1.438 + "\n".join(tests),
1.439 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.440 + )
1.441 +
1.442 def visit(self, visitor, *args):
1.443 return visitor.visitIf(self, *args)
1.444
1.445 @@ -839,6 +997,9 @@
1.446 def __repr__(self):
1.447 return "IfExp(%r, %r, %r)" % (self.test, self.then, self.else_)
1.448
1.449 + def __str__(self):
1.450 + return "%s if %s else %s" % (self.then, self.test, self.else_)
1.451 +
1.452 def visit(self, visitor, *args):
1.453 return visitor.visitIfExp(self, *args)
1.454
1.455 @@ -856,6 +1017,10 @@
1.456 def __repr__(self):
1.457 return "Import(%r)" % (self.names,)
1.458
1.459 + def __str__(self):
1.460 + return "import %s" % (
1.461 + ", ".join([(alias and "%s as %s" % (name, alias) or name) for (name, alias) in self.names]))
1.462 +
1.463 def visit(self, visitor, *args):
1.464 return visitor.visitImport(self, *args)
1.465
1.466 @@ -873,6 +1038,9 @@
1.467 def __repr__(self):
1.468 return "Invert(%r)" % (self.expr,)
1.469
1.470 + def __str__(self):
1.471 + return "~%s" % self.expr
1.472 +
1.473 def visit(self, visitor, *args):
1.474 return visitor.visitInvert(self, *args)
1.475
1.476 @@ -891,6 +1059,9 @@
1.477 def __repr__(self):
1.478 return "Keyword(%r, %r)" % (self.name, self.expr)
1.479
1.480 + def __str__(self):
1.481 + return "%s=%s" % (self.name, self.expr)
1.482 +
1.483 def visit(self, visitor, *args):
1.484 return visitor.visitKeyword(self, *args)
1.485
1.486 @@ -907,7 +1078,6 @@
1.487 if flags & CO_VARKEYWORDS:
1.488 self.kwargs = 1
1.489
1.490 -
1.491 def getChildren(self):
1.492 children = []
1.493 children.append(self.argnames)
1.494 @@ -925,6 +1095,10 @@
1.495 def __repr__(self):
1.496 return "Lambda(%r, %r, %r, %r)" % (self.argnames, self.defaults, self.flags, self.code)
1.497
1.498 + def __str__(self):
1.499 + parameters = decode_function(self)
1.500 + return "lambda %s: %s" % (", ".join(parameters), self.code)
1.501 +
1.502 def visit(self, visitor, *args):
1.503 return visitor.visitLambda(self, *args)
1.504
1.505 @@ -943,6 +1117,9 @@
1.506 def __repr__(self):
1.507 return "LeftShift((%r, %r))" % (self.left, self.right)
1.508
1.509 + def __str__(self):
1.510 + return "%s << %s" % (self.left, self.right)
1.511 +
1.512 def visit(self, visitor, *args):
1.513 return visitor.visitLeftShift(self, *args)
1.514
1.515 @@ -962,6 +1139,9 @@
1.516 def __repr__(self):
1.517 return "List(%r)" % (self.nodes,)
1.518
1.519 + def __str__(self):
1.520 + return "[%s]" % ", ".join(map(str, self.nodes))
1.521 +
1.522 def visit(self, visitor, *args):
1.523 return visitor.visitList(self, *args)
1.524
1.525 @@ -986,6 +1166,9 @@
1.526 def __repr__(self):
1.527 return "ListComp(%r, %r)" % (self.expr, self.quals)
1.528
1.529 + def __str__(self):
1.530 + return "%s %s" % (self.expr, " ".join(map(str, self.quals)))
1.531 +
1.532 def visit(self, visitor, *args):
1.533 return visitor.visitListComp(self, *args)
1.534
1.535 @@ -1013,6 +1196,12 @@
1.536 def __repr__(self):
1.537 return "ListCompFor(%r, %r, %r)" % (self.assign, self.list, self.ifs)
1.538
1.539 + def __str__(self):
1.540 + return "for %s in %s%s" % (
1.541 + self.assign, self.list,
1.542 + self.ifs and " ".join(map(str, self.ifs)) or ""
1.543 + )
1.544 +
1.545 def visit(self, visitor, *args):
1.546 return visitor.visitListCompFor(self, *args)
1.547
1.548 @@ -1030,6 +1219,9 @@
1.549 def __repr__(self):
1.550 return "ListCompIf(%r)" % (self.test,)
1.551
1.552 + def __str__(self):
1.553 + return "if %s" % self.test
1.554 +
1.555 def visit(self, visitor, *args):
1.556 return visitor.visitListCompIf(self, *args)
1.557
1.558 @@ -1048,6 +1240,9 @@
1.559 def __repr__(self):
1.560 return "Mod((%r, %r))" % (self.left, self.right)
1.561
1.562 + def __str__(self):
1.563 + return "%s %% %s" % (self.left, self.right)
1.564 +
1.565 def visit(self, visitor, *args):
1.566 return visitor.visitMod(self, *args)
1.567
1.568 @@ -1066,6 +1261,9 @@
1.569 def __repr__(self):
1.570 return "Module(%r, %r)" % (self.doc, self.node)
1.571
1.572 + def __str__(self):
1.573 + return "%s%s" % (self.doc and "%r\n" % self.doc or "", self.node)
1.574 +
1.575 def visit(self, visitor, *args):
1.576 return visitor.visitModule(self, *args)
1.577
1.578 @@ -1084,6 +1282,9 @@
1.579 def __repr__(self):
1.580 return "Mul((%r, %r))" % (self.left, self.right)
1.581
1.582 + def __str__(self):
1.583 + return "%s * %s" % (self.left, self.right)
1.584 +
1.585 def visit(self, visitor, *args):
1.586 return visitor.visitMul(self, *args)
1.587
1.588 @@ -1101,6 +1302,9 @@
1.589 def __repr__(self):
1.590 return "Name(%r)" % (self.name,)
1.591
1.592 + def __str__(self):
1.593 + return str(self.name)
1.594 +
1.595 def visit(self, visitor, *args):
1.596 return visitor.visitName(self, *args)
1.597
1.598 @@ -1118,6 +1322,9 @@
1.599 def __repr__(self):
1.600 return "Not(%r)" % (self.expr,)
1.601
1.602 + def __str__(self):
1.603 + return "not %s" % self.expr
1.604 +
1.605 def visit(self, visitor, *args):
1.606 return visitor.visitNot(self, *args)
1.607
1.608 @@ -1137,6 +1344,9 @@
1.609 def __repr__(self):
1.610 return "Or(%r)" % (self.nodes,)
1.611
1.612 + def __str__(self):
1.613 + return " or ".join(map(str, self.nodes))
1.614 +
1.615 def visit(self, visitor, *args):
1.616 return visitor.visitOr(self, *args)
1.617
1.618 @@ -1153,6 +1363,9 @@
1.619 def __repr__(self):
1.620 return "Pass()"
1.621
1.622 + def __str__(self):
1.623 + return "pass"
1.624 +
1.625 def visit(self, visitor, *args):
1.626 return visitor.visitPass(self, *args)
1.627
1.628 @@ -1171,6 +1384,9 @@
1.629 def __repr__(self):
1.630 return "Power((%r, %r))" % (self.left, self.right)
1.631
1.632 + def __str__(self):
1.633 + return "%s ** %s" % (self.left, self.right)
1.634 +
1.635 def visit(self, visitor, *args):
1.636 return visitor.visitPower(self, *args)
1.637
1.638 @@ -1196,6 +1412,10 @@
1.639 def __repr__(self):
1.640 return "Print(%r, %r)" % (self.nodes, self.dest)
1.641
1.642 + def __str__(self):
1.643 + dest = self.dest and [">>%s" % self.dest] or []
1.644 + return "print %s," % ", ".join(map(str, dest + self.nodes))
1.645 +
1.646 def visit(self, visitor, *args):
1.647 return visitor.visitPrint(self, *args)
1.648
1.649 @@ -1221,6 +1441,10 @@
1.650 def __repr__(self):
1.651 return "Printnl(%r, %r)" % (self.nodes, self.dest)
1.652
1.653 + def __str__(self):
1.654 + dest = self.dest and [">>%s" % self.dest] or []
1.655 + return "print %s" % ", ".join(map(str, dest + self.nodes))
1.656 +
1.657 def visit(self, visitor, *args):
1.658 return visitor.visitPrintnl(self, *args)
1.659
1.660 @@ -1251,6 +1475,12 @@
1.661 def __repr__(self):
1.662 return "Raise(%r, %r, %r)" % (self.expr1, self.expr2, self.expr3)
1.663
1.664 + def __str__(self):
1.665 + args = self.expr1 and [self.expr1] or []
1.666 + args += self.expr2 and [self.expr2] or []
1.667 + args += self.expr3 and [self.expr3] or []
1.668 + return "raise %s" % ", ".join(map(str, args))
1.669 +
1.670 def visit(self, visitor, *args):
1.671 return visitor.visitRaise(self, *args)
1.672
1.673 @@ -1268,6 +1498,9 @@
1.674 def __repr__(self):
1.675 return "Return(%r)" % (self.value,)
1.676
1.677 + def __str__(self):
1.678 + return "return %s" % self.value
1.679 +
1.680 def visit(self, visitor, *args):
1.681 return visitor.visitReturn(self, *args)
1.682
1.683 @@ -1286,6 +1519,9 @@
1.684 def __repr__(self):
1.685 return "RightShift((%r, %r))" % (self.left, self.right)
1.686
1.687 + def __str__(self):
1.688 + return "%s >> %s" % (self.left, self.right)
1.689 +
1.690 def visit(self, visitor, *args):
1.691 return visitor.visitRightShift(self, *args)
1.692
1.693 @@ -1317,6 +1553,12 @@
1.694 def __repr__(self):
1.695 return "Slice(%r, %r, %r, %r)" % (self.expr, self.flags, self.lower, self.upper)
1.696
1.697 + def __str__(self):
1.698 + args = []
1.699 + args = self.lower is not None and [self.lower] or []
1.700 + args = self.upper is not None and [self.upper] or []
1.701 + return "%s[%s]" % (self.expr, ":".join(map(str, args)))
1.702 +
1.703 def visit(self, visitor, *args):
1.704 return visitor.visitSlice(self, *args)
1.705
1.706 @@ -1336,6 +1578,9 @@
1.707 def __repr__(self):
1.708 return "Sliceobj(%r)" % (self.nodes,)
1.709
1.710 + def __str__(self):
1.711 + return ":".join(map(str, self.nodes))
1.712 +
1.713 def visit(self, visitor, *args):
1.714 return visitor.visitSliceobj(self, *args)
1.715
1.716 @@ -1355,6 +1600,9 @@
1.717 def __repr__(self):
1.718 return "Stmt(%r)" % (self.nodes,)
1.719
1.720 + def __str__(self):
1.721 + return "\n".join(map(str, self.nodes))
1.722 +
1.723 def visit(self, visitor, *args):
1.724 return visitor.visitStmt(self, *args)
1.725
1.726 @@ -1373,6 +1621,9 @@
1.727 def __repr__(self):
1.728 return "Sub((%r, %r))" % (self.left, self.right)
1.729
1.730 + def __str__(self):
1.731 + return "%s - %s" % (self.left, self.right)
1.732 +
1.733 def visit(self, visitor, *args):
1.734 return visitor.visitSub(self, *args)
1.735
1.736 @@ -1399,6 +1650,9 @@
1.737 def __repr__(self):
1.738 return "Subscript(%r, %r, %r)" % (self.expr, self.flags, self.subs)
1.739
1.740 + def __str__(self):
1.741 + return "%s[%s]" % (self.expr, ",".join(map(str, self.subs)))
1.742 +
1.743 def visit(self, visitor, *args):
1.744 return visitor.visitSubscript(self, *args)
1.745
1.746 @@ -1427,6 +1681,18 @@
1.747 def __repr__(self):
1.748 return "TryExcept(%r, %r, %r)" % (self.body, self.handlers, self.else_)
1.749
1.750 + def __str__(self):
1.751 + handlers = [
1.752 + ("\nexcept%s%s:%s" % (spec and " %s" % spec or "", assign and ", %s" % assign or "", indent("\n%s" % statement)))
1.753 + for (spec, assign, statement) in self.handlers
1.754 + ]
1.755 +
1.756 + return "try:%s%s%s" % (
1.757 + indent("\n%s" % self.body),
1.758 + "".join(handlers),
1.759 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.760 + )
1.761 +
1.762 def visit(self, visitor, *args):
1.763 return visitor.visitTryExcept(self, *args)
1.764
1.765 @@ -1445,6 +1711,12 @@
1.766 def __repr__(self):
1.767 return "TryFinally(%r, %r)" % (self.body, self.final)
1.768
1.769 + def __str__(self):
1.770 + return "try:%s\nfinally:%s" % (
1.771 + indent("\n%s" % self.body),
1.772 + indent("\n%s" % self.final)
1.773 + )
1.774 +
1.775 def visit(self, visitor, *args):
1.776 return visitor.visitTryFinally(self, *args)
1.777
1.778 @@ -1464,6 +1736,9 @@
1.779 def __repr__(self):
1.780 return "Tuple(%r)" % (self.nodes,)
1.781
1.782 + def __str__(self):
1.783 + return "(%s)" % ", ".join(map(str, self.nodes))
1.784 +
1.785 def visit(self, visitor, *args):
1.786 return visitor.visitTuple(self, *args)
1.787
1.788 @@ -1481,6 +1756,9 @@
1.789 def __repr__(self):
1.790 return "UnaryAdd(%r)" % (self.expr,)
1.791
1.792 + def __str__(self):
1.793 + return "+%s" % self.expr
1.794 +
1.795 def visit(self, visitor, *args):
1.796 return visitor.visitUnaryAdd(self, *args)
1.797
1.798 @@ -1498,6 +1776,9 @@
1.799 def __repr__(self):
1.800 return "UnarySub(%r)" % (self.expr,)
1.801
1.802 + def __str__(self):
1.803 + return "-%s" % self.expr
1.804 +
1.805 def visit(self, visitor, *args):
1.806 return visitor.visitUnarySub(self, *args)
1.807
1.808 @@ -1526,6 +1807,13 @@
1.809 def __repr__(self):
1.810 return "While(%r, %r, %r)" % (self.test, self.body, self.else_)
1.811
1.812 + def __str__(self):
1.813 + return "while %s:%s%s" % (
1.814 + self.test,
1.815 + indent("\n%s" % self.body),
1.816 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.817 + )
1.818 +
1.819 def visit(self, visitor, *args):
1.820 return visitor.visitWhile(self, *args)
1.821
1.822 @@ -1554,6 +1842,13 @@
1.823 def __repr__(self):
1.824 return "With(%r, %r, %r)" % (self.expr, self.vars, self.body)
1.825
1.826 + def __str__(self):
1.827 + return "with %s%s:%s" % (
1.828 + self.expr,
1.829 + self.vars and " as %s" % ", ".join(map(str, self.vars)),
1.830 + indent("\n%s" % self.body),
1.831 + )
1.832 +
1.833 def visit(self, visitor, *args):
1.834 return visitor.visitWith(self, *args)
1.835
1.836 @@ -1571,6 +1866,9 @@
1.837 def __repr__(self):
1.838 return "Yield(%r)" % (self.value,)
1.839
1.840 + def __str__(self):
1.841 + return "yield %s" % self.value
1.842 +
1.843 def visit(self, visitor, *args):
1.844 return visitor.visitYield(self, *args)
1.845