def run_type_inference(self, tree): """Run type inference over the program, using each symbol's type attribute as a starting point. Return a list of nodes where well-typedness is violated, and a list of variables whose max type is exceeded. """ store, fixed_vars = self.get_type_store() store, illtyped = T.analyze_types(tree, store, fixed_vars) # Write back non-query symbol types. badsyms = set() for name, type in store.items(): sym = self.symbols[name] sym.type = type if not type.issmaller(sym.max_type): badsyms.add(sym) # Write back query symbol types. for sym in self.get_queries().values(): type = T.analyze_expr_type(sym.node, store) sym.type = type return illtyped, badsyms
def analyze_expr_type(self, expr): store, _fixed_vars = self.get_type_store() return T.analyze_expr_type(expr, store)