fix_renames.py 2.17 KB
Newer Older
1 2 3 4 5 6 7 8 9
"""Fix incompatible renames

Fixes:
  * sys.maxint -> sys.maxsize
"""
# Author: Christian Heimes
# based on Collin Winter's fix_import

# Local imports
10
from .. import fixer_base
11
from ..fixer_util import Name, attr_chain
12 13 14 15 16 17 18 19 20 21 22

MAPPING = {"sys":  {"maxint" : "maxsize"},
          }
LOOKUP = {}

def alternates(members):
    return "(" + "|".join(map(repr, members)) + ")"


def build_pattern():
    #bare = set()
23 24
    for module, replace in list(MAPPING.items()):
        for old_attr, new_attr in list(replace.items()):
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
            LOOKUP[(module, old_attr)] = new_attr
            #bare.add(module)
            #bare.add(old_attr)
            #yield """
            #      import_name< 'import' (module=%r
            #          | dotted_as_names< any* module=%r any* >) >
            #      """ % (module, module)
            yield """
                  import_from< 'from' module_name=%r 'import'
                      ( attr_name=%r | import_as_name< attr_name=%r 'as' any >) >
                  """ % (module, old_attr, old_attr)
            yield """
                  power< module_name=%r trailer< '.' attr_name=%r > any* >
                  """ % (module, old_attr)
    #yield """bare_name=%s""" % alternates(bare)


42
class FixRenames(fixer_base.BaseFix):
Benjamin Peterson's avatar
Benjamin Peterson committed
43
    BM_compatible = True
44 45 46 47 48 49 50 51 52
    PATTERN = "|".join(build_pattern())

    order = "pre" # Pre-order tree traversal

    # Don't match the node if it's within another match
    def match(self, node):
        match = super(FixRenames, self).match
        results = match(node)
        if results:
53
            if any(match(obj) for obj in attr_chain(node, "parent")):
54 55 56 57 58 59 60 61 62 63 64 65 66
                return False
            return results
        return False

    #def start_tree(self, tree, filename):
    #    super(FixRenames, self).start_tree(tree, filename)
    #    self.replace = {}

    def transform(self, node, results):
        mod_name = results.get("module_name")
        attr_name = results.get("attr_name")
        #bare_name = results.get("bare_name")
        #import_mod = results.get("module")
67

68
        if mod_name and attr_name:
69
            new_attr = LOOKUP[(mod_name.value, attr_name.value)]
70
            attr_name.replace(Name(new_attr, prefix=attr_name.prefix))