annotate Lib/lib2to3/fixes/fix_except.py @ 54294:dba767bc3155 legacy-trunk

remove mention of old ctypes version
author Benjamin Peterson <benjamin@python.org>
date Sat, 23 May 2009 20:59:09 +0000
parents 119e4323400d
children 7700408f65fc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 """Fixer for except statements with named exceptions.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3 The following cases will be converted:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5 - "except E, T:" where T is a name:
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
6
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7 except E as T:
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
8
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9 - "except E, T:" where T is not a name, tuple or list:
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
10
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11 except E as t:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12 T = t
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
13
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 This is done because the target of an "except" clause must be a
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15 name.
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
16
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 - "except E, T:" where T is a tuple or list literal:
45909
a9855db40ffb Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45906
diff changeset
18
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 except E as t:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 T = t.args
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 # Author: Collin Winter
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 # Local imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25 from .. import pytree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 from ..pgen2 import token
47726
4e304aded7a8 Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46153
diff changeset
27 from .. import fixer_base
53823
a2303a74a761 Merged revisions 72368 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49884
diff changeset
28 from ..fixer_util import Assign, Attr, Name, is_tuple, is_list, syms
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30 def find_excepts(nodes):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31 for i, n in enumerate(nodes):
53823
a2303a74a761 Merged revisions 72368 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 49884
diff changeset
32 if n.type == syms.except_clause:
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
33 if n.children[0].value == u'except':
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
34 yield (n, nodes[i+2])
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
35
47726
4e304aded7a8 Merged revisions 64286 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 46153
diff changeset
36 class FixExcept(fixer_base.BaseFix):
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 PATTERN = """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 try_stmt< 'try' ':' suite
46153
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
40 cleanup=(except_clause ':' suite)+
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
41 tail=(['except' ':' suite]
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
42 ['else' ':' suite]
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
43 ['finally' ':' suite]) >
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
44 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
45
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
46 def transform(self, node, results):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
47 syms = self.syms
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
48
46153
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
49 tail = [n.clone() for n in results["tail"]]
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
50
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
51 try_cleanup = [ch.clone() for ch in results["cleanup"]]
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
52 for except_clause, e_suite in find_excepts(try_cleanup):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
53 if len(except_clause.children) == 4:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
54 (E, comma, N) = except_clause.children[1:4]
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
55 comma.replace(Name(u"as", prefix=u" "))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
56
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 if N.type != token.NAME:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58 # Generate a new N for the except clause
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
59 new_N = Name(self.new_name(), prefix=u" ")
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
60 target = N.clone()
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
61 target.set_prefix(u"")
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
62 N.replace(new_N)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
63 new_N = new_N.clone()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
64
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
65 # Insert "old_N = new_N" as the first statement in
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
66 # the except body. This loop skips leading whitespace
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
67 # and indents
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
68 #TODO(cwinter) suite-cleanup
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69 suite_stmts = e_suite.children
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70 for i, stmt in enumerate(suite_stmts):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 if isinstance(stmt, pytree.Node):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 break
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 # The assignment is different if old_N is a tuple or list
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 # In that case, the assignment is old_N = new_N.args
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 if is_tuple(N) or is_list(N):
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
77 assign = Assign(target, Attr(new_N, Name(u'args')))
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 assign = Assign(target, new_N)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
80
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 #TODO(cwinter) stopgap until children becomes a smart list
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82 for child in reversed(suite_stmts[:i]):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 e_suite.insert_child(0, child)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84 e_suite.insert_child(i, assign)
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
85 elif N.get_prefix() == u"":
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 # No space after a comma is legal; no space after "as",
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 # not so much.
53934
119e4323400d Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 53823
diff changeset
88 N.set_prefix(u" ")
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 #TODO(cwinter) fix this when children becomes a smart list
46153
7232259a0529 Merged revisions 61988-61990 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 45909
diff changeset
91 children = [c.clone() for c in node.children[:3]] + try_cleanup + tail
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 return pytree.Node(node.type, children)