-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrewrite_line_check.py
More file actions
58 lines (50 loc) · 1.38 KB
/
rewrite_line_check.py
File metadata and controls
58 lines (50 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# test code to rewrite python function but still get error messages on
# correct line, and debugger and coverage still working.
import ast
import inspect
import types
def fn():
print('line 1')
print('line 2')
#print(l)
print('line 4')
def fix_line_nos(to_node: ast.AST, from_node: ast.AST):
to_node.lineno = from_node.lineno
to_node.end_lineno = from_node.end_lineno
to_node.col_offset = from_node.col_offset
to_node.end_col_offset = from_node.end_col_offset
for child_node in ast.iter_child_nodes(to_node):
fix_line_nos(child_node, to_node)
lines, lnum = inspect.getsourcelines(fn)
#s = '\n'*(lnum-1)+''.join(lines)
s = ''.join(lines)
r = ast.parse(s)
ast.increment_lineno(r, lnum-1)
print(s)
print(r)
ss = r.body[0].body
#ns = [ss[0], ss[0],ss[1],ss[2]]
ns = []
print(ss)
for node in ss:
raw = ast.unparse(node)
nm = ast.parse(raw, __name__, mode='exec')
nns = nm.body
nn = nns[0]
#nn.value.lineno = node.value.lineno
#nn.value.end_lineno = node.value.end_lineno
# nn.value = node.value
#ast.copy_location(nn, node)
# ast.fix_missing_locations(nn)
fix_line_nos(nn, node)
ns.append(nn)
print(ns)
r.body[0].body = ns
m = compile(r, fn.__code__.co_filename, mode='exec')
print(m)
fn2_code = m.co_consts[0]
print(fn2_code)
fn2 = types.FunctionType(fn2_code, fn.__globals__)
# fn2.__code__.co_firstlineno = 9
print(fn2)
fn2()