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