Skip to content

Make a useful inter-procedural dynamic type locator that acts on any reference expression

Kinds of expressions that may be objects and how to handle them:

  • Method call: check return variable -output-.
  • Variable: look for definition via VariableAction and check that expression.
  • Field access: look for definition via VariableAction and check that expression.
  • Parameter: look for definition in every caller to this method (search for actual-in nodes' types, transitively) and check that expression.
  • Array access: assume every type possible (in the future, track each position).
  • Cast, parenthesis, etc.: unwrap if appropriate (if downcast, assume cast type and subtypes).
  • Object creation, array creation: only the given type.

Alter the creation of the call graph to remove arcs that shouldn't be there: if the scope cannot be of a given type, some method may never be called. This is a fixed-point problem, where we can assume as initial guess that the return values may be of any possible type. Each change (arc deletion) must be propagated in both directions: the callee no longer receives certain types as parameters, and the caller no longer obtains certain types as return value.