17db96d56Sopenharmony_ci""" Fixer for itertools.(imap|ifilter|izip) --> (map|filter|zip) and
27db96d56Sopenharmony_ci    itertools.ifilterfalse --> itertools.filterfalse (bugs 2360-2363)
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci    imports from itertools are fixed in fix_itertools_import.py
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ci    If itertools is imported as something else (ie: import itertools as it;
77db96d56Sopenharmony_ci    it.izip(spam, eggs)) method calls will not get fixed.
87db96d56Sopenharmony_ci    """
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci# Local imports
117db96d56Sopenharmony_cifrom .. import fixer_base
127db96d56Sopenharmony_cifrom ..fixer_util import Name
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciclass FixItertools(fixer_base.BaseFix):
157db96d56Sopenharmony_ci    BM_compatible = True
167db96d56Sopenharmony_ci    it_funcs = "('imap'|'ifilter'|'izip'|'izip_longest'|'ifilterfalse')"
177db96d56Sopenharmony_ci    PATTERN = """
187db96d56Sopenharmony_ci              power< it='itertools'
197db96d56Sopenharmony_ci                  trailer<
207db96d56Sopenharmony_ci                     dot='.' func=%(it_funcs)s > trailer< '(' [any] ')' > >
217db96d56Sopenharmony_ci              |
227db96d56Sopenharmony_ci              power< func=%(it_funcs)s trailer< '(' [any] ')' > >
237db96d56Sopenharmony_ci              """ %(locals())
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci    # Needs to be run after fix_(map|zip|filter)
267db96d56Sopenharmony_ci    run_order = 6
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci    def transform(self, node, results):
297db96d56Sopenharmony_ci        prefix = None
307db96d56Sopenharmony_ci        func = results['func'][0]
317db96d56Sopenharmony_ci        if ('it' in results and
327db96d56Sopenharmony_ci            func.value not in ('ifilterfalse', 'izip_longest')):
337db96d56Sopenharmony_ci            dot, it = (results['dot'], results['it'])
347db96d56Sopenharmony_ci            # Remove the 'itertools'
357db96d56Sopenharmony_ci            prefix = it.prefix
367db96d56Sopenharmony_ci            it.remove()
377db96d56Sopenharmony_ci            # Replace the node which contains ('.', 'function') with the
387db96d56Sopenharmony_ci            # function (to be consistent with the second part of the pattern)
397db96d56Sopenharmony_ci            dot.remove()
407db96d56Sopenharmony_ci            func.parent.replace(func)
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci        prefix = prefix or func.prefix
437db96d56Sopenharmony_ci        func.replace(Name(func.value[1:], prefix=prefix))
44