Kaydet (Commit) 4219da4b authored tarafından Facundo Batista's avatar Facundo Batista

Issue 2117. Update compiler module to handle class decorators.

Thanks Thomas Herve
üst a3c8c102
...@@ -308,11 +308,12 @@ class CallFunc(Node): ...@@ -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)) return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args))
class Class(Node): 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.name = name
self.bases = bases self.bases = bases
self.doc = doc self.doc = doc
self.code = code self.code = code
self.decorators = decorators
self.lineno = lineno self.lineno = lineno
def getChildren(self): def getChildren(self):
...@@ -321,16 +322,19 @@ class Class(Node): ...@@ -321,16 +322,19 @@ class Class(Node):
children.extend(flatten(self.bases)) children.extend(flatten(self.bases))
children.append(self.doc) children.append(self.doc)
children.append(self.code) children.append(self.code)
children.append(self.decorators)
return tuple(children) return tuple(children)
def getChildNodes(self): def getChildNodes(self):
nodelist = [] nodelist = []
nodelist.extend(flatten_nodes(self.bases)) nodelist.extend(flatten_nodes(self.bases))
nodelist.append(self.code) nodelist.append(self.code)
if self.decorators is not None:
nodelist.append(self.decorators)
return tuple(nodelist) return tuple(nodelist)
def __repr__(self): 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): class Compare(Node):
def __init__(self, expr, ops, lineno=None): def __init__(self, expr, ops, lineno=None):
......
...@@ -232,6 +232,18 @@ class Transformer: ...@@ -232,6 +232,18 @@ class Transformer:
items.append(self.decorator(dec_nodelist[1:])) items.append(self.decorator(dec_nodelist[1:]))
return Decorators(items) 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): def funcdef(self, nodelist):
# -6 -5 -4 -3 -2 -1 # -6 -5 -4 -3 -2 -1
# funcdef: [decorators] 'def' NAME parameters ':' suite # funcdef: [decorators] 'def' NAME parameters ':' suite
......
...@@ -71,6 +71,7 @@ tok_name = {} ...@@ -71,6 +71,7 @@ tok_name = {}
for _name, _value in globals().items(): for _name, _value in globals().items():
if type(_value) is type(0): if type(_value) is type(0):
tok_name[_value] = _name tok_name[_value] = _name
del _name, _value
def ISTERMINAL(x): def ISTERMINAL(x):
......
...@@ -14,7 +14,7 @@ Stmt: nodes! ...@@ -14,7 +14,7 @@ Stmt: nodes!
Decorators: nodes! Decorators: nodes!
Function: decorators&, name*, argnames*, defaults!, flags*, doc*, code Function: decorators&, name*, argnames*, defaults!, flags*, doc*, code
Lambda: argnames*, defaults!, flags*, code Lambda: argnames*, defaults!, flags*, code
Class: name*, bases!, doc*, code Class: name*, bases!, doc*, code, decorators& = None
Pass: Pass:
Break: Break:
Continue: Continue:
...@@ -97,7 +97,7 @@ init(Lambda): ...@@ -97,7 +97,7 @@ init(Lambda):
self.kwargs = 1 self.kwargs = 1
init(GenExpr): init(GenExpr):
self.argnames = ['[outmost-iterable]'] self.argnames = ['.0']
self.varargs = self.kwargs = None self.varargs = self.kwargs = None
init(GenExprFor): init(GenExprFor):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment