]> granicus.if.org Git - python/commitdiff
Issue 2117. Update compiler module to handle class decorators.
authorFacundo Batista <facundobatista@gmail.com>
Mon, 25 Feb 2008 18:06:00 +0000 (18:06 +0000)
committerFacundo Batista <facundobatista@gmail.com>
Mon, 25 Feb 2008 18:06:00 +0000 (18:06 +0000)
Thanks Thomas Herve

Lib/compiler/ast.py
Lib/compiler/transformer.py
Lib/token.py
Tools/compiler/ast.txt

index 93437d6ceef07800e8d6ebaa9b6e6716438aff05..43b165987877b934cc1a6c60c46592d6d70ad86c 100644 (file)
@@ -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):
index 56cc1efe714635cd67d4a1bfdba57b67f07f7c06..8c367e2129308aa8e2654cdb35778314f7d306e4 100644 (file)
@@ -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
index c4db6c511af0f490f1083de4dca2c39da665ae2c..8d5cdaa1754afdfd87639e575cb0d168f41a8c88 100755 (executable)
@@ -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):
index 7968a52228cba437ec033a454dfa1805ecd0fc28..2dfb372f3cee91b4f9d45f4c85edfb1eb7032ca9 100644 (file)
@@ -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):