56 lines
1.0 KiB
Python
56 lines
1.0 KiB
Python
from __future__ import annotations
|
|
import ast
|
|
from ast_visitor import Visitor
|
|
from nac3_types import *
|
|
|
|
|
|
var = TVar([TInt, TBool])
|
|
var2 = TVar([TInt, TBool])
|
|
|
|
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 = """
|
|
a = f.foo(1, 2)
|
|
b = f.foo(1, True)
|
|
c = g.foo(True, 1)
|
|
d = g.foo(True, True)
|
|
|
|
f = Foo(1)
|
|
g = Foo(1)
|
|
"""
|
|
|
|
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
|