15e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Copyright 2007 Google, Inc. All Rights Reserved.
25e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Licensed to PSF under a Contributor Agreement.
35e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
45e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis"""Fixer that changes filter(F, X) into list(filter(F, X)).
55e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
65e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. LöwisWe avoid the transformation if the filter() call is directly contained
75e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisin iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or
85e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisfor V in <>:.
95e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
105e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. LöwisNOTE: This is still not correct if the original code was depending on
115e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisfilter(F, X) to return a string if X is a string and a tuple if X is a
125e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwistuple.  That would require type inference, which we don't do.  Let
135e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. LöwisPython 2.6 figure it out.
145e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis"""
155e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
165e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis# Local imports
175e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwisfrom ..pgen2 import token
18e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom .. import fixer_base
19e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonfrom ..fixer_util import Name, Call, ListComp, in_special_context
205e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
21e607823af57c176c3be23985f5bbf9260f6bd836Benjamin Petersonclass FixFilter(fixer_base.ConditionalFix):
22a81eae1fd71eed670d1c28bf940ea99b4bfa2335Benjamin Peterson    BM_compatible = True
235e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
245e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    PATTERN = """
255e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    filter_lambda=power<
265e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        'filter'
275e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        trailer<
285e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            '('
295e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            arglist<
305e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                lambdef< 'lambda'
315e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                         (fp=NAME | vfpdef< '(' fp=NAME ')'> ) ':' xp=any
325e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                >
335e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                ','
345e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                it=any
355e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            >
365e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            ')'
375e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        >
385e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    >
395e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    |
405e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    power<
415e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        'filter'
425e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        trailer< '(' arglist< none='None' ',' seq=any > ')' >
435e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    >
445e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    |
455e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    power<
465e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        'filter'
475e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        args=trailer< '(' [any] ')' >
485e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    >
495e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    """
505e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
51baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis    skip_on = "future_builtins.filter"
525e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
535e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis    def transform(self, node, results):
54baf267ceaeb7d4d1e15228018c450a9f738fcf3eMartin v. Löwis        if self.should_skip(node):
555e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            return
565e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
575e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        if "filter_lambda" in results:
585e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            new = ListComp(results.get("fp").clone(),
595e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                           results.get("fp").clone(),
605e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                           results.get("it").clone(),
615e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                           results.get("xp").clone())
625e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
635e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        elif "none" in results:
6484ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson            new = ListComp(Name(u"_f"),
6584ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson                           Name(u"_f"),
665e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                           results["seq"].clone(),
6784ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson                           Name(u"_f"))
685e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis
695e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        else:
705e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            if in_special_context(node):
715e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis                return None
725e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis            new = node.clone()
736118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson            new.prefix = u""
7484ad84e0bb15e7c64109e88060afdcb60ae7b740Benjamin Peterson            new = Call(Name(u"list"), [new])
756118040b7aee905bcddcb949c6815dc19ca23070Benjamin Peterson        new.prefix = node.prefix
765e37baea8007cb64b65a180e4d6c80de292a8a4aMartin v. Löwis        return new
77