| Index: third_party/google-endpoints/libfuturize/fixes/fix_division_safe.py
|
| diff --git a/third_party/google-endpoints/libfuturize/fixes/fix_division_safe.py b/third_party/google-endpoints/libfuturize/fixes/fix_division_safe.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5e16b0a514cea96abc2b51736ca7b60b44bc4382
|
| --- /dev/null
|
| +++ b/third_party/google-endpoints/libfuturize/fixes/fix_division_safe.py
|
| @@ -0,0 +1,72 @@
|
| +"""
|
| +For the ``future`` package.
|
| +
|
| +Adds this import line:
|
| +
|
| + from __future__ import division
|
| +
|
| +at the top and changes any old-style divisions to be calls to
|
| +past.utils.old_div so the code runs as before on Py2.6/2.7 and has the same
|
| +behaviour on Py3.
|
| +
|
| +If "from __future__ import division" is already in effect, this fixer does
|
| +nothing.
|
| +"""
|
| +
|
| +from lib2to3 import fixer_base
|
| +from lib2to3.fixer_util import syms, does_tree_import
|
| +from libfuturize.fixer_util import (token, future_import, touch_import_top,
|
| + wrap_in_fn_call)
|
| +
|
| +
|
| +def match_division(node):
|
| + u"""
|
| + __future__.division redefines the meaning of a single slash for division,
|
| + so we match that and only that.
|
| + """
|
| + slash = token.SLASH
|
| + return node.type == slash and not node.next_sibling.type == slash and \
|
| + not node.prev_sibling.type == slash
|
| +
|
| +
|
| +class FixDivisionSafe(fixer_base.BaseFix):
|
| + # BM_compatible = True
|
| + run_order = 4 # this seems to be ignored?
|
| +
|
| + _accept_type = token.SLASH
|
| +
|
| + PATTERN = """
|
| + term<(not('/') any)+ '/' ((not('/') any))>
|
| + """
|
| +
|
| + def start_tree(self, tree, name):
|
| + """
|
| + Skip this fixer if "__future__.division" is already imported.
|
| + """
|
| + super(FixDivisionSafe, self).start_tree(tree, name)
|
| + self.skip = "division" in tree.future_features
|
| +
|
| + def match(self, node):
|
| + u"""
|
| + Since the tree needs to be fixed once and only once if and only if it
|
| + matches, we can start discarding matches after the first.
|
| + """
|
| + if (node.type == self.syms.term and
|
| + len(node.children) == 3 and
|
| + match_division(node.children[1])):
|
| + expr1, expr2 = node.children[0], node.children[2]
|
| + return expr1, expr2
|
| + else:
|
| + return False
|
| +
|
| + def transform(self, node, results):
|
| + if self.skip:
|
| + return
|
| + future_import(u"division", node)
|
| +
|
| + touch_import_top(u'past.utils', u'old_div', node)
|
| + expr1, expr2 = results[0].clone(), results[1].clone()
|
| + # Strip any leading space for the first number:
|
| + expr1.prefix = u''
|
| + return wrap_in_fn_call("old_div", (expr1, expr2), prefix=node.prefix)
|
| +
|
|
|