10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Copyright 2006 Google, Inc. All Rights Reserved. 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Licensed to PSF under a Contributor Agreement. 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""Fixer for apply(). 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh GaoThis converts apply(func, v, k) into (func)(*v, **k).""" 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Local imports 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom .. import pytree 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom ..pgen2 import token 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom .. import fixer_base 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom ..fixer_util import Call, Comma, parenthesize 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass FixApply(fixer_base.BaseFix): 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BM_compatible = True 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao PATTERN = """ 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao power< 'apply' 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao trailer< 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao '(' 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao arglist< 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao (not argument<NAME '=' any>) func=any ',' 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao (not argument<NAME '=' any>) args=any [',' 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao (not argument<NAME '=' any>) kwds=any] [','] 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao > 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ')' 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao > 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao > 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def transform(self, node, results): 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao syms = self.syms 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao assert results 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func = results["func"] 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao args = results["args"] 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao kwds = results.get("kwds") 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao prefix = node.prefix 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func = func.clone() 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if (func.type not in (token.NAME, syms.atom) and 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao (func.type != syms.power or 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func.children[-2].type == token.DOUBLESTAR)): 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Need to parenthesize 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func = parenthesize(func) 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao func.prefix = "" 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao args = args.clone() 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao args.prefix = "" 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if kwds is not None: 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao kwds = kwds.clone() 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao kwds.prefix = "" 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao l_newargs = [pytree.Leaf(token.STAR, u"*"), args] 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if kwds is not None: 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao l_newargs.extend([Comma(), 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pytree.Leaf(token.DOUBLESTAR, u"**"), 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao kwds]) 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao l_newargs[-2].prefix = u" " # that's the ** token 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # XXX Sometimes we could be cleverer, e.g. apply(f, (x, y) + t) 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # can be translated into f(x, y, *t) instead of f(*(x, y) + t) 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #new = pytree.Node(syms.power, (func, ArgList(l_newargs))) 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return Call(func, l_newargs, prefix=prefix) 60