annotate Lib/lib2to3/fixes/fix_exitfunc.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 7d1e453b120b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 """
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2 Convert use of sys.exitfunc to use the atexit module.
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 """
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5 # Author: Benjamin Peterson
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
6
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
7 from lib2to3 import pytree, fixer_base
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8 from lib2to3.fixer_util import Name, Attr, Call, Comma, Newline, syms
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
10
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11 class FixExitfunc(fixer_base.BaseFix):
65340
7d1e453b120b Merged revisions 83852-83853,83857,84042,84216,84274-84276,84375,85388,85478,85506-85508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59936
diff changeset
12 keep_line_order = True
7d1e453b120b Merged revisions 83852-83853,83857,84042,84216,84274-84276,84375,85388,85478,85506-85508 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59936
diff changeset
13 BM_compatible = True
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15 PATTERN = """
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16 (
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 sys_import=import_name<'import'
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18 ('sys'
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 |
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
20 dotted_as_names< (any ',')* 'sys' (',' any)* >
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21 )
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
22 >
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
23 |
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24 expr_stmt<
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25 power< 'sys' trailer< '.' 'exitfunc' > >
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26 '=' func=any >
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 )
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 """
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30 def __init__(self, *args):
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31 super(FixExitfunc, self).__init__(*args)
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 def start_tree(self, tree, filename):
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34 super(FixExitfunc, self).start_tree(tree, filename)
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35 self.sys_import = None
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 def transform(self, node, results):
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38 # First, find a the sys import. We'll just hope it's global scope.
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39 if "sys_import" in results:
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
40 if self.sys_import is None:
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
41 self.sys_import = results["sys_import"]
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42 return
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
43
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44 func = results["func"].clone()
59936
12ee46435d01 Merged revisions 79313,79324 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59924
diff changeset
45 func.prefix = u""
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
46 register = pytree.Node(syms.power,
59936
12ee46435d01 Merged revisions 79313,79324 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59924
diff changeset
47 Attr(Name(u"atexit"), Name(u"register"))
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 )
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
49 call = Call(register, [func], node.prefix)
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 node.replace(call)
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
51
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52 if self.sys_import is None:
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53 # That's interesting.
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
54 self.warning(node, "Can't find sys import; Please add an atexit "
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55 "import at the top of your file.")
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
56 return
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
57
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
58 # Now add an atexit import after the sys import.
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59 names = self.sys_import.children[1]
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 if names.type == syms.dotted_as_names:
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61 names.append_child(Comma())
59936
12ee46435d01 Merged revisions 79313,79324 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59924
diff changeset
62 names.append_child(Name(u"atexit", u" "))
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 else:
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64 containing_stmt = self.sys_import.parent
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65 position = containing_stmt.children.index(self.sys_import)
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
66 stmt_container = containing_stmt.parent
59924
8f016a801642 Merged revisions 79309 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59920
diff changeset
67 new_import = pytree.Node(syms.import_name,
59936
12ee46435d01 Merged revisions 79313,79324 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59924
diff changeset
68 [Name(u"import"), Name(u"atexit", u" ")]
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
69 )
59936
12ee46435d01 Merged revisions 79313,79324 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 59924
diff changeset
70 new = pytree.Node(syms.simple_stmt, [new_import])
59920
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
71 containing_stmt.insert_child(position + 1, Newline())
0a123cded2c9 Merged revisions 79077,79137,79304-79305 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
72 containing_stmt.insert_child(position + 2, new)