nac3-spec/hm-inference/test.py

56 lines
1.1 KiB
Python
Raw Normal View History

2021-07-09 16:06:06 +08:00
from __future__ import annotations
2021-07-09 15:27:02 +08:00
import ast
from ast_visitor import Visitor
from nac3_types import *
var = TVar([TInt, TBool])
2021-07-09 17:11:34 +08:00
var2 = TVar([TInt, TBool])
2021-07-09 15:27:02 +08:00
foo = TObj('Foo', {
'foo': TFunc([
FuncArg('a', var, False),
FuncArg('b', var2, False)
], var2, set([var2]))
}, [var])
v = Visitor()
v.assignments['get_x'] = TFunc([FuncArg('in', var, False)], TInt, set([var]))
v.assignments['Foo'] = TFunc([FuncArg('a', var, False)], foo, set([var]))
prelude = set(v.assignments.keys())
print('-----------')
print('prelude')
for key, value in v.assignments.items():
print(f'{key}: {value}')
print('-----------')
src = """
2021-07-09 17:11:34 +08:00
a = f.foo(1, 2)
b = f.foo(1, True)
c = g.foo(True, 1)
d = g.foo(True, True)
f = Foo(1)
2021-07-09 17:31:54 +08:00
g = Foo(True)
2021-07-09 15:27:02 +08:00
"""
print(src)
v.visit(ast.parse(src))
print('-----------')
print('assignments')
for key, value in v.assignments.items():
if key not in prelude:
value.check()
print(f'{key}: {value.find()}')
print('-----------')
print('calls')
for x in v.calls:
x.check()
print(f'{x.find()}')
# TODO: Occur check