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