mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	Issue 2117. Update compiler module to handle class decorators.
Thanks Thomas Herve
This commit is contained in:
		
							parent
							
								
									a3c8c10201
								
							
						
					
					
						commit
						4219da4bd0
					
				
					 4 changed files with 21 additions and 4 deletions
				
			
		|  | @ -308,11 +308,12 @@ def __repr__(self): | |||
|         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 @@ def getChildren(self): | |||
|         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 @@ def decorators(self, nodelist): | |||
|             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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Facundo Batista
						Facundo Batista