17db96d56Sopenharmony_ci""" Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci# Local imports 47db96d56Sopenharmony_cifrom lib2to3 import fixer_base 57db96d56Sopenharmony_cifrom lib2to3.fixer_util import BlankLine, syms, token 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ciclass FixItertoolsImports(fixer_base.BaseFix): 97db96d56Sopenharmony_ci BM_compatible = True 107db96d56Sopenharmony_ci PATTERN = """ 117db96d56Sopenharmony_ci import_from< 'from' 'itertools' 'import' imports=any > 127db96d56Sopenharmony_ci """ %(locals()) 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci def transform(self, node, results): 157db96d56Sopenharmony_ci imports = results['imports'] 167db96d56Sopenharmony_ci if imports.type == syms.import_as_name or not imports.children: 177db96d56Sopenharmony_ci children = [imports] 187db96d56Sopenharmony_ci else: 197db96d56Sopenharmony_ci children = imports.children 207db96d56Sopenharmony_ci for child in children[::2]: 217db96d56Sopenharmony_ci if child.type == token.NAME: 227db96d56Sopenharmony_ci member = child.value 237db96d56Sopenharmony_ci name_node = child 247db96d56Sopenharmony_ci elif child.type == token.STAR: 257db96d56Sopenharmony_ci # Just leave the import as is. 267db96d56Sopenharmony_ci return 277db96d56Sopenharmony_ci else: 287db96d56Sopenharmony_ci assert child.type == syms.import_as_name 297db96d56Sopenharmony_ci name_node = child.children[0] 307db96d56Sopenharmony_ci member_name = name_node.value 317db96d56Sopenharmony_ci if member_name in ('imap', 'izip', 'ifilter'): 327db96d56Sopenharmony_ci child.value = None 337db96d56Sopenharmony_ci child.remove() 347db96d56Sopenharmony_ci elif member_name in ('ifilterfalse', 'izip_longest'): 357db96d56Sopenharmony_ci node.changed() 367db96d56Sopenharmony_ci name_node.value = ('filterfalse' if member_name[1] == 'f' 377db96d56Sopenharmony_ci else 'zip_longest') 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci # Make sure the import statement is still sane 407db96d56Sopenharmony_ci children = imports.children[:] or [imports] 417db96d56Sopenharmony_ci remove_comma = True 427db96d56Sopenharmony_ci for child in children: 437db96d56Sopenharmony_ci if remove_comma and child.type == token.COMMA: 447db96d56Sopenharmony_ci child.remove() 457db96d56Sopenharmony_ci else: 467db96d56Sopenharmony_ci remove_comma ^= True 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci while children and children[-1].type == token.COMMA: 497db96d56Sopenharmony_ci children.pop().remove() 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci # If there are no imports left, just get rid of the entire statement 527db96d56Sopenharmony_ci if (not (imports.children or getattr(imports, 'value', None)) or 537db96d56Sopenharmony_ci imports.parent is None): 547db96d56Sopenharmony_ci p = node.prefix 557db96d56Sopenharmony_ci node = BlankLine() 567db96d56Sopenharmony_ci node.prefix = p 577db96d56Sopenharmony_ci return node 58