# Path: py3kwarn2to3/fixes/fix_imports.py
# def alternates(members):
#     return "(" + "|".join(map(repr, members)) + ")"
# 
# class FixImports(fixer_base.BaseFix):
# 
#     BM_compatible = True
#     keep_line_order = True
#     # This is overridden in fix_imports2.
#     mapping = MAPPING
# 
#     # We want to run this fixer late, so fix_import doesn't try to make stdlib
#     # renames into relative imports.
#     run_order = 6
# 
#     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:
#             # Module usage could be in the trailer 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
# 
#     def start_tree(self, tree, filename):
#         super(FixImports, self).start_tree(tree, filename)
#         self.replace = {}
# 
#     def transform(self, node, results):
#         import_mod = results.get("module_name")
#         if import_mod:
#             mod_name = import_mod.value
#             new_name = unicode(self.mapping[mod_name])
#             if does_tree_import(
#                     package=new_name,
#                     name=unicode(results['node'].children[-1]).strip(),
#                     node=node):
#                 return
#             import_mod.replace(Name(new_name, prefix=import_mod.prefix))
#             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[mod_name] = new_name
#             if "multiple_imports" in results:
#                 # This is a nasty hack to fix multiple imports on a line (e.g.,
#                 # "import StringIO, urlparse"). The problem is that I can't
#                 # figure out an easy way to make a pattern recognize the keys of
#                 # MAPPING randomly sprinkled in an import statement.
#                 results = self.match(node)
#                 if results:
#                     self.transform(node, results)
#         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.prefix))
# 
# Path: py3kwarn2to3/fixer_util.py
# def KeywordArg(keyword, value):
# def LParen():
# def RParen():
# def Assign(target, source):
# def Name(name, prefix=None):
# def Attr(obj, attr):
# def Comma():
# def Dot():
# def ArgList(args, lparen=LParen(), rparen=RParen()):
# def Call(func_name, args=None, prefix=None):
# def Newline():
# def BlankLine():
# def Number(n, prefix=None):
# def Subscript(index_node):
# def String(string, prefix=None):
# def ListComp(xp, fp, it, test=None):
# def FromImport(package_name, name_leafs):
# def is_tuple(node):
# def is_list(node):
# def parenthesize(node):
# def attr_chain(obj, attr):
# def in_special_context(node):
# def is_probably_builtin(node):
# def find_indentation(node):
# def make_suite(node):
# def find_root(node):
# def does_tree_import(package, name, node):
# def is_import(node):
# def touch_import(package, name, node):
#     def is_import_stmt(node):
# def find_binding(name, node, package=None):
# def _find(name, node):
# def _is_import_binding(node, name, package=None):


from py3kwarn2to3.fixes.fix_imports import alternates, FixImports
from py3kwarn2to3.fixer_util import (Name, Comma, FromImport, Newline,
                                find_indentation, Node, syms)
           ]
}

# Duplicate the url parsing functions for urllib2.
MAPPING["urllib2"].append(MAPPING["urllib"][1])


def build_pattern():
    bare = set()
    for old_module, changes in MAPPING.items():
        for change in changes:
            new_module, members = change
            members = alternates(members)
            yield """import_name< 'import' (module=%r
                                  | dotted_as_names< any* module=%r any* >) >
                  """ % (old_module, old_module)
            yield """import_from< 'from' mod_member=%r 'import'
                       ( member=%s | import_as_name< member=%s 'as' any > |
                         import_as_names< members=any*  >) >
                  """ % (old_module, members, members)
            yield """import_from< 'from' module_star=%r 'import' star='*' >
                  """ % old_module
            yield """import_name< 'import'
                                  dotted_as_name< module_as=%r 'as' any > >
                  """ % old_module
            # bare_with_attr has a special significance for FixImports.match().
            yield """power< bare_with_attr=%r trailer< '.' member=%s > any* >
                  """ % (old_module, members)



