Infer output types for each function defined in the program using a flow-sensitive, block-structured
dataflow analysis over the function body. Returns a mapping from function name to per-output types.
Infer variable types inside each function by performing a flow-sensitive analysis and
returning the joined environment (types per VarId) at function exits and fallthrough.
Validate classdef declarations for basic semantic correctness
Checks: duplicate property/method names within the same class,
conflicts between property and method names, and trivial superclass cycles (self parent)