1.1 --- a/compiler/ast.py Tue Jun 12 00:20:29 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 @@ -382,6 +452,15 @@
1.193 def __repr__(self):
1.194 return "Class(%r, %r, %r, %r)" % (self.name, self.bases, self.doc, self.code)
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 @@ -406,6 +485,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 @@ -423,6 +505,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 @@ -439,6 +524,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 @@ -458,6 +546,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 @@ -477,6 +568,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 @@ -494,6 +588,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 @@ -512,6 +609,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 @@ -528,6 +628,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 @@ -557,6 +660,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 @@ -575,6 +682,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 @@ -606,6 +716,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 @@ -625,6 +742,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 @@ -644,8 +765,6 @@
1.335 if flags & CO_VARKEYWORDS:
1.336 self.kwargs = 1
1.337
1.338 -
1.339 -
1.340 def getChildren(self):
1.341 children = []
1.342 children.append(self.decorators)
1.343 @@ -668,6 +787,17 @@
1.344 def __repr__(self):
1.345 return "Function(%r, %r, %r, %r, %r, %r, %r)" % (self.decorators, self.name, self.argnames, self.defaults, self.flags, self.doc, self.code)
1.346
1.347 + def __str__(self):
1.348 + parameters = decode_function(self)
1.349 +
1.350 + return "%sdef %s(%s):%s%s" % (
1.351 + self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.352 + self.name,
1.353 + ", ".join(parameters),
1.354 + indent(self.doc and "\n%r" % self.doc or ""),
1.355 + indent("\n%s" % self.code)
1.356 + )
1.357 +
1.358 def visit(self, visitor, *args):
1.359 return visitor.visitFunction(self, *args)
1.360
1.361 @@ -687,6 +817,9 @@
1.362 def __repr__(self):
1.363 return "GenExpr(%r)" % (self.code,)
1.364
1.365 + def __str__(self):
1.366 + return str(self.code)
1.367 +
1.368 def visit(self, visitor, *args):
1.369 return visitor.visitGenExpr(self, *args)
1.370
1.371 @@ -698,7 +831,6 @@
1.372 self.lineno = lineno
1.373 self.is_outmost = False
1.374
1.375 -
1.376 def getChildren(self):
1.377 children = []
1.378 children.append(self.assign)
1.379 @@ -716,6 +848,12 @@
1.380 def __repr__(self):
1.381 return "GenExprFor(%r, %r, %r)" % (self.assign, self.iter, self.ifs)
1.382
1.383 + def __str__(self):
1.384 + return "for %s in %s%s" % (
1.385 + self.assign, self.iter,
1.386 + self.ifs and " ".join(map(str, self.ifs)) or ""
1.387 + )
1.388 +
1.389 def visit(self, visitor, *args):
1.390 return visitor.visitGenExprFor(self, *args)
1.391
1.392 @@ -733,6 +871,9 @@
1.393 def __repr__(self):
1.394 return "GenExprIf(%r)" % (self.test,)
1.395
1.396 + def __str__(self):
1.397 + return "if %s" % self.test
1.398 +
1.399 def visit(self, visitor, *args):
1.400 return visitor.visitGenExprIf(self, *args)
1.401
1.402 @@ -757,6 +898,9 @@
1.403 def __repr__(self):
1.404 return "GenExprInner(%r, %r)" % (self.expr, self.quals)
1.405
1.406 + def __str__(self):
1.407 + return "%s %s" % (self.expr, " ".join(map(str, self.quals)))
1.408 +
1.409 def visit(self, visitor, *args):
1.410 return visitor.visitGenExprInner(self, *args)
1.411
1.412 @@ -775,6 +919,9 @@
1.413 def __repr__(self):
1.414 return "Getattr(%r, %r)" % (self.expr, self.attrname)
1.415
1.416 + def __str__(self):
1.417 + return "%s.%s" % (self.expr, self.attrname)
1.418 +
1.419 def visit(self, visitor, *args):
1.420 return visitor.visitGetattr(self, *args)
1.421
1.422 @@ -792,6 +939,9 @@
1.423 def __repr__(self):
1.424 return "Global(%r)" % (self.names,)
1.425
1.426 + def __str__(self):
1.427 + return "global %s" % ", ".join(map(str, self.names))
1.428 +
1.429 def visit(self, visitor, *args):
1.430 return visitor.visitGlobal(self, *args)
1.431
1.432 @@ -817,6 +967,13 @@
1.433 def __repr__(self):
1.434 return "If(%r, %r)" % (self.tests, self.else_)
1.435
1.436 + def __str__(self):
1.437 + tests = [("%sif %s:%s" % (i > 0 and "el" or "", test, indent("\n%s" % body))) for (i, (test, body)) in enumerate(self.tests)]
1.438 + return "%s%s" % (
1.439 + "\n".join(tests),
1.440 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.441 + )
1.442 +
1.443 def visit(self, visitor, *args):
1.444 return visitor.visitIf(self, *args)
1.445
1.446 @@ -836,6 +993,9 @@
1.447 def __repr__(self):
1.448 return "IfExp(%r, %r, %r)" % (self.test, self.then, self.else_)
1.449
1.450 + def __str__(self):
1.451 + return "%s if %s else %s" % (self.then, self.test, self.else_)
1.452 +
1.453 def visit(self, visitor, *args):
1.454 return visitor.visitIfExp(self, *args)
1.455
1.456 @@ -853,6 +1013,10 @@
1.457 def __repr__(self):
1.458 return "Import(%r)" % (self.names,)
1.459
1.460 + def __str__(self):
1.461 + return "import %s" % (
1.462 + ", ".join([(alias and "%s as %s" % (name, alias) or name) for (name, alias) in self.names]))
1.463 +
1.464 def visit(self, visitor, *args):
1.465 return visitor.visitImport(self, *args)
1.466
1.467 @@ -870,6 +1034,9 @@
1.468 def __repr__(self):
1.469 return "Invert(%r)" % (self.expr,)
1.470
1.471 + def __str__(self):
1.472 + return "~%s" % self.expr
1.473 +
1.474 def visit(self, visitor, *args):
1.475 return visitor.visitInvert(self, *args)
1.476
1.477 @@ -888,6 +1055,9 @@
1.478 def __repr__(self):
1.479 return "Keyword(%r, %r)" % (self.name, self.expr)
1.480
1.481 + def __str__(self):
1.482 + return "%s=%s" % (self.name, self.expr)
1.483 +
1.484 def visit(self, visitor, *args):
1.485 return visitor.visitKeyword(self, *args)
1.486
1.487 @@ -923,6 +1093,10 @@
1.488 def __repr__(self):
1.489 return "Lambda(%r, %r, %r, %r)" % (self.argnames, self.defaults, self.flags, self.code)
1.490
1.491 + def __str__(self):
1.492 + parameters = decode_function(self)
1.493 + return "lambda %s: %s" % (", ".join(parameters), self.code)
1.494 +
1.495 def visit(self, visitor, *args):
1.496 return visitor.visitLambda(self, *args)
1.497
1.498 @@ -941,6 +1115,9 @@
1.499 def __repr__(self):
1.500 return "LeftShift((%r, %r))" % (self.left, self.right)
1.501
1.502 + def __str__(self):
1.503 + return "%s << %s" % (self.left, self.right)
1.504 +
1.505 def visit(self, visitor, *args):
1.506 return visitor.visitLeftShift(self, *args)
1.507
1.508 @@ -960,6 +1137,9 @@
1.509 def __repr__(self):
1.510 return "List(%r)" % (self.nodes,)
1.511
1.512 + def __str__(self):
1.513 + return "[%s]" % ", ".join(map(str, self.nodes))
1.514 +
1.515 def visit(self, visitor, *args):
1.516 return visitor.visitList(self, *args)
1.517
1.518 @@ -984,6 +1164,9 @@
1.519 def __repr__(self):
1.520 return "ListComp(%r, %r)" % (self.expr, self.quals)
1.521
1.522 + def __str__(self):
1.523 + return "%s %s" % (self.expr, " ".join(map(str, self.quals)))
1.524 +
1.525 def visit(self, visitor, *args):
1.526 return visitor.visitListComp(self, *args)
1.527
1.528 @@ -1011,6 +1194,12 @@
1.529 def __repr__(self):
1.530 return "ListCompFor(%r, %r, %r)" % (self.assign, self.list, self.ifs)
1.531
1.532 + def __str__(self):
1.533 + return "for %s in %s%s" % (
1.534 + self.assign, self.list,
1.535 + self.ifs and " ".join(map(str, self.ifs)) or ""
1.536 + )
1.537 +
1.538 def visit(self, visitor, *args):
1.539 return visitor.visitListCompFor(self, *args)
1.540
1.541 @@ -1028,6 +1217,9 @@
1.542 def __repr__(self):
1.543 return "ListCompIf(%r)" % (self.test,)
1.544
1.545 + def __str__(self):
1.546 + return "if %s" % self.test
1.547 +
1.548 def visit(self, visitor, *args):
1.549 return visitor.visitListCompIf(self, *args)
1.550
1.551 @@ -1046,6 +1238,9 @@
1.552 def __repr__(self):
1.553 return "Mod((%r, %r))" % (self.left, self.right)
1.554
1.555 + def __str__(self):
1.556 + return "%s %% %s" % (self.left, self.right)
1.557 +
1.558 def visit(self, visitor, *args):
1.559 return visitor.visitMod(self, *args)
1.560
1.561 @@ -1064,6 +1259,9 @@
1.562 def __repr__(self):
1.563 return "Module(%r, %r)" % (self.doc, self.node)
1.564
1.565 + def __str__(self):
1.566 + return "%s%s" % (self.doc and "%r\n" % self.doc or "", self.node)
1.567 +
1.568 def visit(self, visitor, *args):
1.569 return visitor.visitModule(self, *args)
1.570
1.571 @@ -1082,6 +1280,9 @@
1.572 def __repr__(self):
1.573 return "Mul((%r, %r))" % (self.left, self.right)
1.574
1.575 + def __str__(self):
1.576 + return "%s * %s" % (self.left, self.right)
1.577 +
1.578 def visit(self, visitor, *args):
1.579 return visitor.visitMul(self, *args)
1.580
1.581 @@ -1099,6 +1300,9 @@
1.582 def __repr__(self):
1.583 return "Name(%r)" % (self.name,)
1.584
1.585 + def __str__(self):
1.586 + return str(self.name)
1.587 +
1.588 def visit(self, visitor, *args):
1.589 return visitor.visitName(self, *args)
1.590
1.591 @@ -1116,6 +1320,9 @@
1.592 def __repr__(self):
1.593 return "Not(%r)" % (self.expr,)
1.594
1.595 + def __str__(self):
1.596 + return "not %s" % self.expr
1.597 +
1.598 def visit(self, visitor, *args):
1.599 return visitor.visitNot(self, *args)
1.600
1.601 @@ -1135,6 +1342,9 @@
1.602 def __repr__(self):
1.603 return "Or(%r)" % (self.nodes,)
1.604
1.605 + def __str__(self):
1.606 + return " or ".join(map(str, self.nodes))
1.607 +
1.608 def visit(self, visitor, *args):
1.609 return visitor.visitOr(self, *args)
1.610
1.611 @@ -1151,6 +1361,9 @@
1.612 def __repr__(self):
1.613 return "Pass()"
1.614
1.615 + def __str__(self):
1.616 + return "pass"
1.617 +
1.618 def visit(self, visitor, *args):
1.619 return visitor.visitPass(self, *args)
1.620
1.621 @@ -1169,6 +1382,9 @@
1.622 def __repr__(self):
1.623 return "Power((%r, %r))" % (self.left, self.right)
1.624
1.625 + def __str__(self):
1.626 + return "%s ** %s" % (self.left, self.right)
1.627 +
1.628 def visit(self, visitor, *args):
1.629 return visitor.visitPower(self, *args)
1.630
1.631 @@ -1194,6 +1410,10 @@
1.632 def __repr__(self):
1.633 return "Print(%r, %r)" % (self.nodes, self.dest)
1.634
1.635 + def __str__(self):
1.636 + dest = self.dest and [">>%s" % self.dest] or []
1.637 + return "print %s," % ", ".join(map(str, dest + self.nodes))
1.638 +
1.639 def visit(self, visitor, *args):
1.640 return visitor.visitPrint(self, *args)
1.641
1.642 @@ -1219,6 +1439,10 @@
1.643 def __repr__(self):
1.644 return "Printnl(%r, %r)" % (self.nodes, self.dest)
1.645
1.646 + def __str__(self):
1.647 + dest = self.dest and [">>%s" % self.dest] or []
1.648 + return "print %s" % ", ".join(map(str, dest + self.nodes))
1.649 +
1.650 def visit(self, visitor, *args):
1.651 return visitor.visitPrintnl(self, *args)
1.652
1.653 @@ -1249,6 +1473,12 @@
1.654 def __repr__(self):
1.655 return "Raise(%r, %r, %r)" % (self.expr1, self.expr2, self.expr3)
1.656
1.657 + def __str__(self):
1.658 + args = self.expr1 and [self.expr1] or []
1.659 + args += self.expr2 and [self.expr2] or []
1.660 + args += self.expr3 and [self.expr3] or []
1.661 + return "raise %s" % ", ".join(map(str, args))
1.662 +
1.663 def visit(self, visitor, *args):
1.664 return visitor.visitRaise(self, *args)
1.665
1.666 @@ -1266,6 +1496,9 @@
1.667 def __repr__(self):
1.668 return "Return(%r)" % (self.value,)
1.669
1.670 + def __str__(self):
1.671 + return "return %s" % self.value
1.672 +
1.673 def visit(self, visitor, *args):
1.674 return visitor.visitReturn(self, *args)
1.675
1.676 @@ -1284,6 +1517,9 @@
1.677 def __repr__(self):
1.678 return "RightShift((%r, %r))" % (self.left, self.right)
1.679
1.680 + def __str__(self):
1.681 + return "%s >> %s" % (self.left, self.right)
1.682 +
1.683 def visit(self, visitor, *args):
1.684 return visitor.visitRightShift(self, *args)
1.685
1.686 @@ -1315,6 +1551,12 @@
1.687 def __repr__(self):
1.688 return "Slice(%r, %r, %r, %r)" % (self.expr, self.flags, self.lower, self.upper)
1.689
1.690 + def __str__(self):
1.691 + args = []
1.692 + args = self.lower is not None and [self.lower] or []
1.693 + args = self.upper is not None and [self.upper] or []
1.694 + return "%s[%s]" % (self.expr, ":".join(map(str, args)))
1.695 +
1.696 def visit(self, visitor, *args):
1.697 return visitor.visitSlice(self, *args)
1.698
1.699 @@ -1334,6 +1576,9 @@
1.700 def __repr__(self):
1.701 return "Sliceobj(%r)" % (self.nodes,)
1.702
1.703 + def __str__(self):
1.704 + return ":".join(map(str, self.nodes))
1.705 +
1.706 def visit(self, visitor, *args):
1.707 return visitor.visitSliceobj(self, *args)
1.708
1.709 @@ -1353,6 +1598,9 @@
1.710 def __repr__(self):
1.711 return "Stmt(%r)" % (self.nodes,)
1.712
1.713 + def __str__(self):
1.714 + return "\n".join(map(str, self.nodes))
1.715 +
1.716 def visit(self, visitor, *args):
1.717 return visitor.visitStmt(self, *args)
1.718
1.719 @@ -1371,6 +1619,9 @@
1.720 def __repr__(self):
1.721 return "Sub((%r, %r))" % (self.left, self.right)
1.722
1.723 + def __str__(self):
1.724 + return "%s - %s" % (self.left, self.right)
1.725 +
1.726 def visit(self, visitor, *args):
1.727 return visitor.visitSub(self, *args)
1.728
1.729 @@ -1397,6 +1648,9 @@
1.730 def __repr__(self):
1.731 return "Subscript(%r, %r, %r)" % (self.expr, self.flags, self.subs)
1.732
1.733 + def __str__(self):
1.734 + return "%s[%s]" % (self.expr, ",".join(map(str, self.subs)))
1.735 +
1.736 def visit(self, visitor, *args):
1.737 return visitor.visitSubscript(self, *args)
1.738
1.739 @@ -1425,6 +1679,18 @@
1.740 def __repr__(self):
1.741 return "TryExcept(%r, %r, %r)" % (self.body, self.handlers, self.else_)
1.742
1.743 + def __str__(self):
1.744 + handlers = [
1.745 + ("\nexcept%s%s:%s" % (spec and " %s" % spec or "", assign and ", %s" % assign or "", indent("\n%s" % statement)))
1.746 + for (spec, assign, statement) in self.handlers
1.747 + ]
1.748 +
1.749 + return "try:%s%s%s" % (
1.750 + indent("\n%s" % self.body),
1.751 + "".join(handlers),
1.752 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.753 + )
1.754 +
1.755 def visit(self, visitor, *args):
1.756 return visitor.visitTryExcept(self, *args)
1.757
1.758 @@ -1443,6 +1709,12 @@
1.759 def __repr__(self):
1.760 return "TryFinally(%r, %r)" % (self.body, self.final)
1.761
1.762 + def __str__(self):
1.763 + return "try:%s\nfinally:%s" % (
1.764 + indent("\n%s" % self.body),
1.765 + indent("\n%s" % self.final)
1.766 + )
1.767 +
1.768 def visit(self, visitor, *args):
1.769 return visitor.visitTryFinally(self, *args)
1.770
1.771 @@ -1462,6 +1734,9 @@
1.772 def __repr__(self):
1.773 return "Tuple(%r)" % (self.nodes,)
1.774
1.775 + def __str__(self):
1.776 + return "(%s)" % ", ".join(map(str, self.nodes))
1.777 +
1.778 def visit(self, visitor, *args):
1.779 return visitor.visitTuple(self, *args)
1.780
1.781 @@ -1479,6 +1754,9 @@
1.782 def __repr__(self):
1.783 return "UnaryAdd(%r)" % (self.expr,)
1.784
1.785 + def __str__(self):
1.786 + return "+%s" % self.expr
1.787 +
1.788 def visit(self, visitor, *args):
1.789 return visitor.visitUnaryAdd(self, *args)
1.790
1.791 @@ -1496,6 +1774,9 @@
1.792 def __repr__(self):
1.793 return "UnarySub(%r)" % (self.expr,)
1.794
1.795 + def __str__(self):
1.796 + return "-%s" % self.expr
1.797 +
1.798 def visit(self, visitor, *args):
1.799 return visitor.visitUnarySub(self, *args)
1.800
1.801 @@ -1524,6 +1805,13 @@
1.802 def __repr__(self):
1.803 return "While(%r, %r, %r)" % (self.test, self.body, self.else_)
1.804
1.805 + def __str__(self):
1.806 + return "while %s:%s%s" % (
1.807 + self.test,
1.808 + indent("\n%s" % self.body),
1.809 + self.else_ and "\nelse:%s" % indent("\n%s" % self.else_) or ""
1.810 + )
1.811 +
1.812 def visit(self, visitor, *args):
1.813 return visitor.visitWhile(self, *args)
1.814
1.815 @@ -1552,6 +1840,13 @@
1.816 def __repr__(self):
1.817 return "With(%r, %r, %r)" % (self.expr, self.vars, self.body)
1.818
1.819 + def __str__(self):
1.820 + return "with %s%s:%s" % (
1.821 + self.expr,
1.822 + self.vars and " as %s" % ", ".join(map(str, self.vars)),
1.823 + indent("\n%s" % self.body),
1.824 + )
1.825 +
1.826 def visit(self, visitor, *args):
1.827 return visitor.visitWith(self, *args)
1.828
1.829 @@ -1569,6 +1864,9 @@
1.830 def __repr__(self):
1.831 return "Yield(%r)" % (self.value,)
1.832
1.833 + def __str__(self):
1.834 + return "yield %s" % self.value
1.835 +
1.836 def visit(self, visitor, *args):
1.837 return visitor.visitYield(self, *args)
1.838