home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 June / maximum-cd-2011-06.iso / DiscContents / LibO_3.3.1_Win_x86_install_multi.exe / libreoffice1.cab / fix_apply.py < prev    next >
Encoding:
Python Source  |  2011-02-15  |  1.8 KB  |  59 lines

  1. # Copyright 2006 Google, Inc. All Rights Reserved.
  2. # Licensed to PSF under a Contributor Agreement.
  3.  
  4. """Fixer for apply().
  5.  
  6. This converts apply(func, v, k) into (func)(*v, **k)."""
  7.  
  8. # Local imports
  9. from .. import pytree
  10. from ..pgen2 import token
  11. from .. import fixer_base
  12. from ..fixer_util import Call, Comma
  13.  
  14. class FixApply(fixer_base.BaseFix):
  15.  
  16.     PATTERN = """
  17.     power< 'apply'
  18.         trailer<
  19.             '('
  20.             arglist<
  21.                 (not argument<NAME '=' any>) func=any ','
  22.                 (not argument<NAME '=' any>) args=any [','
  23.                 (not argument<NAME '=' any>) kwds=any] [',']
  24.             >
  25.             ')'
  26.         >
  27.     >
  28.     """
  29.  
  30.     def transform(self, node, results):
  31.         syms = self.syms
  32.         assert results
  33.         func = results["func"]
  34.         args = results["args"]
  35.         kwds = results.get("kwds")
  36.         prefix = node.get_prefix()
  37.         func = func.clone()
  38.         if (func.type not in (token.NAME, syms.atom) and
  39.             (func.type != syms.power or
  40.              func.children[-2].type == token.DOUBLESTAR)):
  41.             # Need to parenthesize
  42.             func = self.parenthesize(func)
  43.         func.set_prefix("")
  44.         args = args.clone()
  45.         args.set_prefix("")
  46.         if kwds is not None:
  47.             kwds = kwds.clone()
  48.             kwds.set_prefix("")
  49.         l_newargs = [pytree.Leaf(token.STAR, "*"), args]
  50.         if kwds is not None:
  51.             l_newargs.extend([Comma(),
  52.                               pytree.Leaf(token.DOUBLESTAR, "**"),
  53.                               kwds])
  54.             l_newargs[-2].set_prefix(" ") # that's the ** token
  55.         # XXX Sometimes we could be cleverer, e.g. apply(f, (x, y) + t)
  56.         # can be translated into f(x, y, *t) instead of f(*(x, y) + t)
  57.         #new = pytree.Node(syms.power, (func, ArgList(l_newargs)))
  58.         return Call(func, l_newargs, prefix=prefix)
  59.