10c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""Fixer that changes 'a ,b' into 'a, b'.
20c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
30c5958b1636c47ed7c284f859c8e805fd06a0e6Bill YiThis also changes '{a :b}' into '{a: b}', but does not touch other
40c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiuses of colons.  It does not touch other uses of whitespace.
50c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
60c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi"""
70c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
80c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom .. import pytree
90c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom ..pgen2 import token
100c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yifrom .. import fixer_base
110c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
120c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yiclass FixWsComma(fixer_base.BaseFix):
130c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
140c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    explicit = True # The user must ask for this fixers
150c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
160c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    PATTERN = """
170c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    any<(not(',') any)+ ',' ((not(',') any)+ ',')* [not(',') any]>
180c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    """
190c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
200c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    COMMA = pytree.Leaf(token.COMMA, u",")
210c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    COLON = pytree.Leaf(token.COLON, u":")
220c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    SEPS = (COMMA, COLON)
230c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi
240c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi    def transform(self, node, results):
250c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        new = node.clone()
260c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        comma = False
270c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        for child in new.children:
280c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            if child in self.SEPS:
290c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                prefix = child.prefix
300c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if prefix.isspace() and u"\n" not in prefix:
310c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    child.prefix = u""
320c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                comma = True
330c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi            else:
340c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                if comma:
350c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    prefix = child.prefix
360c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                    if not prefix:
370c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                        child.prefix = u" "
380c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi                comma = False
390c5958b1636c47ed7c284f859c8e805fd06a0e6Bill Yi        return new
40