Commit dc99b9f8 authored by Bryton Lacquement's avatar Bryton Lacquement 🚪

New fixer: fix_division

parent 6ec5b62b
import builtins
from collections import defaultdict
import lib2to3.fixer_base
import os
import re
trace_file_match = re.compile(r"^(.*):(.*):(.*) <type '(.*)'> / <type '(.*)'>$").match
def parse_trace_data(filepath):
def tree():
return defaultdict(tree)
traces = tree()
with open(filepath) as f:
for line in f:
file, lineno, id_, dividend_type, divisor_type = trace_file_match(line).groups()
lineno = int(lineno)
id_ = int(id_)
dividend_type = getattr(builtins, dividend_type)
divisor_type = getattr(builtins, divisor_type)
t = traces[file][lineno]
data = (dividend_type, divisor_type)
if id_ in t:
t[id_].add(data)
else:
t[id_] = {data}
return traces
class FixDivision(lib2to3.fixer_base.BaseFix):
"""Rewrites division_traced(n, a, b) into Py2/Py3-compatible division
The `TRACE_FILE` environment variable must point to the trace data file. See
`fix_trace_division.py` for more details.
"""
traces = parse_trace_data(os.environ["TRACE_FILE"])
# Inspired by https://github.com/python/cpython/blob/e42b705188271da108de42b55d9344642170aa2b/Lib/lib2to3/fixes/fix_xrange.py#L14
PATTERN = """
power<'division_traced' trailer< '(' args=any ')' >
rest=any* >
"""
def start_tree(self, tree, filename):
super(FixDivision, self).start_tree(tree, filename)
self.absolute_filename = os.path.abspath(filename)
def transform(self, node, results):
lineno = node.get_lineno()
id_ = int(node.children[1].children[1].children[0].value)
data = self.traces[self.absolute_filename][lineno][id_]
# TODO: analyse `data`, and replace the node to rewrite code
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment