[Python-checkins] r54303 - in sandbox/trunk/2to3: fixes/basefix.py refactor.py tests/test_fixers.py

collin.winter python-checkins at python.org
Mon Mar 12 21:12:39 CET 2007


Author: collin.winter
Date: Mon Mar 12 21:12:38 2007
New Revision: 54303

Modified:
   sandbox/trunk/2to3/fixes/basefix.py
   sandbox/trunk/2to3/refactor.py
   sandbox/trunk/2to3/tests/test_fixers.py
Log:
Add start_tree() and finish_tree() methods to BaseFix to make it easier for fixers to maintain tree-wide state. Also, make numbers a fixer attribute (instead of a global), using start_tree() to initialize it. This has the advantage that tests that rely on new_name() are no longer dependent on test order.


Modified: sandbox/trunk/2to3/fixes/basefix.py
==============================================================================
--- sandbox/trunk/2to3/fixes/basefix.py	(original)
+++ sandbox/trunk/2to3/fixes/basefix.py	Mon Mar 12 21:12:38 2007
@@ -12,7 +12,6 @@
 import pygram
 
 # For new_name()
-numbers = itertools.count(1)
 
 class BaseFix(object):
 
@@ -29,6 +28,7 @@
     options = None  # Options object passed to initializer
     filename = None # The filename (set by set_filename)
     logger = None   # A logger (set by set_filename)
+    numbers = itertools.count(1) # For new_name()
     used_names = set() # A set of all used NAMEs
 
     # Shortcut for access to Python grammar symbols
@@ -92,7 +92,7 @@
         """
         name = template
         while name in self.used_names:
-            name = template + str(numbers.next())
+            name = template + str(self.numbers.next())
         self.used_names.add(name)
         return name
 
@@ -110,3 +110,23 @@
         self.logger.warning(msg % (lineno, for_output))
         if reason:
             self.logger.warning(reason)
+
+    def start_tree(self, tree, filename):
+        """Some fixers need to maintain tree-wide state.
+        This method is called once, at the start of tree fix-up.
+        
+        tree - the root node of the tree to be processed.
+        filename - the name of the file the tree came from.
+        """
+        self.used_names = tree.used_names
+        self.set_filename(filename)
+        self.numbers = itertools.count(1)
+
+    def finish_tree(self, tree, filename):
+        """Some fixers need to maintain tree-wide state.
+        This method is called once, at the conclusion of tree fix-up.
+        
+        tree - the root node of the tree to be processed.
+        filename - the name of the file the tree came from.
+        """
+        pass

Modified: sandbox/trunk/2to3/refactor.py
==============================================================================
--- sandbox/trunk/2to3/refactor.py	(original)
+++ sandbox/trunk/2to3/refactor.py	Mon Mar 12 21:12:38 2007
@@ -216,8 +216,7 @@
     def refactor_tree(self, tree, filename):
         """Refactors a parse tree (modifying the tree in place)."""
         for fixer in self.fixers:
-            fixer.set_filename(filename)
-            fixer.used_names = tree.used_names
+            fixer.start_tree(tree, filename)
         changes = 0
         for node in tree.post_order():
             for fixer in self.fixers:
@@ -226,6 +225,8 @@
                     if new is not None and new != node:
                         node.replace(new)
                         changes += 1
+        for fixer in self.fixers:
+            fixer.finish_tree(tree, filename)
         return changes
 
     def write_file(self, new_text, filename, old_text=None):

Modified: sandbox/trunk/2to3/tests/test_fixers.py
==============================================================================
--- sandbox/trunk/2to3/tests/test_fixers.py	(original)
+++ sandbox/trunk/2to3/tests/test_fixers.py	Mon Mar 12 21:12:38 2007
@@ -17,7 +17,7 @@
 import refactor
 
 # We wrap the RefactoringTool's fixer objects so we can intercept
-#  the call to set_filename() and so modify the fixers' logging objects.
+#  the call to start_tree() and so modify the fixers' logging objects.
 # This allows us to make sure that certain code chunks produce certain
 #  warnings.
 class Fixer(object):
@@ -27,9 +27,9 @@
 
     def __getattr__(self, attr):
         return getattr(self.fixer, attr)
-
-    def set_filename(self, filename):
-        self.fixer.set_filename(filename)
+        
+    def start_tree(self, tree, filename):
+        self.fixer.start_tree(tree, filename)
         self.fixer.logger.addHandler(self.handler)
 
 class Options:
@@ -527,8 +527,8 @@
         a = """
             try:
                 pass
