diff options
Diffstat (limited to 'Lib/lib2to3/fixes')
-rw-r--r-- | Lib/lib2to3/fixes/fix_dict.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_except.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_imports.py | 64 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_imports2.py | 1 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_next.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_numliterals.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_renames.py | 2 | ||||
-rw-r--r-- | Lib/lib2to3/fixes/fix_urllib.py | 6 |
8 files changed, 46 insertions, 35 deletions
diff --git a/Lib/lib2to3/fixes/fix_dict.py b/Lib/lib2to3/fixes/fix_dict.py index 485a08c..dec94c5 100644 --- a/Lib/lib2to3/fixes/fix_dict.py +++ b/Lib/lib2to3/fixes/fix_dict.py @@ -28,7 +28,7 @@ from .. import pytree from .. import patcomp from ..pgen2 import token from .. import fixer_base -from ..fixer_util import Name, Call, LParen, RParen, ArgList, Dot, set +from ..fixer_util import Name, Call, LParen, RParen, ArgList, Dot from .. import fixer_util diff --git a/Lib/lib2to3/fixes/fix_except.py b/Lib/lib2to3/fixes/fix_except.py index 8387913..dc2a5b1 100644 --- a/Lib/lib2to3/fixes/fix_except.py +++ b/Lib/lib2to3/fixes/fix_except.py @@ -25,7 +25,7 @@ The following cases will be converted: from .. import pytree from ..pgen2 import token from .. import fixer_base -from ..fixer_util import Assign, Attr, Name, is_tuple, is_list, reversed +from ..fixer_util import Assign, Attr, Name, is_tuple, is_list def find_excepts(nodes): for i, n in enumerate(nodes): diff --git a/Lib/lib2to3/fixes/fix_imports.py b/Lib/lib2to3/fixes/fix_imports.py index 38e868b..e48c4f0 100644 --- a/Lib/lib2to3/fixes/fix_imports.py +++ b/Lib/lib2to3/fixes/fix_imports.py @@ -1,9 +1,9 @@ """Fix incompatible imports and module references.""" -# Author: Collin Winter +# Authors: Collin Winter, Nick Edds # Local imports from .. import fixer_base -from ..fixer_util import Name, attr_chain, any, set +from ..fixer_util import Name, attr_chain MAPPING = {'StringIO': 'io', 'cStringIO': 'io', @@ -61,36 +61,49 @@ def alternates(members): 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()]) - 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_name_list - yield """bare_name=%s""" % alternates(mapping.keys()) + """ % mod_list + + # Find usages of module members in code e.g. thread.foo(bar) + yield "power< bare_with_attr=(%s) trailer<'.' any > any* >" % 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 + def build_pattern(self): + return "|".join(build_pattern(self.mapping)) + + def compile_pattern(self): + # We override this, so MAPPING can be pragmatically altered and the + # changes will be reflected in PATTERN. + self.PATTERN = self.build_pattern() + super(FixImports, self).compile_pattern() + + # 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 any([match(obj) for obj in attr_chain(node, "parent")]): + # 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 return False @@ -100,20 +113,17 @@ class FixImports(fixer_base.BaseFix): self.replace = {} def transform(self, node, results): - import_mod = results.get("module") - mod_name = results.get("module_name") - bare_name = results.get("bare_name") - - 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 bare_name: - bare_name = bare_name[0] + else: + # Replace usage of the module. + bare_name = results["bare_with_attr"][0] new_name = self.replace.get(bare_name.value) if new_name: bare_name.replace(Name(new_name, prefix=bare_name.get_prefix())) diff --git a/Lib/lib2to3/fixes/fix_imports2.py b/Lib/lib2to3/fixes/fix_imports2.py index e82f7e4..bcd7aa6 100644 --- a/Lib/lib2to3/fixes/fix_imports2.py +++ b/Lib/lib2to3/fixes/fix_imports2.py @@ -10,7 +10,6 @@ MAPPING = { class FixImports2(fix_imports.FixImports): - PATTERN = "|".join((fix_imports.build_pattern(MAPPING))) order = "post" diff --git a/Lib/lib2to3/fixes/fix_next.py b/Lib/lib2to3/fixes/fix_next.py index 9f1861e..492b515 100644 --- a/Lib/lib2to3/fixes/fix_next.py +++ b/Lib/lib2to3/fixes/fix_next.py @@ -9,7 +9,7 @@ from ..pgen2 import token from ..pygram import python_symbols as syms from .. import fixer_base -from ..fixer_util import Name, Call, find_binding, any +from ..fixer_util import Name, Call, find_binding bind_warning = "Calls to builtin next() possibly shadowed by global binding" diff --git a/Lib/lib2to3/fixes/fix_numliterals.py b/Lib/lib2to3/fixes/fix_numliterals.py index 682aac5..d821e39 100644 --- a/Lib/lib2to3/fixes/fix_numliterals.py +++ b/Lib/lib2to3/fixes/fix_numliterals.py @@ -6,7 +6,7 @@ # Local imports from ..pgen2 import token from .. import fixer_base -from ..fixer_util import Number, set +from ..fixer_util import Number class FixNumliterals(fixer_base.BaseFix): diff --git a/Lib/lib2to3/fixes/fix_renames.py b/Lib/lib2to3/fixes/fix_renames.py index 181c625..3049610 100644 --- a/Lib/lib2to3/fixes/fix_renames.py +++ b/Lib/lib2to3/fixes/fix_renames.py @@ -8,7 +8,7 @@ Fixes: # Local imports from .. import fixer_base -from ..fixer_util import Name, attr_chain, any, set +from ..fixer_util import Name, attr_chain MAPPING = {"sys": {"maxint" : "maxsize"}, } diff --git a/Lib/lib2to3/fixes/fix_urllib.py b/Lib/lib2to3/fixes/fix_urllib.py index 78bf7ab..ea7e9ca 100644 --- a/Lib/lib2to3/fixes/fix_urllib.py +++ b/Lib/lib2to3/fixes/fix_urllib.py @@ -7,7 +7,7 @@ # Local imports from .fix_imports import alternates, FixImports from .. import fixer_base -from ..fixer_util import Name, Comma, FromImport, Newline, attr_chain, any, set +from ..fixer_util import Name, Comma, FromImport, Newline, attr_chain MAPPING = {'urllib': [ ('urllib.request', @@ -65,7 +65,9 @@ def build_pattern(): class FixUrllib(FixImports): - PATTERN = "|".join(build_pattern()) + + def build_pattern(self): + return "|".join(build_pattern()) def transform_import(self, node, results): """Transform for the basic import case. Replaces the old |