17db96d56Sopenharmony_ci# Copyright 2006 Google, Inc. All Rights Reserved.
27db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement.
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci"""Fixer for exec.
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_ciThis converts usages of the exec statement into calls to a built-in
77db96d56Sopenharmony_ciexec() function.
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciexec code in ns1, ns2 -> exec(code, ns1, ns2)
107db96d56Sopenharmony_ci"""
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci# Local imports
137db96d56Sopenharmony_cifrom .. import fixer_base
147db96d56Sopenharmony_cifrom ..fixer_util import Comma, Name, Call
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciclass FixExec(fixer_base.BaseFix):
187db96d56Sopenharmony_ci    BM_compatible = True
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci    PATTERN = """
217db96d56Sopenharmony_ci    exec_stmt< 'exec' a=any 'in' b=any [',' c=any] >
227db96d56Sopenharmony_ci    |
237db96d56Sopenharmony_ci    exec_stmt< 'exec' (not atom<'(' [any] ')'>) a=any >
247db96d56Sopenharmony_ci    """
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ci    def transform(self, node, results):
277db96d56Sopenharmony_ci        assert results
287db96d56Sopenharmony_ci        syms = self.syms
297db96d56Sopenharmony_ci        a = results["a"]
307db96d56Sopenharmony_ci        b = results.get("b")
317db96d56Sopenharmony_ci        c = results.get("c")
327db96d56Sopenharmony_ci        args = [a.clone()]
337db96d56Sopenharmony_ci        args[0].prefix = ""
347db96d56Sopenharmony_ci        if b is not None:
357db96d56Sopenharmony_ci            args.extend([Comma(), b.clone()])
367db96d56Sopenharmony_ci        if c is not None:
377db96d56Sopenharmony_ci            args.extend([Comma(), c.clone()])
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci        return Call(Name("exec"), args, prefix=node.prefix)
40