abstract class XTypeRecovery(cpg: Cpg) extends CpgPass
Based on a flow-insensitive symbol-table-style approach. This does not accurately determine the difference between
shadowed variables in the same file but this is due to REF edges not connecting children methods to parent scope
(yet).
The algorithm flows roughly as follows:
Scan the CPG for method signatures of methods which are in scope
of each compilation unit, either by internally defined methods or by reading import signatures. This includes
looking for aliases, e.g. import foo as bar. Store these details in the global table
TODO: While performing
the above, note field/member assignments in the global table.
(Optionally) Prune these method signatures by
checking their validity against the CPG.
Visit each compilation unit and:
Visit assignments to
populate where variables are assigned a value to extrapolate its type. Store these values in a local symbol
table.
Find instances of where these variables are used and update their type information.
If this
variable is the receiver of a call, make sure to set the type of the call accordingly.
The global and local symbol tables use the SymbolTable class to track possible type information.
The initial import setting is over-approximated, so this step checks the CPG for any matches and prunes against
these findings. If there are no findings, it will leave the table as is. The latter is significant for external
types or methods.
The initial import setting is over-approximated, so this step checks the CPG for any matches and prunes against
these findings. If there are no findings, it will leave the table as is. The latter is significant for external
types or methods.
Name of the pass. By default it is inferred from the name of the class, override if needed.
Name of the pass. By default it is inferred from the name of the class, override if needed.
Attributes
Inherited from:
CpgPassBase
final override def runOnPart(builder: DiffGraphBuilder, part: AnyRef): Unit
Attributes
Definition Classes
CpgPass -> NewStyleCpgPassBase
Inherited from:
CpgPass
override def runWithBuilder(externalBuilder: DiffGraphBuilder): Int
Runs the cpg pass, adding changes to the passed builder. Use with caution -- API is unstable. Returns max(nParts,
1), where nParts is either the number of parallel parts, or the number of iterarator elements in case of legacy
passes. Includes init() and finish() logic.
Runs the cpg pass, adding changes to the passed builder. Use with caution -- API is unstable. Returns max(nParts,
1), where nParts is either the number of parallel parts, or the number of iterarator elements in case of legacy
passes. Includes init() and finish() logic.
Wraps runWithBuilder with logging, and swallows raised exceptions. Use with caution -- API is unstable. A return
value of -1 indicates failure, otherwise the return value of runWithBuilder is passed through.
Wraps runWithBuilder with logging, and swallows raised exceptions. Use with caution -- API is unstable. A return
value of -1 indicates failure, otherwise the return value of runWithBuilder is passed through.