Based on a flow-insensitive static single-assignment symbol-table-style approach. This pass aims to be fast and
deterministic and does not try to converge to some fixed point but rather iterates a fixed number of times. This
will help recover:
Imported call signatures from external dependencies
Dynamic type hints for
mutable variables in a compilation unit.
The algorithm flows roughly as follows:
Scan for method signatures of methods for each compilation unit,
either by internally defined methods or by reading import signatures. This includes looking for aliases, e.g. import
foo as bar.
(Optionally) Prune these method signatures by checking their validity against the
CPG.
Visit assignments to populate where variables are assigned a value to extrapolate its type. Store these
values in a local symbol table. If a field is assigned a value, store this in the global table
Find
instances of where these fields and 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 symbol tables use the SymbolTable class to track possible type information. Note: Local symbols
are cleared once a compilation unit is complete. This is to keep memory usage down while maximizing
concurrency.
Attributes
CompilationUnitType
the AstNode type used to represent a compilation unit of the language.
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.