DefId identifies a particular definition, by combining a crate
index and a def index.
A DefIndex is an index into the hir-map for a crate, identifying a particular definition. It should really be considered an interned shorthand for a particular DefPath.
DefPathHash is a fixed-size representation of a
DefPath that is
stable across crate and compilation session boundaries. It consists of two
separate 64-bit hashes. The first uniquely identifies the crate this
DefPathHash originates from (see StableCrateId), and the second
uniquely identifies the corresponding
DefPath within that crate. Together
they form a unique identifier within an entire crate graph.
A LocalDefId is equivalent to a DefId with
krate == LOCAL_CRATE. Since
we encode this information in the type, we can ensure at compile time that
no DefIds from upstream crates get thrown into the mix. There are quite a
few cases where we know that only DefIds from the local crate are expected
and a DefId from a different crate would signify a bug somewhere. This
is when LocalDefId comes in handy.
The crate root is always assigned index 0 by the AST Map code,
Item definitions in the currently-compiled crate would have the
LOCAL_CRATE in their