15e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Copyright 2006 Georg Brandl.
25e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Licensed to PSF under a Contributor Agreement.
35e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
45e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis"""Fixer for intern().
55e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
65e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisintern(s) -> sys.intern(s)"""
75e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
85e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Local imports
95e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisfrom .. import pytree
10e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom .. import fixer_base
1143caaa09ea364aab6cbd7ede2aa9c3d004a129a5Benjamin Petersonfrom ..fixer_util import Name, Attr, touch_import
125e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
135e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
14e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonclass FixIntern(fixer_base.BaseFix):
15a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson    BM_compatible = True
16a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson    order = "pre"
175e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
185e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    PATTERN = """
195e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    power< 'intern'
205e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis           trailer< lpar='('
215e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                    ( not(arglist | argument<any '=' any>) obj=any
225e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                      | obj=arglist<(not argument<any '=' any>) any ','> )
235e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                    rpar=')' >
245e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis           after=any*
255e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    >
265e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    """
275e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
285e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    def transform(self, node, results):
2988c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%        if results:
3088c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%            # I feel like we should be able to express this logic in the
3188c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%            # PATTERN above but I don't know how to do it so...
3288c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%            obj = results['obj']
3388c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%            if obj:
3488c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%                if obj.type == self.syms.star_expr:
3588c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%                    return  # Make no change.
3688c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%                if (obj.type == self.syms.argument and
3788c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%                    obj.children[0].value == '**'):
3888c00132ccdced2645e78e0059eab93590adecbdGregory P. Smith ext:(%                    return  # Make no change.
395e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        syms = self.syms
405e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        obj = results["obj"].clone()
415e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        if obj.type == syms.arglist:
425e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            newarglist = obj.clone()
435e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        else:
445e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            newarglist = pytree.Node(syms.arglist, [obj.clone()])
455e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        after = results["after"]
465e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        if after:
475e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            after = [n.clone() for n in after]
485e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        new = pytree.Node(syms.power,
4984ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson                          Attr(Name(u"sys"), Name(u"intern")) +
505e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                          [pytree.Node(syms.trailer,
515e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                                       [results["lpar"].clone(),
525e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                                        newarglist,
535e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                                        results["rpar"].clone()])] + after)
546118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson        new.prefix = node.prefix
5584ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson        touch_import(None, u'sys', node)
565e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        return new
57