1.1 --- a/compiler/ast.py Tue Mar 12 00:12:25 2013 +0100
1.2 +++ b/compiler/ast.py Wed May 01 23:23:54 2013 +0200
1.3 @@ -80,6 +80,27 @@
1.4 self._attrtypes = None
1.5 self._attrspecifictypes = None
1.6
1.7 +class AttributeAccessor:
1.8 +
1.9 + "Access-related node."
1.10 +
1.11 + def __init__(self):
1.12 + self._attr = None
1.13 + self._attrusers = None
1.14 + self._username = None
1.15 +
1.16 + # Deductions.
1.17 +
1.18 + self._access_type = None
1.19 + self._value_deduced = None
1.20 + self._attr_deduced = None
1.21 + self._set_context = None
1.22 +
1.23 + self._attrs_deduced = None
1.24 + self._attrs_deduced_from_usage = None
1.25 + self._attrs_deduced_from_specific_usage = None
1.26 + self._position_deduced = None
1.27 +
1.28 class OperatorUser:
1.29
1.30 "Operator-related node."
1.31 @@ -105,7 +126,7 @@
1.32 pass # implemented by subclasses
1.33
1.34 def visit(self, visitor, *args):
1.35 - visitor.default(self, *args)
1.36 + return visitor.default(self, *args)
1.37
1.38 class EmptyNode(Node):
1.39 pass
1.40 @@ -178,9 +199,10 @@
1.41 def visit(self, visitor, *args):
1.42 return visitor.visitAnd(self, *args)
1.43
1.44 -class AssAttr(Node):
1.45 +class AssAttr(Node, AttributeAccessor):
1.46 def __init__(self, expr, attrname, flags, lineno=None):
1.47 Node.__init__(self)
1.48 + AttributeAccessor.__init__(self)
1.49 self.expr = expr
1.50 self.attrname = attrname
1.51 self.flags = flags
1.52 @@ -189,9 +211,6 @@
1.53 # Additional annotations.
1.54
1.55 self._expr = None
1.56 - self._attr = None
1.57 - self._attrusers = None
1.58 - self._username = None
1.59
1.60 def getChildren(self):
1.61 return self.expr, self.attrname, self.flags
1.62 @@ -553,7 +572,7 @@
1.63 self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.64 self.name,
1.65 self.bases and "(%s)" % ", ".join(map(str, self.bases)) or "",
1.66 - indent(self.doc and "\n%s" % docstring(self.doc) or ""),
1.67 + self.doc and "\n\t" + docstring(self.doc) or "",
1.68 indent("\n%s" % self.code)
1.69 )
1.70
1.71 @@ -768,7 +787,7 @@
1.72 return "Exec(%r, %r, %r)" % (self.expr, self.locals, self.globals)
1.73
1.74 def __str__(self):
1.75 - return "exec %s%s%s" % (self.expr, self.locals and ", %s" % self.locals or "",
1.76 + return "exec %s%s%s" % (self.expr, self.locals and "in %s" % self.locals or "",
1.77 self.globals and ", %s" % self.globals or "")
1.78
1.79 def visit(self, visitor, *args):
1.80 @@ -910,7 +929,7 @@
1.81 self.decorators and "%s\n" % "\n".join([("@%s" % decorator) for decorator in self.decorators]) or "",
1.82 self.name,
1.83 ", ".join(parameters),
1.84 - indent(self.doc and "\n\n%s\n" % docstring(self.doc) or ""),
1.85 + self.doc and "\n\n\t%s\n" % docstring(self.doc) or "",
1.86 indent("\n%s" % self.code)
1.87 )
1.88
1.89 @@ -1024,9 +1043,10 @@
1.90 def visit(self, visitor, *args):
1.91 return visitor.visitGenExprInner(self, *args)
1.92
1.93 -class Getattr(Node):
1.94 +class Getattr(Node, AttributeAccessor):
1.95 def __init__(self, expr, attrname, lineno=None):
1.96 Node.__init__(self)
1.97 + AttributeAccessor.__init__(self)
1.98 self.expr = expr
1.99 self.attrname = attrname
1.100 self.lineno = lineno
1.101 @@ -1034,9 +1054,6 @@
1.102 # Additional annotations.
1.103
1.104 self._expr = None
1.105 - self._attr = None
1.106 - self._attrusers = None
1.107 - self._username = None
1.108
1.109 def getChildren(self):
1.110 return self.expr, self.attrname
1.111 @@ -1435,18 +1452,16 @@
1.112 def visit(self, visitor, *args):
1.113 return visitor.visitMul(self, *args)
1.114
1.115 -class Name(Node):
1.116 +class Name(Node, AttributeAccessor):
1.117 def __init__(self, name, lineno=None):
1.118 Node.__init__(self)
1.119 + AttributeAccessor.__init__(self)
1.120 self.name = name
1.121 self.lineno = lineno
1.122
1.123 # Additional annotations.
1.124
1.125 self._scope = None
1.126 - self._attr = None
1.127 - self._attrusers = None
1.128 - self._username = None
1.129
1.130 def getChildren(self):
1.131 return self.name,
1.132 @@ -1799,9 +1814,10 @@
1.133 def visit(self, visitor, *args):
1.134 return visitor.visitSub(self, *args)
1.135
1.136 -class Subscript(Node, OperatorUser):
1.137 +class Subscript(Node, AttributeAccessor, OperatorUser):
1.138 def __init__(self, expr, flags, subs, lineno=None):
1.139 Node.__init__(self)
1.140 + AttributeAccessor.__init__(self)
1.141 OperatorUser.__init__(self)
1.142 self.expr = expr
1.143 self.flags = flags
1.144 @@ -1811,9 +1827,6 @@
1.145 # Additional annotations.
1.146
1.147 self._expr = None
1.148 - self._attr = None
1.149 - self._attrusers = None
1.150 - self._username = None
1.151
1.152 def getChildren(self):
1.153 children = []