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