/
usr
/
lib
/
python2.6
/
lib2to3
/
fixes
/
/usr/lib/python2.6/lib2to3/fixes
mkdir
upload
Name
Size
Mode
Actions
fix_apply.py
1879
0644
edit
dl
rm
fix_apply.pyc
1852
0644
edit
dl
rm
fix_apply.pyo
1817
0644
edit
dl
rm
fix_basestring.py
296
0644
edit
dl
rm
fix_basestring.pyc
766
0644
edit
dl
rm
fix_basestring.pyo
766
0644
edit
dl
rm
fix_buffer.py
566
0644
edit
dl
rm
fix_buffer.pyc
932
0644
edit
dl
rm
fix_buffer.pyo
932
0644
edit
dl
rm
fix_callable.py
1112
0644
edit
dl
rm
fix_callable.pyc
1440
0644
edit
dl
rm
fix_callable.pyo
1440
0644
edit
dl
rm
fix_dict.py
3798
0644
edit
dl
rm
fix_dict.pyc
3781
0644
edit
dl
rm
fix_dict.pyo
3657
0644
edit
dl
rm
fix_except.py
3327
0644
edit
dl
rm
fix_except.pyc
3040
0644
edit
dl
rm
fix_except.pyo
3040
0644
edit
dl
rm
fix_exec.py
977
0644
edit
dl
rm
fix_exec.pyc
1397
0644
edit
dl
rm
fix_exec.pyo
1362
0644
edit
dl
rm
fix_execfile.py
1973
0644
edit
dl
rm
fix_execfile.pyc
2038
0644
edit
dl
rm
fix_execfile.pyo
2003
0644
edit
dl
rm
fix_exitfunc.py
2453
0644
edit
dl
rm
fix_exitfunc.pyc
2692
0644
edit
dl
rm
fix_exitfunc.pyo
2692
0644
edit
dl
rm
fix_filter.py
2082
0644
edit
dl
rm
fix_filter.pyc
2237
0644
edit
dl
rm
fix_filter.pyo
2237
0644
edit
dl
rm
fix_funcattrs.py
619
0644
edit
dl
rm
fix_funcattrs.pyc
1087
0644
edit
dl
rm
fix_funcattrs.pyo
1087
0644
edit
dl
rm
fix_future.py
521
0644
edit
dl
rm
fix_future.pyc
892
0644
edit
dl
rm
fix_future.pyo
892
0644
edit
dl
rm
fix_getcwdu.py
427
0644
edit
dl
rm
fix_getcwdu.pyc
899
0644
edit
dl
rm
fix_getcwdu.pyo
899
0644
edit
dl
rm
fix_has_key.py
3202
0644
edit
dl
rm
fix_has_key.pyc
3208
0644
edit
dl
rm
fix_has_key.pyo
3173
0644
edit
dl
rm
fix_idioms.py
4890
0644
edit
dl
rm
fix_idioms.pyc
4550
0644
edit
dl
rm
fix_idioms.pyo
4440
0644
edit
dl
rm
fix_import.py
3234
0644
edit
dl
rm
fix_import.pyc
3264
0644
edit
dl
rm
fix_import.pyo
3264
0644
edit
dl
rm
fix_imports.py
5641
0644
edit
dl
rm
fix_imports.pyc
5333
0644
edit
dl
rm
fix_imports.pyo
5333
0644
edit
dl
rm
fix_imports2.py
289
0644
edit
dl
rm
fix_imports2.pyc
630
0644
edit
dl
rm
fix_imports2.pyo
630
0644
edit
dl
rm
fix_input.py
685
0644
edit
dl
rm
fix_input.pyc
1109
0644
edit
dl
rm
fix_input.pyo
1109
0644
edit
dl
rm
fix_intern.py
1362
0644
edit
dl
rm
fix_intern.pyc
1573
0644
edit
dl
rm
fix_intern.pyo
1573
0644
edit
dl
rm
fix_isinstance.py
1585
0644
edit
dl
rm
fix_isinstance.pyc
1826
0644
edit
dl
rm
fix_isinstance.pyo
1826
0644
edit
dl
rm
fix_itertools.py
1472
0644
edit
dl
rm
fix_itertools.pyc
1695
0644
edit
dl
rm
fix_itertools.pyo
1695
0644
edit
dl
rm
fix_itertools_imports.py
1840
0644
edit
dl
rm
fix_itertools_imports.pyc
1856
0644
edit
dl
rm
fix_itertools_imports.pyo
1809
0644
edit
dl
rm
fix_long.py
453
0644
edit
dl
rm
fix_long.pyc
816
0644
edit
dl
rm
fix_long.pyo
816
0644
edit
dl
rm
fix_map.py
3037
0644
edit
dl
rm
fix_map.pyc
3029
0644
edit
dl
rm
fix_map.pyo
3029
0644
edit
dl
rm
fix_metaclass.py
8188
0644
edit
dl
rm
fix_metaclass.pyc
6643
0644
edit
dl
rm
fix_metaclass.pyo
6591
0644
edit
dl
rm
fix_methodattrs.py
590
0644
edit
dl
rm
fix_methodattrs.pyc
1111
0644
edit
dl
rm
fix_methodattrs.pyo
1111
0644
edit
dl
rm
fix_ne.py
573
0644
edit
dl
rm
fix_ne.pyc
993
0644
edit
dl
rm
fix_ne.pyo
993
0644
edit
dl
rm
fix_next.py
3156
0644
edit
dl
rm
fix_next.pyc
3579
0644
edit
dl
rm
fix_next.pyo
3544
0644
edit
dl
rm
fix_nonzero.py
573
0644
edit
dl
rm
fix_nonzero.pyc
1059
0644
edit
dl
rm
fix_nonzero.pyo
1059
0644
edit
dl
rm
fix_numliterals.py
773
0644
edit
dl
rm
fix_numliterals.pyc
1264
0644
edit
dl
rm
fix_numliterals.pyo
1264
0644
edit
dl
rm
fix_operator.py
1496
0644
edit
dl
rm
fix_operator.pyc
1755
0644
edit
dl
rm
fix_operator.pyo
1755
0644
edit
dl
rm
fix_paren.py
1202
0644
edit
dl
rm
fix_paren.pyc
1516
0644
edit
dl
rm
fix_paren.pyo
1516
0644
edit
dl
rm
fix_print.py
2839
0644
edit
dl
rm
fix_print.pyc
2748
0644
edit
dl
rm
fix_print.pyo
2645
0644
edit
dl
rm
fix_raise.py
2560
0644
edit
dl
rm
fix_raise.pyc
2366
0644
edit
dl
rm
fix_raise.pyo
2366
0644
edit
dl
rm
fix_raw_input.py
430
0644
edit
dl
rm
fix_raw_input.pyc
909
0644
edit
dl
rm
fix_raw_input.pyo
909
0644
edit
dl
rm
fix_reduce.py
795
0644
edit
dl
rm
fix_reduce.pyc
1209
0644
edit
dl
rm
fix_reduce.pyo
1209
0644
edit
dl
rm
fix_renames.py
2193
0644
edit
dl
rm
fix_renames.pyc
2437
0644
edit
dl
rm
fix_renames.pyo
2437
0644
edit
dl
rm
fix_repr.py
589
0644
edit
dl
rm
fix_repr.pyc
991
0644
edit
dl
rm
fix_repr.pyo
991
0644
edit
dl
rm
fix_set_literal.py
1674
0644
edit
dl
rm
fix_set_literal.pyc
1978
0644
edit
dl
rm
fix_set_literal.pyo
1978
0644
edit
dl
rm
fix_standarderror.py
426
0644
edit
dl
rm
fix_standarderror.pyc
826
0644
edit
dl
rm
fix_standarderror.pyo
826
0644
edit
dl
rm
fix_sys_exc.py
1014
0644
edit
dl
rm
fix_sys_exc.pyc
1682
0644
edit
dl
rm
fix_sys_exc.pyo
1682
0644
edit
dl
rm
fix_throw.py
1562
0644
edit
dl
rm
fix_throw.pyc
1994
0644
edit
dl
rm
fix_throw.pyo
1994
0644
edit
dl
rm
fix_tuple_params.py
5456
0644
edit
dl
rm
fix_tuple_params.pyc
5467
0644
edit
dl
rm
fix_tuple_params.pyo
5467
0644
edit
dl
rm
fix_types.py
1782
0644
edit
dl
rm
fix_types.pyc
2177
0644
edit
dl
rm
fix_types.pyo
2177
0644
edit
dl
rm
fix_unicode.py
696
0644
edit
dl
rm
fix_unicode.pyc
1164
0644
edit
dl
rm
fix_unicode.pyo
1164
0644
edit
dl
rm
fix_urllib.py
7510
0644
edit
dl
rm
fix_urllib.pyc
6451
0644
edit
dl
rm
fix_urllib.pyo
6451
0644
edit
dl
rm
fix_ws_comma.py
1095
0644
edit
dl
rm
fix_ws_comma.pyc
1401
0644
edit
dl
rm
fix_ws_comma.pyo
1401
0644
edit
dl
rm
fix_xrange.py
2675
0644
edit
dl
rm
fix_xrange.pyc
3052
0644
edit
dl
rm
fix_xrange.pyo
3052
0644
edit
dl
rm
fix_xreadlines.py
665
0644
edit
dl
rm
fix_xreadlines.pyc
1144
0644
edit
dl
rm
fix_xreadlines.pyo
1144
0644
edit
dl
rm
fix_zip.py
879
0644
edit
dl
rm
fix_zip.pyc
1323
0644
edit
dl
rm
fix_zip.pyo
1323
0644
edit
dl
rm
__init__.py
47
0644
edit
dl
rm
__init__.pyc
131
0644
edit
dl
rm
__init__.pyo
131
0644
edit
dl
rm
Edit:
/usr/lib/python2.6/lib2to3/fixes/fix_metaclass.py
(8188B)
"""Fixer for __metaclass__ = X -> (metaclass=X) methods. The various forms of classef (inherits nothing, inherits once, inherints many) don't parse the same in the CST so we look at ALL classes for a __metaclass__ and if we find one normalize the inherits to all be an arglist. For one-liner classes ('class X: pass') there is no indent/dedent so we normalize those into having a suite. Moving the __metaclass__ into the classdef can also cause the class body to be empty so there is some special casing for that as well. This fixer also tries very hard to keep original indenting and spacing in all those corner cases. """ # Author: Jack Diederich # Local imports from .. import fixer_base from ..pygram import token from ..fixer_util import Name, syms, Node, Leaf def has_metaclass(parent): """ we have to check the cls_node without changing it. There are two possiblities: 1) clsdef => suite => simple_stmt => expr_stmt => Leaf('__meta') 2) clsdef => simple_stmt => expr_stmt => Leaf('__meta') """ for node in parent.children: if node.type == syms.suite: return has_metaclass(node) elif node.type == syms.simple_stmt and node.children: expr_node = node.children[0] if expr_node.type == syms.expr_stmt and expr_node.children: left_side = expr_node.children[0] if isinstance(left_side, Leaf) and \ left_side.value == '__metaclass__': return True return False def fixup_parse_tree(cls_node): """ one-line classes don't get a suite in the parse tree so we add one to normalize the tree """ for node in cls_node.children: if node.type == syms.suite: # already in the prefered format, do nothing return # !%@#! oneliners have no suite node, we have to fake one up for i, node in enumerate(cls_node.children): if node.type == token.COLON: break else: raise ValueError("No class suite and no ':'!") # move everything into a suite node suite = Node(syms.suite, []) while cls_node.children[i+1:]: move_node = cls_node.children[i+1] suite.append_child(move_node.clone()) move_node.remove() cls_node.append_child(suite) node = suite def fixup_simple_stmt(parent, i, stmt_node): """ if there is a semi-colon all the parts count as part of the same simple_stmt. We just want the __metaclass__ part so we move everything efter the semi-colon into its own simple_stmt node """ for semi_ind, node in enumerate(stmt_node.children): if node.type == token.SEMI: # *sigh* break else: return node.remove() # kill the semicolon new_expr = Node(syms.expr_stmt, []) new_stmt = Node(syms.simple_stmt, [new_expr]) while stmt_node.children[semi_ind:]: move_node = stmt_node.children[semi_ind] new_expr.append_child(move_node.clone()) move_node.remove() parent.insert_child(i, new_stmt) new_leaf1 = new_stmt.children[0].children[0] old_leaf1 = stmt_node.children[0].children[0] new_leaf1.prefix = old_leaf1.prefix def remove_trailing_newline(node): if node.children and node.children[-1].type == token.NEWLINE: node.children[-1].remove() def find_metas(cls_node): # find the suite node (Mmm, sweet nodes) for node in cls_node.children: if node.type == syms.suite: break else: raise ValueError("No class suite!") # look for simple_stmt[ expr_stmt[ Leaf('__metaclass__') ] ] for i, simple_node in list(enumerate(node.children)): if simple_node.type == syms.simple_stmt and simple_node.children: expr_node = simple_node.children[0] if expr_node.type == syms.expr_stmt and expr_node.children: # Check if the expr_node is a simple assignment. left_node = expr_node.children[0] if isinstance(left_node, Leaf) and \ left_node.value == u'__metaclass__': # We found a assignment to __metaclass__. fixup_simple_stmt(node, i, simple_node) remove_trailing_newline(simple_node) yield (node, i, simple_node) def fixup_indent(suite): """ If an INDENT is followed by a thing with a prefix then nuke the prefix Otherwise we get in trouble when removing __metaclass__ at suite start """ kids = suite.children[::-1] # find the first indent while kids: node = kids.pop() if node.type == token.INDENT: break # find the first Leaf while kids: node = kids.pop() if isinstance(node, Leaf) and node.type != token.DEDENT: if node.prefix: node.prefix = u'' return else: kids.extend(node.children[::-1]) class FixMetaclass(fixer_base.BaseFix): PATTERN = """ classdef<any*> """ def transform(self, node, results): if not has_metaclass(node): return fixup_parse_tree(node) # find metaclasses, keep the last one last_metaclass = None for suite, i, stmt in find_metas(node): last_metaclass = stmt stmt.remove() text_type = node.children[0].type # always Leaf(nnn, 'class') # figure out what kind of classdef we have if len(node.children) == 7: # Node(classdef, ['class', 'name', '(', arglist, ')', ':', suite]) # 0 1 2 3 4 5 6 if node.children[3].type == syms.arglist: arglist = node.children[3] # Node(classdef, ['class', 'name', '(', 'Parent', ')', ':', suite]) else: parent = node.children[3].clone() arglist = Node(syms.arglist, [parent]) node.set_child(3, arglist) elif len(node.children) == 6: # Node(classdef, ['class', 'name', '(', ')', ':', suite]) # 0 1 2 3 4 5 arglist = Node(syms.arglist, []) node.insert_child(3, arglist) elif len(node.children) == 4: # Node(classdef, ['class', 'name', ':', suite]) # 0 1 2 3 arglist = Node(syms.arglist, []) node.insert_child(2, Leaf(token.RPAR, u')')) node.insert_child(2, arglist) node.insert_child(2, Leaf(token.LPAR, u'(')) else: raise ValueError("Unexpected class definition") # now stick the metaclass in the arglist meta_txt = last_metaclass.children[0].children[0] meta_txt.value = 'metaclass' orig_meta_prefix = meta_txt.prefix if arglist.children: arglist.append_child(Leaf(token.COMMA, u',')) meta_txt.prefix = u' ' else: meta_txt.prefix = u'' # compact the expression "metaclass = Meta" -> "metaclass=Meta" expr_stmt = last_metaclass.children[0] assert expr_stmt.type == syms.expr_stmt expr_stmt.children[1].prefix = u'' expr_stmt.children[2].prefix = u'' arglist.append_child(last_metaclass) fixup_indent(suite) # check for empty suite if not suite.children: # one-liner that was just __metaclass_ suite.remove() pass_leaf = Leaf(text_type, u'pass') pass_leaf.prefix = orig_meta_prefix node.append_child(pass_leaf) node.append_child(Leaf(token.NEWLINE, u'\n')) elif len(suite.children) > 1 and \ (suite.children[-2].type == token.INDENT and suite.children[-1].type == token.DEDENT): # there was only one line in the class body and it was __metaclass__ pass_leaf = Leaf(text_type, u'pass') suite.insert_child(-1, pass_leaf) suite.insert_child(-1, Leaf(token.NEWLINE, u'\n'))
Save
cmd:
run