Example #1
0
 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
Example #2
0
 def analyze_expr_type(self, expr):
     store, _fixed_vars = self.get_type_store()
     return T.analyze_expr_type(expr, store)