ifElseForWhileAssignmentTracker

This field is used to track assignments in if/else branches, for loops and while loops. For example, in the
following code: if (cond) { x = 1 } else { x = '123' } the inferred type of x after the if/else statement should
be the LUB of (int, String)

alreadyVisitedMethods

secondPassExpressions

Some expressions need to be visited twice, because type information may be insufficient at some point. For
example, for closure shared variables, we need a first pass to collect every type which is assigned to a closure
shared variable, then a second pass to ensure that every method call on such a variable is made on a LUB.