15e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis""" Fixer for itertools.(imap|ifilter|izip) --> (map|filter|zip) and
25e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    itertools.ifilterfalse --> itertools.filterfalse (bugs 2360-2363)
35e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
4baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis    imports from itertools are fixed in fix_itertools_import.py
5baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis
65e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    If itertools is imported as something else (ie: import itertools as it;
75e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    it.izip(spam, eggs)) method calls will not get fixed.
85e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    """
95e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
105e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Local imports
11e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom .. import fixer_base
12e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom ..fixer_util import Name
135e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
14e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonclass FixItertools(fixer_base.BaseFix):
15a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson    BM_compatible = True
161af19d1ffd960ed5b5876d7aa8d2dcba0117edbfBenjamin Peterson    it_funcs = "('imap'|'ifilter'|'izip'|'izip_longest'|'ifilterfalse')"
175e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    PATTERN = """
185e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis              power< it='itertools'
195e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                  trailer<
205e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                     dot='.' func=%(it_funcs)s > trailer< '(' [any] ')' > >
215e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis              |
225e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis              power< func=%(it_funcs)s trailer< '(' [any] ')' > >
235e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis              """ %(locals())
245e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
25baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis    # Needs to be run after fix_(map|zip|filter)
26baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis    run_order = 6
27baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis
285e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    def transform(self, node, results):
295e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        prefix = None
305e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        func = results['func'][0]
311af19d1ffd960ed5b5876d7aa8d2dcba0117edbfBenjamin Peterson        if ('it' in results and
321af19d1ffd960ed5b5876d7aa8d2dcba0117edbfBenjamin Peterson            func.value not in (u'ifilterfalse', u'izip_longest')):
335e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            dot, it = (results['dot'], results['it'])
345e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            # Remove the 'itertools'
356118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson            prefix = it.prefix
365e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            it.remove()
375dd99ebbc25ac0e182cb00ac4c67aef8d32a6755Ezio Melotti            # Replace the node which contains ('.', 'function') with the
385dd99ebbc25ac0e182cb00ac4c67aef8d32a6755Ezio Melotti            # function (to be consistent with the second part of the pattern)
395e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            dot.remove()
405e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            func.parent.replace(func)
415e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
426118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson        prefix = prefix or func.prefix
435e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        func.replace(Name(func.value[1:], prefix=prefix))
44