[Python-checkins] r67392 - sandbox/trunk/2to3/lib2to3/fixes/fix_imports.py

benjamin.peterson python-checkins at python.org
Wed Nov 26 18:11:41 CET 2008


Author: benjamin.peterson
Date: Wed Nov 26 18:11:40 2008
New Revision: 67392

Log:
simpilfy and comment fix_imports

Modified:
   sandbox/trunk/2to3/lib2to3/fixes/fix_imports.py

Modified: sandbox/trunk/2to3/lib2to3/fixes/fix_imports.py
==============================================================================
--- sandbox/trunk/2to3/lib2to3/fixes/fix_imports.py	(original)
+++ sandbox/trunk/2to3/lib2to3/fixes/fix_imports.py	Wed Nov 26 18:11:40 2008
@@ -1,5 +1,5 @@
 """Fix incompatible imports and module references."""
-# Author: Collin Winter
+# Authors: Collin Winter, Nick Edds
 
 # Local imports
 from .. import fixer_base
@@ -61,38 +61,43 @@
 
 
 def build_pattern(mapping=MAPPING):
-    mod_list = ' | '.join(["module='" + key + "'" for key in mapping.keys()])
-    mod_name_list = ' | '.join(["module_name='" + key + "'" for key in mapping.keys()])
-    mod_attribute_list = ' | '.join(["mod_with_attribute='" + key + "'"
-                                     for key in mapping.keys()])
-    yield """import_name< 'import' ((%s)
+    mod_list = ' | '.join(["module_name='%s'" % key for key in mapping])
+    bare_names = alternates(mapping.keys())
+
+    yield """name_import=import_name< 'import' ((%s)
                           | dotted_as_names< any* (%s) any* >) >
           """ % (mod_list, mod_list)
     yield """import_from< 'from' (%s) 'import' ['(']
               ( any | import_as_name< any 'as' any > |
                 import_as_names< any* >)  [')'] >
-          """ % mod_name_list
+          """ % mod_list
     yield """import_name< 'import'
                           dotted_as_name< (%s) 'as' any > >
-          """ % mod_name_list
-    # Find usages of module members in code e.g. urllib.foo(bar)
-    yield """power< (%s)
-             trailer<'.' any > any* >
-          """ % mod_attribute_list
-    yield "bare_name=(%s)" % alternates(mapping.keys())
+          """ % mod_list
+
+    # Find usages of module members in code e.g. thread.foo(bar)
+    # We differentiate between "bare_with_attr" and "bare_name" for the benfit
+    # of the match() override in FixImports.
+    yield "power< bare_with_attr=(%s) trailer<'.' any > any* >" % bare_names
+    yield "bare_name=(%s)" % bare_names
+
 
 class FixImports(fixer_base.BaseFix):
+
     PATTERN = "|".join(build_pattern())
     order = "pre" # Pre-order tree traversal
 
+    # This is overridden in fix_imports2.
     mapping = MAPPING
 
-    # Don't match the node if it's within another match
+    # Don't match the node if it's within another match.
     def match(self, node):
         match = super(FixImports, self).match
         results = match(node)
         if results:
-            if "mod_with_attribute" not in results and \
+            # Module usage could be in the trailier of an attribute lookup, so
+            # we might have nested matches when "bare_with_attr" is present.
+            if "bare_with_attr" not in results and \
                     any([match(obj) for obj in attr_chain(node, "parent")]):
                 return False
             return results
@@ -103,25 +108,17 @@
         self.replace = {}
 
     def transform(self, node, results):
-        import_mod = results.get("module")
-        mod_name = results.get("module_name")
-        bare_name = results.get("bare_name")
-        mod_with_attribute = results.get("mod_with_attribute")
-
-        if import_mod or mod_name:
-            new_name = self.mapping[(import_mod or mod_name).value]
-
+        import_mod = results.get("module_name")
         if import_mod:
-            self.replace[import_mod.value] = new_name
+            new_name = self.mapping[(import_mod or mod_name).value]
+            if "name_import" in results:
+                # If it's not a "from x import x, y" or "import x as y" import,
+                # marked its usage to be replaced.
+                self.replace[import_mod.value] = new_name
             import_mod.replace(Name(new_name, prefix=import_mod.get_prefix()))
-        elif mod_name:
-            mod_name.replace(Name(new_name, prefix=mod_name.get_prefix()))
-        elif mod_with_attribute:
-            new_name = self.replace.get(mod_with_attribute.value)
-            if new_name:
-                mod_with_attribute.replace(Name(new_name,
-                                                prefix=mod_with_attribute.get_prefix()))
-        elif bare_name:
+        else:
+            # Replace usage of the module.
+            bare_name = results.get("bare_with_attr") or results.get("bare_name")
             bare_name = bare_name[0]
             new_name = self.replace.get(bare_name.value)
             if new_name:


More information about the Python-checkins mailing list