Index: Tools/compiler/ast.txt =================================================================== --- Tools/compiler/ast.txt (revision 61050) +++ Tools/compiler/ast.txt (working copy) @@ -14,7 +14,7 @@ Decorators: nodes! Function: decorators&, name*, argnames*, defaults!, flags*, doc*, code Lambda: argnames*, defaults!, flags*, code -Class: name*, bases!, doc*, code +Class: name*, bases!, doc*, code, decorators& = None Pass: Break: Continue: @@ -97,7 +97,7 @@ self.kwargs = 1 init(GenExpr): - self.argnames = ['[outmost-iterable]'] + self.argnames = ['.0'] self.varargs = self.kwargs = None init(GenExprFor): Index: Lib/token.py =================================================================== --- Lib/token.py (revision 61050) +++ Lib/token.py (working copy) @@ -71,6 +71,7 @@ for _name, _value in globals().items(): if type(_value) is type(0): tok_name[_value] = _name +del _name, _value def ISTERMINAL(x): Index: Lib/compiler/transformer.py =================================================================== --- Lib/compiler/transformer.py (revision 61050) +++ Lib/compiler/transformer.py (working copy) @@ -232,6 +232,18 @@ items.append(self.decorator(dec_nodelist[1:])) return Decorators(items) + def decorated(self, nodelist): + assert nodelist[0][0] == symbol.decorators + if nodelist[1][0] == symbol.funcdef: + n = [nodelist[0]] + list(nodelist[1][1:]) + return self.funcdef(n) + elif nodelist[1][0] == symbol.classdef: + decorators = self.decorators(nodelist[0][1:]) + cls = self.classdef(nodelist[1][1:]) + cls.decorators = decorators + return cls + raise WalkerError() + def funcdef(self, nodelist): # -6 -5 -4 -3 -2 -1 # funcdef: [decorators] 'def' NAME parameters ':' suite Index: Lib/compiler/ast.py =================================================================== --- Lib/compiler/ast.py (revision 61050) +++ Lib/compiler/ast.py (working copy) @@ -308,11 +308,12 @@ return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args)) class Class(Node): - def __init__(self, name, bases, doc, code, lineno=None): + def __init__(self, name, bases, doc, code, decorators = None, lineno=None): self.name = name self.bases = bases self.doc = doc self.code = code + self.decorators = decorators self.lineno = lineno def getChildren(self): @@ -321,16 +322,19 @@ children.extend(flatten(self.bases)) children.append(self.doc) children.append(self.code) + children.append(self.decorators) return tuple(children) def getChildNodes(self): nodelist = [] nodelist.extend(flatten_nodes(self.bases)) nodelist.append(self.code) + if self.decorators is not None: + nodelist.append(self.decorators) return tuple(nodelist) def __repr__(self): - return "Class(%s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code)) + return "Class(%s, %s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code), repr(self.decorators)) class Compare(Node): def __init__(self, expr, ops, lineno=None): @@ -556,7 +560,6 @@ self.kwargs = 1 - def getChildren(self): children = [] children.append(self.decorators) @@ -586,6 +589,7 @@ self.argnames = ['.0'] self.varargs = self.kwargs = None + def getChildren(self): return self.code, @@ -603,7 +607,6 @@ self.lineno = lineno self.is_outmost = False - def getChildren(self): children = [] children.append(self.assign) @@ -780,7 +783,6 @@ self.kwargs = 1 - def getChildren(self): children = [] children.append(self.argnames)