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