Index: example.py =================================================================== --- example.py (Revision 53078) +++ example.py (Arbeitskopie) @@ -65,6 +65,27 @@ apply(f, args=args, kwds=kwds) apply(f, args, kwds=kwds) +def intern_examples(): + # + # These should be refactored: + # + x = intern(a) + # + y = intern("b" # test + ) + # + z = intern(a+b+c.d,) + # + # These not: + # + intern(a=1) + # + intern(f, g) + # + intern(*h) + # + intern(**i) + def print_examples(): # plain vanilla print 1, 1+1, 1+1+1 Index: fixes/fix_intern.py =================================================================== --- fixes/fix_intern.py (Revision 0) +++ fixes/fix_intern.py (Revision 0) @@ -0,0 +1,59 @@ +# Copyright 2006 Georg Brandl. +# Licensed to PSF under a Contributor Agreement. + +"""Fixer for intern().""" + +# Python imports +import token + +# Local imports +import pytree +import patcomp +import pygram + +syms = pygram.python_symbols +pat_compile = patcomp.PatternCompiler().compile_pattern + +PATTERN = """ +power< 'intern' trailer< lpar='(' + obj=arglist< any ',' > + rpar=')' > > +| +power< 'intern' trailer< lpar='(' + (not arglist) + (not argument > +""" + + +class FixIntern(object): + + def __init__(self, options): + self.options = options + self.pattern = pat_compile(PATTERN) + + def match(self, node): + results = {} + return self.pattern.match(node, results) and results + + def transform(self, node): + results = self.match(node) + assert results + obj = results["obj"].clone() + if obj.type == syms.arglist: + newarglist = obj.clone() + else: + newarglist = pytree.Node(syms.arglist, [obj.clone()]) + new = pytree.Node(syms.power, + [pytree.Leaf(token.NAME, "sys"), + pytree.Node(syms.trailer, + [pytree.Leaf(token.DOT, "."), + pytree.Leaf(token.NAME, "intern")]), + pytree.Node(syms.trailer, + [results["lpar"].clone(), + newarglist, + results["rpar"].clone()])]) + new.set_prefix(node.get_prefix()) + return new +