Home | History | Annotate | Download | only in fixes
      1 """Fixer for generator.throw(E, V, T).
      2 
      3 g.throw(E)       -> g.throw(E)
      4 g.throw(E, V)    -> g.throw(E(V))
      5 g.throw(E, V, T) -> g.throw(E(V).with_traceback(T))
      6 
      7 g.throw("foo"[, V[, T]]) will warn about string exceptions."""
      8 # Author: Collin Winter
      9 
     10 # Local imports
     11 from .. import pytree
     12 from ..pgen2 import token
     13 from .. import fixer_base
     14 from ..fixer_util import Name, Call, ArgList, Attr, is_tuple
     15 
     16 class FixThrow(fixer_base.BaseFix):
     17     BM_compatible = True
     18     PATTERN = """
     19     power< any trailer< '.' 'throw' >
     20            trailer< '(' args=arglist< exc=any ',' val=any [',' tb=any] > ')' >
     21     >
     22     |
     23     power< any trailer< '.' 'throw' > trailer< '(' exc=any ')' > >
     24     """
     25 
     26     def transform(self, node, results):
     27         syms = self.syms
     28 
     29         exc = results["exc"].clone()
     30         if exc.type is token.STRING:
     31             self.cannot_convert(node, "Python 3 does not support string exceptions")
     32             return
     33 
     34         # Leave "g.throw(E)" alone
     35         val = results.get(u"val")
     36         if val is None:
     37             return
     38 
     39         val = val.clone()
     40         if is_tuple(val):
     41             args = [c.clone() for c in val.children[1:-1]]
     42         else:
     43             val.prefix = u""
     44             args = [val]
     45 
     46         throw_args = results["args"]
     47 
     48         if "tb" in results:
     49             tb = results["tb"].clone()
     50             tb.prefix = u""
     51 
     52             e = Call(exc, args)
     53             with_tb = Attr(e, Name(u'with_traceback')) + [ArgList([tb])]
     54             throw_args.replace(pytree.Node(syms.power, with_tb))
     55         else:
     56             throw_args.replace(Call(exc, args))
     57