# Path: py3kwarn2to3/fixes/fix_imports.py
# def alternates(members):
#     return "(" + "|".join(map(repr, members)) + ")"
# 
# class FixImports(fixer_base.BaseFix):
# 
#     BM_compatible = True
#     keep_line_order = True
#     # This is overridden in fix_imports2.
#     mapping = MAPPING
# 
#     # We want to run this fixer late, so fix_import doesn't try to make stdlib
#     # renames into relative imports.
#     run_order = 6
# 
#     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:
#             # Module usage could be in the trailer 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
# 
#     def start_tree(self, tree, filename):
#         super(FixImports, self).start_tree(tree, filename)
#         self.replace = {}
# 
#     def transform(self, node, results):
#         import_mod = results.get("module_name")
#         if import_mod:
#             mod_name = import_mod.value
#             new_name = unicode(self.mapping[mod_name])
#             if does_tree_import(
#                     package=new_name,
#                     name=unicode(results['node'].children[-1]).strip(),
#                     node=node):
#                 return
#             import_mod.replace(Name(new_name, prefix=import_mod.prefix))
#             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[mod_name] = new_name
#             if "multiple_imports" in results:
#                 # This is a nasty hack to fix multiple imports on a line (e.g.,
#                 # "import StringIO, urlparse"). The problem is that I can't
#                 # figure out an easy way to make a pattern recognize the keys of
#                 # MAPPING randomly sprinkled in an import statement.
#                 results = self.match(node)
#                 if results:
#                     self.transform(node, results)
#         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.prefix))
# 
# Path: py3kwarn2to3/fixer_util.py
# def KeywordArg(keyword, value):
# def LParen():
# def RParen():
# def Assign(target, source):
# def Name(name, prefix=None):
# def Attr(obj, attr):
# def Comma():
# def Dot():
# def ArgList(args, lparen=LParen(), rparen=RParen()):
# def Call(func_name, args=None, prefix=None):
# def Newline():
# def BlankLine():
# def Number(n, prefix=None):
# def Subscript(index_node):
# def String(string, prefix=None):
# def ListComp(xp, fp, it, test=None):
# def FromImport(package_name, name_leafs):
# def is_tuple(node):
# def is_list(node):
# def parenthesize(node):
# def attr_chain(obj, attr):
# def in_special_context(node):
# def is_probably_builtin(node):
# def find_indentation(node):
# def make_suite(node):
# def find_root(node):
# def does_tree_import(package, name, node):
# def is_import(node):
# def touch_import(package, name, node):
#     def is_import_stmt(node):
# def find_binding(name, node, package=None):
# def _find(name, node):
# def _is_import_binding(node, name, package=None):


# Path: py3kwarn2to3/fixes/fix_urllib.py
from py3kwarn2to3.fixes.fix_imports import alternates, FixImports
from py3kwarn2to3.fixer_util import (Name, Comma, FromImport, Newline,
                                find_indentation, Node, syms)

           ]
}

# Duplicate the url parsing functions for urllib2.
MAPPING["urllib2"].append(MAPPING["urllib"][1])


def build_pattern():
    bare = set()
    for old_module, changes in MAPPING.items():
        for change in changes:
            new_module, members = change
            members = alternates(members)
            yield """import_name< 'import' (module=%r
                                  | dotted_as_names< any* module=%r any* >) >
                  """ % (old_module, old_module)
            yield """import_from< 'from' mod_member=%r 'import'
                       ( member=%s | import_as_name< member=%s 'as' any > |
                         import_as_names< members=any*  >) >
                  """ % (old_module, members, members)
            yield """import_from< 'from' module_star=%r 'import' star='*' >
                  """ % old_module
            yield """import_name< 'import'
                                  dotted_as_name< module_as=%r 'as' any > >
                  """ % old_module
            # bare_with_attr has a special significance for FixImports.match().
            yield """power< bare_with_attr=%r trailer< '.' member=%s > any* >
                  """ % (old_module, members)



class FixUrllib(FixImports):