This module defines the DepNode type which the compiler uses to represent
nodes in the dependency graph. A DepNode consists of a DepKind (which
specifies the kind of thing it represents, like a piece of HIR, MIR, etc.)
and a Fingerprint, a 128-bit hash value, the exact meaning of which
depends on the node’s DepKind. Together, the kind and the fingerprint
fully identify a dependency node, even across multiple compilation sessions.
In other words, the value of the fingerprint does not depend on anything
that is specific to a given compilation session, like an unpredictable
interning key (e.g., NodeId, DefId, Symbol) or the numeric value of a
pointer. The concept behind this could be compared to how git commit hashes
uniquely identify a given commit. The fingerprinting approach has
a few advantages:
A “work product” is an intermediate result that we save into the
incremental directory for later re-use. The primary example are
the object files that we save for each partition at code
generation time.
Tracks ‘side effects’ for a particular query.
This struct is saved to disk along with the query result,
and loaded from disk if we mark the query as green.
This allows us to ‘replay’ changes to global state
that would otherwise only occur if we actually
executed the query method.