1.1 --- a/compiler/ast.py Sat Jul 14 19:32:22 2012 +0200
1.2 +++ b/compiler/ast.py Sat Jul 14 19:36:46 2012 +0200
1.3 @@ -40,17 +40,46 @@
1.4
1.5 nodes = {}
1.6
1.7 -class Node:
1.8 - """Abstract base class for ast nodes."""
1.9 +class AttributeUser:
1.10 +
1.11 + "Annotation-related node."
1.12 +
1.13 + def __init__(self):
1.14 +
1.15 + # Name and usage observations.
1.16 +
1.17 + self._attrnames = None
1.18 + self._attrcombined = None
1.19 + self._attrmerged = None
1.20 +
1.21 + # Related nodes.
1.22 +
1.23 + self._attrbranches = None
1.24 + self._attrcontributors = None
1.25 + self._attrdefs = None
1.26 +
1.27 + # Deductions.
1.28 +
1.29 + self._attrtypes = None
1.30 + self._attrspecifictypes = None
1.31 +
1.32 +class Node(AttributeUser):
1.33 +
1.34 + "Abstract base class for ast nodes."
1.35 +
1.36 def getChildren(self):
1.37 pass # implemented by subclasses
1.38 +
1.39 def __iter__(self):
1.40 for n in self.getChildren():
1.41 yield n
1.42 +
1.43 def asList(self): # for backwards compatibility
1.44 return self.getChildren()
1.45 +
1.46 def getChildNodes(self):
1.47 pass # implemented by subclasses
1.48 +
1.49 def visit(self, visitor, *args):
1.50 visitor.default(self, *args)
1.51
1.52 @@ -61,6 +90,7 @@
1.53 # Expression is an artificial node class to support "eval"
1.54 nodes["expression"] = "Expression"
1.55 def __init__(self, node):
1.56 + Node.__init__(self)
1.57 self.node = node
1.58
1.59 def getChildren(self):
1.60 @@ -80,6 +110,7 @@
1.61
1.62 class Add(Node):
1.63 def __init__(self, leftright, lineno=None):
1.64 + Node.__init__(self)
1.65 self.left = leftright[0]
1.66 self.right = leftright[1]
1.67 self.lineno = lineno
1.68 @@ -101,6 +132,7 @@
1.69
1.70 class And(Node):
1.71 def __init__(self, nodes, lineno=None):
1.72 + Node.__init__(self)
1.73 self.nodes = nodes
1.74 self.lineno = lineno
1.75
1.76 @@ -123,11 +155,17 @@
1.77
1.78 class AssAttr(Node):
1.79 def __init__(self, expr, attrname, flags, lineno=None):
1.80 + Node.__init__(self)
1.81 self.expr = expr
1.82 self.attrname = attrname
1.83 self.flags = flags
1.84 self.lineno = lineno
1.85
1.86 + # Additional annotations.
1.87 +
1.88 + self._attr = None
1.89 + self._attrusers = None
1.90 +
1.91 def getChildren(self):
1.92 return self.expr, self.attrname, self.flags
1.93
1.94 @@ -148,6 +186,7 @@
1.95
1.96 class AssList(Node):
1.97 def __init__(self, nodes, lineno=None):
1.98 + Node.__init__(self)
1.99 self.nodes = nodes
1.100 self.lineno = lineno
1.101
1.102 @@ -170,6 +209,7 @@
1.103
1.104 class AssName(Node):
1.105 def __init__(self, name, flags, lineno=None):
1.106 + Node.__init__(self)
1.107 self.name = name
1.108 self.flags = flags
1.109 self.lineno = lineno
1.110 @@ -194,6 +234,7 @@
1.111
1.112 class AssTuple(Node):
1.113 def __init__(self, nodes, lineno=None):
1.114 + Node.__init__(self)
1.115 self.nodes = nodes
1.116 self.lineno = lineno
1.117
1.118 @@ -216,6 +257,7 @@
1.119
1.120 class Assert(Node):
1.121 def __init__(self, test, fail, lineno=None):
1.122 + Node.__init__(self)
1.123 self.test = test
1.124 self.fail = fail
1.125 self.lineno = lineno
1.126 @@ -244,6 +286,7 @@
1.127
1.128 class Assign(Node):
1.129 def __init__(self, nodes, expr, lineno=None):
1.130 + Node.__init__(self)
1.131 self.nodes = nodes
1.132 self.expr = expr
1.133 self.lineno = lineno
1.134 @@ -271,6 +314,7 @@
1.135
1.136 class AugAssign(Node):
1.137 def __init__(self, node, op, expr, lineno=None):
1.138 + Node.__init__(self)
1.139 self.node = node
1.140 self.op = op
1.141 self.expr = expr
1.142 @@ -293,6 +337,7 @@
1.143
1.144 class Backquote(Node):
1.145 def __init__(self, expr, lineno=None):
1.146 + Node.__init__(self)
1.147 self.expr = expr
1.148 self.lineno = lineno
1.149
1.150 @@ -313,6 +358,7 @@
1.151
1.152 class Bitand(Node):
1.153 def __init__(self, nodes, lineno=None):
1.154 + Node.__init__(self)
1.155 self.nodes = nodes
1.156 self.lineno = lineno
1.157
1.158 @@ -335,6 +381,7 @@
1.159
1.160 class Bitor(Node):
1.161 def __init__(self, nodes, lineno=None):
1.162 + Node.__init__(self)
1.163 self.nodes = nodes
1.164 self.lineno = lineno
1.165
1.166 @@ -357,6 +404,7 @@
1.167
1.168 class Bitxor(Node):
1.169 def __init__(self, nodes, lineno=None):
1.170 + Node.__init__(self)
1.171 self.nodes = nodes
1.172 self.lineno = lineno
1.173
1.174 @@ -379,6 +427,7 @@
1.175
1.176 class Break(Node):
1.177 def __init__(self, lineno=None):
1.178 + Node.__init__(self)
1.179 self.lineno = lineno
1.180
1.181 def getChildren(self):
1.182 @@ -398,6 +447,7 @@
1.183
1.184 class CallFunc(Node):
1.185 def __init__(self, node, args, star_args = None, dstar_args = None, lineno=None):
1.186 + Node.__init__(self)
1.187 self.node = node
1.188 self.args = args
1.189 self.star_args = star_args
1.190 @@ -435,6 +485,7 @@
1.191
1.192 class Class(Node):
1.193 def __init__(self, name, bases, doc, code, decorators = None, lineno=None):
1.194 + Node.__init__(self)
1.195 self.name = name
1.196 self.bases = bases
1.197 self.doc = doc
1.198 @@ -476,6 +527,7 @@
1.199
1.200 class Compare(Node):
1.201 def __init__(self, expr, ops, lineno=None):
1.202 + Node.__init__(self)
1.203 self.expr = expr
1.204 self.ops = ops
1.205 self.lineno = lineno
1.206 @@ -503,6 +555,7 @@
1.207
1.208 class Const(Node):
1.209 def __init__(self, value, lineno=None):
1.210 + Node.__init__(self)
1.211 self.value = value
1.212 self.lineno = lineno
1.213
1.214 @@ -523,6 +576,7 @@
1.215
1.216 class Continue(Node):
1.217 def __init__(self, lineno=None):
1.218 + Node.__init__(self)
1.219 self.lineno = lineno
1.220
1.221 def getChildren(self):
1.222 @@ -542,6 +596,7 @@
1.223
1.224 class Decorators(Node):
1.225 def __init__(self, nodes, lineno=None):
1.226 + Node.__init__(self)
1.227 self.nodes = nodes
1.228 self.lineno = lineno
1.229
1.230 @@ -564,6 +619,7 @@
1.231
1.232 class Dict(Node):
1.233 def __init__(self, items, lineno=None):
1.234 + Node.__init__(self)
1.235 self.items = items
1.236 self.lineno = lineno
1.237
1.238 @@ -586,6 +642,7 @@
1.239
1.240 class Discard(Node):
1.241 def __init__(self, expr, lineno=None):
1.242 + Node.__init__(self)
1.243 self.expr = expr
1.244 self.lineno = lineno
1.245
1.246 @@ -606,6 +663,7 @@
1.247
1.248 class Div(Node):
1.249 def __init__(self, leftright, lineno=None):
1.250 + Node.__init__(self)
1.251 self.left = leftright[0]
1.252 self.right = leftright[1]
1.253 self.lineno = lineno
1.254 @@ -627,6 +685,7 @@
1.255
1.256 class Ellipsis(Node):
1.257 def __init__(self, lineno=None):
1.258 + Node.__init__(self)
1.259 self.lineno = lineno
1.260
1.261 def getChildren(self):
1.262 @@ -646,6 +705,7 @@
1.263
1.264 class Exec(Node):
1.265 def __init__(self, expr, locals, globals, lineno=None):
1.266 + Node.__init__(self)
1.267 self.expr = expr
1.268 self.locals = locals
1.269 self.globals = globals
1.270 @@ -679,6 +739,7 @@
1.271
1.272 class FloorDiv(Node):
1.273 def __init__(self, leftright, lineno=None):
1.274 + Node.__init__(self)
1.275 self.left = leftright[0]
1.276 self.right = leftright[1]
1.277 self.lineno = lineno
1.278 @@ -700,6 +761,7 @@
1.279
1.280 class For(Node):
1.281 def __init__(self, assign, list, body, else_, lineno=None):
1.282 + Node.__init__(self)
1.283 self.assign = assign
1.284 self.list = list
1.285 self.body = body
1.286 @@ -738,6 +800,7 @@
1.287
1.288 class From(Node):
1.289 def __init__(self, modname, names, level, lineno=None):
1.290 + Node.__init__(self)
1.291 self.modname = modname
1.292 self.names = names
1.293 self.level = level
1.294 @@ -761,6 +824,7 @@
1.295
1.296 class Function(Node):
1.297 def __init__(self, decorators, name, argnames, defaults, flags, doc, code, lineno=None):
1.298 + Node.__init__(self)
1.299 self.decorators = decorators
1.300 self.name = name
1.301 self.argnames = argnames
1.302 @@ -813,6 +877,7 @@
1.303
1.304 class GenExpr(Node):
1.305 def __init__(self, code, lineno=None):
1.306 + Node.__init__(self)
1.307 self.code = code
1.308 self.lineno = lineno
1.309 self.argnames = ['.0']
1.310 @@ -835,6 +900,7 @@
1.311
1.312 class GenExprFor(Node):
1.313 def __init__(self, assign, iter, ifs, lineno=None):
1.314 + Node.__init__(self)
1.315 self.assign = assign
1.316 self.iter = iter
1.317 self.ifs = ifs
1.318 @@ -869,6 +935,7 @@
1.319
1.320 class GenExprIf(Node):
1.321 def __init__(self, test, lineno=None):
1.322 + Node.__init__(self)
1.323 self.test = test
1.324 self.lineno = lineno
1.325
1.326 @@ -889,6 +956,7 @@
1.327
1.328 class GenExprInner(Node):
1.329 def __init__(self, expr, quals, lineno=None):
1.330 + Node.__init__(self)
1.331 self.expr = expr
1.332 self.quals = quals
1.333 self.lineno = lineno
1.334 @@ -916,10 +984,16 @@
1.335
1.336 class Getattr(Node):
1.337 def __init__(self, expr, attrname, lineno=None):
1.338 + Node.__init__(self)
1.339 self.expr = expr
1.340 self.attrname = attrname
1.341 self.lineno = lineno
1.342
1.343 + # Additional annotations.
1.344 +
1.345 + self._attr = None
1.346 + self._attrusers = None
1.347 +
1.348 def getChildren(self):
1.349 return self.expr, self.attrname
1.350
1.351 @@ -937,6 +1011,7 @@
1.352
1.353 class Global(Node):
1.354 def __init__(self, names, lineno=None):
1.355 + Node.__init__(self)
1.356 self.names = names
1.357 self.lineno = lineno
1.358
1.359 @@ -957,6 +1032,7 @@
1.360
1.361 class If(Node):
1.362 def __init__(self, tests, else_, lineno=None):
1.363 + Node.__init__(self)
1.364 self.tests = tests
1.365 self.else_ = else_
1.366 self.lineno = lineno
1.367 @@ -989,6 +1065,7 @@
1.368
1.369 class IfExp(Node):
1.370 def __init__(self, test, then, else_, lineno=None):
1.371 + Node.__init__(self)
1.372 self.test = test
1.373 self.then = then
1.374 self.else_ = else_
1.375 @@ -1011,6 +1088,7 @@
1.376
1.377 class Import(Node):
1.378 def __init__(self, names, lineno=None):
1.379 + Node.__init__(self)
1.380 self.names = names
1.381 self.lineno = lineno
1.382
1.383 @@ -1032,6 +1110,7 @@
1.384
1.385 class Invert(Node):
1.386 def __init__(self, expr, lineno=None):
1.387 + Node.__init__(self)
1.388 self.expr = expr
1.389 self.lineno = lineno
1.390
1.391 @@ -1052,6 +1131,7 @@
1.392
1.393 class Keyword(Node):
1.394 def __init__(self, name, expr, lineno=None):
1.395 + Node.__init__(self)
1.396 self.name = name
1.397 self.expr = expr
1.398 self.lineno = lineno
1.399 @@ -1073,6 +1153,7 @@
1.400
1.401 class Lambda(Node):
1.402 def __init__(self, argnames, defaults, flags, code, lineno=None):
1.403 + Node.__init__(self)
1.404 self.argnames = argnames
1.405 self.defaults = defaults
1.406 self.flags = flags
1.407 @@ -1110,6 +1191,7 @@
1.408
1.409 class LeftShift(Node):
1.410 def __init__(self, leftright, lineno=None):
1.411 + Node.__init__(self)
1.412 self.left = leftright[0]
1.413 self.right = leftright[1]
1.414 self.lineno = lineno
1.415 @@ -1131,6 +1213,7 @@
1.416
1.417 class List(Node):
1.418 def __init__(self, nodes, lineno=None):
1.419 + Node.__init__(self)
1.420 self.nodes = nodes
1.421 self.lineno = lineno
1.422
1.423 @@ -1153,6 +1236,7 @@
1.424
1.425 class ListComp(Node):
1.426 def __init__(self, expr, quals, lineno=None):
1.427 + Node.__init__(self)
1.428 self.expr = expr
1.429 self.quals = quals
1.430 self.lineno = lineno
1.431 @@ -1180,6 +1264,7 @@
1.432
1.433 class ListCompFor(Node):
1.434 def __init__(self, assign, list, ifs, lineno=None):
1.435 + Node.__init__(self)
1.436 self.assign = assign
1.437 self.list = list
1.438 self.ifs = ifs
1.439 @@ -1213,6 +1298,7 @@
1.440
1.441 class ListCompIf(Node):
1.442 def __init__(self, test, lineno=None):
1.443 + Node.__init__(self)
1.444 self.test = test
1.445 self.lineno = lineno
1.446
1.447 @@ -1290,6 +1376,7 @@
1.448
1.449 class Mod(Node):
1.450 def __init__(self, leftright, lineno=None):
1.451 + Node.__init__(self)
1.452 self.left = leftright[0]
1.453 self.right = leftright[1]
1.454 self.lineno = lineno
1.455 @@ -1311,6 +1398,7 @@
1.456
1.457 class Module(Node):
1.458 def __init__(self, doc, node, lineno=None):
1.459 + Node.__init__(self)
1.460 self.doc = doc
1.461 self.node = node
1.462 self.lineno = lineno
1.463 @@ -1332,6 +1420,7 @@
1.464
1.465 class Mul(Node):
1.466 def __init__(self, leftright, lineno=None):
1.467 + Node.__init__(self)
1.468 self.left = leftright[0]
1.469 self.right = leftright[1]
1.470 self.lineno = lineno
1.471 @@ -1353,9 +1442,15 @@
1.472
1.473 class Name(Node):
1.474 def __init__(self, name, lineno=None):
1.475 + Node.__init__(self)
1.476 self.name = name
1.477 self.lineno = lineno
1.478
1.479 + # Additional annotations.
1.480 +
1.481 + self._scope = None
1.482 + self._attr = None
1.483 +
1.484 def getChildren(self):
1.485 return self.name,
1.486
1.487 @@ -1373,6 +1468,7 @@
1.488
1.489 class Not(Node):
1.490 def __init__(self, expr, lineno=None):
1.491 + Node.__init__(self)
1.492 self.expr = expr
1.493 self.lineno = lineno
1.494
1.495 @@ -1393,6 +1489,7 @@
1.496
1.497 class Or(Node):
1.498 def __init__(self, nodes, lineno=None):
1.499 + Node.__init__(self)
1.500 self.nodes = nodes
1.501 self.lineno = lineno
1.502
1.503 @@ -1415,6 +1512,7 @@
1.504
1.505 class Pass(Node):
1.506 def __init__(self, lineno=None):
1.507 + Node.__init__(self)
1.508 self.lineno = lineno
1.509
1.510 def getChildren(self):
1.511 @@ -1434,6 +1532,7 @@
1.512
1.513 class Power(Node):
1.514 def __init__(self, leftright, lineno=None):
1.515 + Node.__init__(self)
1.516 self.left = leftright[0]
1.517 self.right = leftright[1]
1.518 self.lineno = lineno
1.519 @@ -1455,6 +1554,7 @@
1.520
1.521 class Print(Node):
1.522 def __init__(self, nodes, dest, lineno=None):
1.523 + Node.__init__(self)
1.524 self.nodes = nodes
1.525 self.dest = dest
1.526 self.lineno = lineno
1.527 @@ -1484,6 +1584,7 @@
1.528
1.529 class Printnl(Node):
1.530 def __init__(self, nodes, dest, lineno=None):
1.531 + Node.__init__(self)
1.532 self.nodes = nodes
1.533 self.dest = dest
1.534 self.lineno = lineno
1.535 @@ -1513,6 +1614,7 @@
1.536
1.537 class Raise(Node):
1.538 def __init__(self, expr1, expr2, expr3, lineno=None):
1.539 + Node.__init__(self)
1.540 self.expr1 = expr1
1.541 self.expr2 = expr2
1.542 self.expr3 = expr3
1.543 @@ -1549,6 +1651,7 @@
1.544
1.545 class Return(Node):
1.546 def __init__(self, value, lineno=None):
1.547 + Node.__init__(self)
1.548 self.value = value
1.549 self.lineno = lineno
1.550
1.551 @@ -1569,6 +1672,7 @@
1.552
1.553 class RightShift(Node):
1.554 def __init__(self, leftright, lineno=None):
1.555 + Node.__init__(self)
1.556 self.left = leftright[0]
1.557 self.right = leftright[1]
1.558 self.lineno = lineno
1.559 @@ -1612,6 +1716,7 @@
1.560
1.561 class Slice(Node):
1.562 def __init__(self, expr, flags, lower, upper, lineno=None):
1.563 + Node.__init__(self)
1.564 self.expr = expr
1.565 self.flags = flags
1.566 self.lower = lower
1.567 @@ -1649,6 +1754,7 @@
1.568
1.569 class Sliceobj(Node):
1.570 def __init__(self, nodes, lineno=None):
1.571 + Node.__init__(self)
1.572 self.nodes = nodes
1.573 self.lineno = lineno
1.574
1.575 @@ -1671,6 +1777,7 @@
1.576
1.577 class Stmt(Node):
1.578 def __init__(self, nodes, lineno=None):
1.579 + Node.__init__(self)
1.580 self.nodes = nodes
1.581 self.lineno = lineno
1.582
1.583 @@ -1693,6 +1800,7 @@
1.584
1.585 class Sub(Node):
1.586 def __init__(self, leftright, lineno=None):
1.587 + Node.__init__(self)
1.588 self.left = leftright[0]
1.589 self.right = leftright[1]
1.590 self.lineno = lineno
1.591 @@ -1714,6 +1822,7 @@
1.592
1.593 class Subscript(Node):
1.594 def __init__(self, expr, flags, subs, lineno=None):
1.595 + Node.__init__(self)
1.596 self.expr = expr
1.597 self.flags = flags
1.598 self.subs = subs
1.599 @@ -1743,6 +1852,7 @@
1.600
1.601 class TryExcept(Node):
1.602 def __init__(self, body, handlers, else_, lineno=None):
1.603 + Node.__init__(self)
1.604 self.body = body
1.605 self.handlers = handlers
1.606 self.else_ = else_
1.607 @@ -1783,6 +1893,7 @@
1.608
1.609 class TryFinally(Node):
1.610 def __init__(self, body, final, lineno=None):
1.611 + Node.__init__(self)
1.612 self.body = body
1.613 self.final = final
1.614 self.lineno = lineno
1.615 @@ -1807,6 +1918,7 @@
1.616
1.617 class Tuple(Node):
1.618 def __init__(self, nodes, lineno=None):
1.619 + Node.__init__(self)
1.620 self.nodes = nodes
1.621 self.lineno = lineno
1.622
1.623 @@ -1829,6 +1941,7 @@
1.624
1.625 class UnaryAdd(Node):
1.626 def __init__(self, expr, lineno=None):
1.627 + Node.__init__(self)
1.628 self.expr = expr
1.629 self.lineno = lineno
1.630
1.631 @@ -1849,6 +1962,7 @@
1.632
1.633 class UnarySub(Node):
1.634 def __init__(self, expr, lineno=None):
1.635 + Node.__init__(self)
1.636 self.expr = expr
1.637 self.lineno = lineno
1.638
1.639 @@ -1869,6 +1983,7 @@
1.640
1.641 class While(Node):
1.642 def __init__(self, test, body, else_, lineno=None):
1.643 + Node.__init__(self)
1.644 self.test = test
1.645 self.body = body
1.646 self.else_ = else_
1.647 @@ -1904,6 +2019,7 @@
1.648
1.649 class With(Node):
1.650 def __init__(self, expr, vars, body, lineno=None):
1.651 + Node.__init__(self)
1.652 self.expr = expr
1.653 self.vars = vars
1.654 self.body = body
1.655 @@ -1939,6 +2055,7 @@
1.656
1.657 class Yield(Node):
1.658 def __init__(self, value, lineno=None):
1.659 + Node.__init__(self)
1.660 self.value = value
1.661 self.lineno = lineno
1.662