summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/compiler/ast.py8
-rw-r--r--Lib/compiler/transformer.py12
-rwxr-xr-xLib/token.py1
-rw-r--r--Tools/compiler/ast.txt4
4 files changed, 21 insertions, 4 deletions
diff --git a/Lib/compiler/ast.py b/Lib/compiler/ast.py
index 93437d6..43b1659 100644
--- a/Lib/compiler/ast.py
+++ b/Lib/compiler/ast.py
@@ -308,11 +308,12 @@ class CallFunc(Node):
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 @@ class Class(Node):
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):
diff --git a/Lib/compiler/transformer.py b/Lib/compiler/transformer.py
index 56cc1ef..8c367e2 100644
--- a/Lib/compiler/transformer.py
+++ b/Lib/compiler/transformer.py
@@ -232,6 +232,18 @@ class Transformer:
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
diff --git a/Lib/token.py b/Lib/token.py
index c4db6c5..8d5cdaa 100755
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -71,6 +71,7 @@ tok_name = {}
for _name, _value in globals().items():
if type(_value) is type(0):
tok_name[_value] = _name
+del _name, _value
def ISTERMINAL(x):
diff --git a/Tools/compiler/ast.txt b/Tools/compiler/ast.txt
index 7968a52..2dfb372 100644
--- a/Tools/compiler/ast.txt
+++ b/Tools/compiler/ast.txt
@@ -14,7 +14,7 @@ Stmt: nodes!
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 @@ init(Lambda):
self.kwargs = 1
init(GenExpr):
- self.argnames = ['[outmost-iterable]']
+ self.argnames = ['.0']
self.varargs = self.kwargs = None
init(GenExprFor):