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