| """Fixer for generator.throw(E, V, T). |
| |
| g.throw(E) -> g.throw(E) |
| g.throw(E, V) -> g.throw(E(V)) |
| g.throw(E, V, T) -> g.throw(E(V).with_traceback(T)) |
| |
| g.throw("foo"[, V[, T]]) will warn about string exceptions.""" |
| # Author: Collin Winter |
| |
| # Local imports |
| from .. import pytree |
| from ..pgen2 import token |
| from .. import fixer_base |
| from ..fixer_util import Name, Call, ArgList, Attr, is_tuple |
| |
| class FixThrow(fixer_base.BaseFix): |
| BM_compatible = True |
| PATTERN = """ |
| power< any trailer< '.' 'throw' > |
| trailer< '(' args=arglist< exc=any ',' val=any [',' tb=any] > ')' > |
| > |
| | |
| power< any trailer< '.' 'throw' > trailer< '(' exc=any ')' > > |
| """ |
| |
| def transform(self, node, results): |
| syms = self.syms |
| |
| exc = results["exc"].clone() |
| if exc.type is token.STRING: |
| self.cannot_convert(node, "Python 3 does not support string exceptions") |
| return |
| |
| # Leave "g.throw(E)" alone |
| val = results.get(u"val") |
| if val is None: |
| return |
| |
| val = val.clone() |
| if is_tuple(val): |
| args = [c.clone() for c in val.children[1:-1]] |
| else: |
| val.prefix = u"" |
| args = [val] |
| |
| throw_args = results["args"] |
| |
| if "tb" in results: |
| tb = results["tb"].clone() |
| tb.prefix = u"" |
| |
| e = Call(exc, args) |
| with_tb = Attr(e, Name(u'with_traceback')) + [ArgList([tb])] |
| throw_args.replace(pytree.Node(syms.power, with_tb)) |
| else: |
| throw_args.replace(Call(exc, args)) |