Issue 2117. Update compiler module to handle class decorators.
Thanks Thomas Herve
This commit is contained in:
parent
a3c8c10201
commit
4219da4bd0
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue