Home | History | Annotate | Download | only in fixes
      1 """Fixer that addes parentheses where they are required
      2 
      3 This converts ``[x for x in 1, 2]`` to ``[x for x in (1, 2)]``."""
      4 
      5 # By Taek Joo Kim and Benjamin Peterson
      6 
      7 # Local imports
      8 from .. import fixer_base
      9 from ..fixer_util import LParen, RParen
     10 
     11 # XXX This doesn't support nested for loops like [x for x in 1, 2 for x in 1, 2]
     12 class FixParen(fixer_base.BaseFix):
     13     BM_compatible = True
     14 
     15     PATTERN = """
     16         atom< ('[' | '(')
     17             (listmaker< any
     18                 comp_for<
     19                     'for' NAME 'in'
     20                     target=testlist_safe< any (',' any)+ [',']
     21                      >
     22                     [any]
     23                 >
     24             >
     25             |
     26             testlist_gexp< any
     27                 comp_for<
     28                     'for' NAME 'in'
     29                     target=testlist_safe< any (',' any)+ [',']
     30                      >
     31                     [any]
     32                 >
     33             >)
     34         (']' | ')') >
     35     """
     36 
     37     def transform(self, node, results):
     38         target = results["target"]
     39 
     40         lparen = LParen()
     41         lparen.prefix = target.prefix
     42         target.prefix = u"" # Make it hug the parentheses
     43         target.insert_child(0, lparen)
     44         target.append_child(RParen())
     45