kuroko/test/testExpressionUnderlining.krk
2024-01-07 17:51:50 +09:00

99 lines
2.5 KiB
Python

import dis
import fileio
from collections import deque
def test_a():
def bar():
return "string" + 42
def foo():
return bar() * 4
foo()
def test_b():
let foo = {
'bar': {
'baz': None
}
}
print(foo['bar']['baz']['qux']['etc'])
def test_c():
import os
os.system(42)
def test_d():
let a = object()
a.name = '42'
let b = None
let c = object()
c.name = '42'
print(a.name, b.name, c.name)
def test_e():
let a = 1
let b = 2
class Confabulator:
def __add__(self,other):
return NotImplemented
let c = Confabulator()
let d = 4
let x = (a + b) @ (c + d)
def test_f():
class Thing:
def __init__(self, required):
pass
def __eq__(self, other):
raise ValueError("oh no")
Thing('a') == Thing()
def disrec(code, seen):
let next = deque()
next.append(code)
while next:
let co = next.popleft()
seen.add(co)
let offset = 0
for inst,size,operand in dis.examine(co):
let expr = dis.ip_to_expression(co, offset + size - 1)
if expr is not None:
let lineNo, start, midStart, midEnd, end = expr
if co.__file__:
let j = 1
with fileio.open(co.__file__,'r') as f:
let line = f.readlines()[lineNo-1].rstrip()
let i = 0
while i < len(line):
if line[i] not in ' \t': break
j++
i++
while i < len(line):
print(line[i],end='')
i++
print()
while j < start:
print(' ',end='')
j++
while j < midStart:
print('~',end='')
j++
while j < midEnd:
print('^',end='')
j++
while j < end:
print('~',end='')
j++
print()
if isinstance(operand,codeobject) and operand not in seen:
next.append(operand)
offset += size
for func_name in dir():
if func_name.startswith('test_'):
disrec(globals()[func_name].__code__,set())