+++ /dev/null
-# Copyright 2007 Google, Inc. All Rights Reserved.\r
-# Licensed to PSF under a Contributor Agreement.\r
-\r
-"""Fixer that changes xrange(...) into range(...)."""\r
-\r
-# Local imports\r
-from .. import fixer_base\r
-from ..fixer_util import Name, Call, consuming_calls\r
-from .. import patcomp\r
-\r
-\r
-class FixXrange(fixer_base.BaseFix):\r
- BM_compatible = True\r
- PATTERN = """\r
- power<\r
- (name='range'|name='xrange') trailer< '(' args=any ')' >\r
- rest=any* >\r
- """\r
-\r
- def start_tree(self, tree, filename):\r
- super(FixXrange, self).start_tree(tree, filename)\r
- self.transformed_xranges = set()\r
-\r
- def finish_tree(self, tree, filename):\r
- self.transformed_xranges = None\r
-\r
- def transform(self, node, results):\r
- name = results["name"]\r
- if name.value == u"xrange":\r
- return self.transform_xrange(node, results)\r
- elif name.value == u"range":\r
- return self.transform_range(node, results)\r
- else:\r
- raise ValueError(repr(name))\r
-\r
- def transform_xrange(self, node, results):\r
- name = results["name"]\r
- name.replace(Name(u"range", prefix=name.prefix))\r
- # This prevents the new range call from being wrapped in a list later.\r
- self.transformed_xranges.add(id(node))\r
-\r
- def transform_range(self, node, results):\r
- if (id(node) not in self.transformed_xranges and\r
- not self.in_special_context(node)):\r
- range_call = Call(Name(u"range"), [results["args"].clone()])\r
- # Encase the range call in list().\r
- list_call = Call(Name(u"list"), [range_call],\r
- prefix=node.prefix)\r
- # Put things that were after the range() call after the list call.\r
- for n in results["rest"]:\r
- list_call.append_child(n)\r
- return list_call\r
-\r
- P1 = "power< func=NAME trailer< '(' node=any ')' > any* >"\r
- p1 = patcomp.compile_pattern(P1)\r
-\r
- P2 = """for_stmt< 'for' any 'in' node=any ':' any* >\r
- | comp_for< 'for' any 'in' node=any any* >\r
- | comparison< any 'in' node=any any*>\r
- """\r
- p2 = patcomp.compile_pattern(P2)\r
-\r
- def in_special_context(self, node):\r
- if node.parent is None:\r
- return False\r
- results = {}\r
- if (node.parent.parent is not None and\r
- self.p1.match(node.parent.parent, results) and\r
- results["node"] is node):\r
- # list(d.keys()) -> list(d.keys()), etc.\r
- return results["func"].value in consuming_calls\r
- # for ... in d.iterkeys() -> for ... in d.keys(), etc.\r
- return self.p2.match(node.parent, results) and results["node"] is node\r