17db96d56Sopenharmony_cir"""Fixer for unicode.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci* Changes unicode to str and unichr to chr.
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci* If "...\u..." is not unicode literal change it into "...\\u...".
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci* Change u"..." into "...".
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci"""
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_cifrom ..pgen2 import token
127db96d56Sopenharmony_cifrom .. import fixer_base
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci_mapping = {"unichr" : "chr", "unicode" : "str"}
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciclass FixUnicode(fixer_base.BaseFix):
177db96d56Sopenharmony_ci    BM_compatible = True
187db96d56Sopenharmony_ci    PATTERN = "STRING | 'unicode' | 'unichr'"
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    def start_tree(self, tree, filename):
217db96d56Sopenharmony_ci        super(FixUnicode, self).start_tree(tree, filename)
227db96d56Sopenharmony_ci        self.unicode_literals = 'unicode_literals' in tree.future_features
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci    def transform(self, node, results):
257db96d56Sopenharmony_ci        if node.type == token.NAME:
267db96d56Sopenharmony_ci            new = node.clone()
277db96d56Sopenharmony_ci            new.value = _mapping[node.value]
287db96d56Sopenharmony_ci            return new
297db96d56Sopenharmony_ci        elif node.type == token.STRING:
307db96d56Sopenharmony_ci            val = node.value
317db96d56Sopenharmony_ci            if not self.unicode_literals and val[0] in '\'"' and '\\' in val:
327db96d56Sopenharmony_ci                val = r'\\'.join([
337db96d56Sopenharmony_ci                    v.replace('\\u', r'\\u').replace('\\U', r'\\U')
347db96d56Sopenharmony_ci                    for v in val.split(r'\\')
357db96d56Sopenharmony_ci                ])
367db96d56Sopenharmony_ci            if val[0] in 'uU':
377db96d56Sopenharmony_ci                val = val[1:]
387db96d56Sopenharmony_ci            if val == node.value:
397db96d56Sopenharmony_ci                return node
407db96d56Sopenharmony_ci            new = node.clone()
417db96d56Sopenharmony_ci            new.value = val
427db96d56Sopenharmony_ci            return new
43