14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""Fixer for __metaclass__ = X -> (metaclass=X) methods. 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm The various forms of classef (inherits nothing, inherits once, inherints 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm many) don't parse the same in the CST so we look at ALL classes for 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a __metaclass__ and if we find one normalize the inherits to all be 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm an arglist. 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm For one-liner classes ('class X: pass') there is no indent/dedent so 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm we normalize those into having a suite. 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Moving the __metaclass__ into the classdef can also cause the class 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm body to be empty so there is some special casing for that as well. 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm This fixer also tries very hard to keep original indenting and spacing 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm in all those corner cases. 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm""" 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Author: Jack Diederich 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Local imports 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .. import fixer_base 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom ..pygram import token 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom ..fixer_util import Name, syms, Node, Leaf 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef has_metaclass(parent): 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ we have to check the cls_node without changing it. 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm There are two possiblities: 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1) clsdef => suite => simple_stmt => expr_stmt => Leaf('__meta') 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2) clsdef => simple_stmt => expr_stmt => Leaf('__meta') 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in parent.children: 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == syms.suite: 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return has_metaclass(node) 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif node.type == syms.simple_stmt and node.children: 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr_node = node.children[0] 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if expr_node.type == syms.expr_stmt and expr_node.children: 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left_side = expr_node.children[0] 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(left_side, Leaf) and \ 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left_side.value == '__metaclass__': 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return True 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return False 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef fixup_parse_tree(cls_node): 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ one-line classes don't get a suite in the parse tree so we add 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm one to normalize the tree 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in cls_node.children: 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == syms.suite: 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # already in the preferred format, do nothing 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # !%@#! oneliners have no suite node, we have to fake one up 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i, node in enumerate(cls_node.children): 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == token.COLON: 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("No class suite and no ':'!") 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # move everything into a suite node 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite = Node(syms.suite, []) 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while cls_node.children[i+1:]: 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm move_node = cls_node.children[i+1] 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite.append_child(move_node.clone()) 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm move_node.remove() 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cls_node.append_child(suite) 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = suite 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef fixup_simple_stmt(parent, i, stmt_node): 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ if there is a semi-colon all the parts count as part of the same 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm simple_stmt. We just want the __metaclass__ part so we move 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm everything efter the semi-colon into its own simple_stmt node 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for semi_ind, node in enumerate(stmt_node.children): 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == token.SEMI: # *sigh* 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.remove() # kill the semicolon 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_expr = Node(syms.expr_stmt, []) 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_stmt = Node(syms.simple_stmt, [new_expr]) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while stmt_node.children[semi_ind:]: 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm move_node = stmt_node.children[semi_ind] 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_expr.append_child(move_node.clone()) 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm move_node.remove() 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm parent.insert_child(i, new_stmt) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_leaf1 = new_stmt.children[0].children[0] 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm old_leaf1 = stmt_node.children[0].children[0] 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm new_leaf1.prefix = old_leaf1.prefix 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef remove_trailing_newline(node): 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.children and node.children[-1].type == token.NEWLINE: 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.children[-1].remove() 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef find_metas(cls_node): 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # find the suite node (Mmm, sweet nodes) 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for node in cls_node.children: 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == syms.suite: 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("No class suite!") 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # look for simple_stmt[ expr_stmt[ Leaf('__metaclass__') ] ] 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i, simple_node in list(enumerate(node.children)): 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if simple_node.type == syms.simple_stmt and simple_node.children: 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr_node = simple_node.children[0] 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if expr_node.type == syms.expr_stmt and expr_node.children: 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Check if the expr_node is a simple assignment. 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left_node = expr_node.children[0] 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(left_node, Leaf) and \ 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm left_node.value == u'__metaclass__': 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # We found a assignment to __metaclass__. 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fixup_simple_stmt(node, i, simple_node) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm remove_trailing_newline(simple_node) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm yield (node, i, simple_node) 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef fixup_indent(suite): 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ If an INDENT is followed by a thing with a prefix then nuke the prefix 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm Otherwise we get in trouble when removing __metaclass__ at suite start 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kids = suite.children[::-1] 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # find the first indent 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while kids: 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = kids.pop() 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.type == token.INDENT: 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm break 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # find the first Leaf 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while kids: 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node = kids.pop() 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(node, Leaf) and node.type != token.DEDENT: 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.prefix: 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.prefix = u'' 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kids.extend(node.children[::-1]) 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass FixMetaclass(fixer_base.BaseFix): 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BM_compatible = True 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm PATTERN = """ 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm classdef<any*> 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """ 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def transform(self, node, results): 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not has_metaclass(node): 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fixup_parse_tree(node) 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # find metaclasses, keep the last one 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm last_metaclass = None 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for suite, i, stmt in find_metas(node): 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm last_metaclass = stmt 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm stmt.remove() 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm text_type = node.children[0].type # always Leaf(nnn, 'class') 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # figure out what kind of classdef we have 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if len(node.children) == 7: 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Node(classdef, ['class', 'name', '(', arglist, ')', ':', suite]) 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 0 1 2 3 4 5 6 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if node.children[3].type == syms.arglist: 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist = node.children[3] 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Node(classdef, ['class', 'name', '(', 'Parent', ')', ':', suite]) 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm parent = node.children[3].clone() 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist = Node(syms.arglist, [parent]) 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.set_child(3, arglist) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(node.children) == 6: 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Node(classdef, ['class', 'name', '(', ')', ':', suite]) 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 0 1 2 3 4 5 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist = Node(syms.arglist, []) 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.insert_child(3, arglist) 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(node.children) == 4: 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Node(classdef, ['class', 'name', ':', suite]) 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 0 1 2 3 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist = Node(syms.arglist, []) 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.insert_child(2, Leaf(token.RPAR, u')')) 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.insert_child(2, arglist) 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.insert_child(2, Leaf(token.LPAR, u'(')) 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise ValueError("Unexpected class definition") 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # now stick the metaclass in the arglist 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm meta_txt = last_metaclass.children[0].children[0] 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm meta_txt.value = 'metaclass' 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm orig_meta_prefix = meta_txt.prefix 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if arglist.children: 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist.append_child(Leaf(token.COMMA, u',')) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm meta_txt.prefix = u' ' 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm meta_txt.prefix = u'' 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # compact the expression "metaclass = Meta" -> "metaclass=Meta" 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr_stmt = last_metaclass.children[0] 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert expr_stmt.type == syms.expr_stmt 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr_stmt.children[1].prefix = u'' 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expr_stmt.children[2].prefix = u'' 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm arglist.append_child(last_metaclass) 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fixup_indent(suite) 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check for empty suite 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not suite.children: 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # one-liner that was just __metaclass_ 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite.remove() 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass_leaf = Leaf(text_type, u'pass') 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass_leaf.prefix = orig_meta_prefix 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.append_child(pass_leaf) 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm node.append_child(Leaf(token.NEWLINE, u'\n')) 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm elif len(suite.children) > 1 and \ 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm (suite.children[-2].type == token.INDENT and 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite.children[-1].type == token.DEDENT): 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # there was only one line in the class body and it was __metaclass__ 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass_leaf = Leaf(text_type, u'pass') 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite.insert_child(-1, pass_leaf) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm suite.insert_child(-1, Leaf(token.NEWLINE, u'\n')) 229