14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Fixer that addes parentheses where they are required
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoThis converts ``[x for x in 1, 2]`` to ``[x for x in (1, 2)]``."""
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# By Taek Joo Kim and Benjamin Peterson
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Local imports
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom .. import fixer_base
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ..fixer_util import LParen, RParen
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# XXX This doesn't support nested for loops like [x for x in 1, 2 for x in 1, 2]
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass FixParen(fixer_base.BaseFix):
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    BM_compatible = True
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    PATTERN = """
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        atom< ('[' | '(')
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (listmaker< any
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                comp_for<
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'for' NAME 'in'
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    target=testlist_safe< any (',' any)+ [',']
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     >
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [any]
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                >
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            >
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            |
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            testlist_gexp< any
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                comp_for<
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    'for' NAME 'in'
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    target=testlist_safe< any (',' any)+ [',']
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     >
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    [any]
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                >
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            >)
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        (']' | ')') >
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def transform(self, node, results):
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        target = results["target"]
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lparen = LParen()
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        lparen.prefix = target.prefix
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        target.prefix = u"" # Make it hug the parentheses
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        target.insert_child(0, lparen)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        target.append_child(RParen())
45