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