-            except Exception as xxx_todo_changeme1:
-                (a, b) = xxx_todo_changeme1.message
+            except Exception as xxx_todo_changeme:
+                (a, b) = xxx_todo_changeme.message
                 pass"""
         self.check(b, a)
 
@@ -542,8 +542,8 @@
         a = """
             try:
                 pass
-            except Exception as xxx_todo_changeme2:
-                d[5] = xxx_todo_changeme2
+            except Exception as xxx_todo_changeme:
+                d[5] = xxx_todo_changeme
                 pass"""
         self.check(b, a)
 
@@ -557,8 +557,8 @@
         a = """
             try:
                 pass
-            except Exception as xxx_todo_changeme3:
-                a.foo = xxx_todo_changeme3
+            except Exception as xxx_todo_changeme:
+                a.foo = xxx_todo_changeme
                 pass"""
         self.check(b, a)
 
@@ -572,8 +572,8 @@
         a = """
             try:
                 pass
-            except Exception as xxx_todo_changeme4:
-                a().foo = xxx_todo_changeme4
+            except Exception as xxx_todo_changeme:
+                a().foo = xxx_todo_changeme
                 pass"""
         self.check(b, a)
 
@@ -1134,8 +1134,8 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme5):
-                ((a, b), c) = xxx_todo_changeme5
+            def foo(xxx_todo_changeme):
+                ((a, b), c) = xxx_todo_changeme
                 x = 5"""
         self.check(b, a)
         
@@ -1145,8 +1145,8 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme6, d):
-                ((a, b), c) = xxx_todo_changeme6
+            def foo(xxx_todo_changeme, d):
+                ((a, b), c) = xxx_todo_changeme
                 x = 5"""
         self.check(b, a)
         
@@ -1156,8 +1156,8 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme7, d) -> e:
-                ((a, b), c) = xxx_todo_changeme7
+            def foo(xxx_todo_changeme, d) -> e:
+                ((a, b), c) = xxx_todo_changeme
                 x = 5"""
         self.check(b, a)
         
@@ -1166,7 +1166,7 @@
             def foo(((a, b), c)): x = 5; y = 7"""
                 
         a = """
-            def foo(xxx_todo_changeme15): ((a, b), c) = xxx_todo_changeme15; x = 5; y = 7"""
+            def foo(xxx_todo_changeme): ((a, b), c) = xxx_todo_changeme; x = 5; y = 7"""
         self.check(b, a)
         
     def test_keywords(self):
@@ -1175,8 +1175,8 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme10, d, e=5) -> z:
-                ((a, b), c) = xxx_todo_changeme10
+            def foo(xxx_todo_changeme, d, e=5) -> z:
+                ((a, b), c) = xxx_todo_changeme
                 x = 5"""
         self.check(b, a)
         
@@ -1186,8 +1186,8 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme16, d, *vargs, **kwargs) -> z:
-                ((a, b), c) = xxx_todo_changeme16
+            def foo(xxx_todo_changeme, d, *vargs, **kwargs) -> z:
+                ((a, b), c) = xxx_todo_changeme
                 x = 5"""
         self.check(b, a)
         
@@ -1197,9 +1197,9 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme11, xxx_todo_changeme12) -> z:
-                ((a, b), c) = xxx_todo_changeme11
-                (d, e, f) = xxx_todo_changeme12
+            def foo(xxx_todo_changeme, xxx_todo_changeme1) -> z:
+                ((a, b), c) = xxx_todo_changeme
+                (d, e, f) = xxx_todo_changeme1
                 x = 5"""
         self.check(b, a)
         
@@ -1209,9 +1209,9 @@
                 x = 5"""
                 
         a = """
-            def foo(x, xxx_todo_changeme13, d, xxx_todo_changeme14, y) -> z:
-                ((a, b), c) = xxx_todo_changeme13
-                (e, f, g) = xxx_todo_changeme14
+            def foo(x, xxx_todo_changeme, d, xxx_todo_changeme1, y) -> z:
+                ((a, b), c) = xxx_todo_changeme
+                (e, f, g) = xxx_todo_changeme1
                 x = 5"""
         self.check(b, a)
         
@@ -1222,10 +1222,10 @@
                 x = 5"""
                 
         a = """
-            def foo(xxx_todo_changeme8, xxx_todo_changeme9) -> z:
+            def foo(xxx_todo_changeme, xxx_todo_changeme1) -> z:
                 "foo foo foo foo"
-                ((a, b), c) = xxx_todo_changeme8
-                (d, e, f) = xxx_todo_changeme9
+                ((a, b), c) = xxx_todo_changeme
+                (d, e, f) = xxx_todo_changeme1
                 x = 5"""
         self.check(b, a)
 


More information about the Python-checkins mailing list