@@ -12,7 +12,7 @@ A [`NodeId`] is an identifier number that uniquely identifies an AST node within
12
12
a crate. Every node in the AST has its own [ ` NodeId ` ] , including top-level items
13
13
such as structs, but also individual statements and expressions.
14
14
15
- However, because they are absolute within in a crate, adding or removing a single
15
+ However, because they are absolute within a crate, adding or removing a single
16
16
node in the AST causes all the subsequent [ ` NodeId ` ] s to change. This renders
17
17
[ ` NodeId ` ] s pretty much useless for incremental compilation, where you want as
18
18
few things as possible to change.
@@ -31,14 +31,17 @@ The HIR uses a bunch of different identifiers that coexist and serve different p
31
31
the crate the definition comes from, and a [ ` DefIndex ` ] which identifies the definition
32
32
within the crate. Unlike [ ` NodeId ` ] s, there isn't a [ ` DefId ` ] for every expression, which
33
33
makes them more stable across compilations.
34
+
34
35
- A [ ` LocalDefId ` ] is basically a [ ` DefId ` ] that is known to come from the current crate.
35
36
This allows us to drop the [ ` CrateNum ` ] part, and use the type system to ensure that
36
37
only local definitions are passed to functions that expect a local definition.
38
+
37
39
- A [ ` HirId ` ] uniquely identifies a node in the HIR of the current crate. It is composed
38
40
of two parts: an ` owner ` and a ` local_id ` that is unique within the ` owner ` . This
39
41
combination makes for more stable values which are helpful for incremental compilation.
40
42
Unlike [ ` DefId ` ] s, a [ ` HirId ` ] can refer to [ fine-grained entities] [ Node ] like expressions,
41
43
but stays local to the current crate.
44
+
42
45
- A [ ` BodyId ` ] identifies a HIR [ ` Body ` ] in the current crate. It is currenty only
43
46
a wrapper around a [ ` HirId ` ] . For more info about HIR bodies, please refer to the
44
47
[ HIR chapter] [ hir-bodies ] .
@@ -60,4 +63,46 @@ See the [HIR chapter][hir-map] for more detailed information.
60
63
61
64
## In the MIR
62
65
63
- ** TODO**
66
+ - [ ` BasicBlock ` ] identifies a * basic block* . It points to an instance of
67
+ [ ` BasicBlockData ` ] , which can be retrieved by indexing into
68
+ [ ` Body::basic_blocks() ` ] (note that you must call a function; the field is
69
+ private).
70
+
71
+ - [ ` Local ` ] identifies a local variable in a function. Its associated data is in
72
+ [ ` LocalDecl ` ] , which can be retrieved by indexing into [ ` Body.local_decls ` ] .
73
+
74
+ - [ ` Field ` ] identifies a struct's, union's, or enum variant's field. It is used
75
+ as a "projection" in [ ` Place ` ] .
76
+
77
+ - [ ` SourceScope ` ] identifies a name scope in the original source code. Used for
78
+ diagnostics and for debuginfo in debuggers. It points to an instance of
79
+ [ ` SourceScopeData ` ] , which can be retrieved by indexing into
80
+ [ ` Body.source_scopes ` ] .
81
+
82
+ - [ ` Promoted ` ] identifies a promoted constant within another item (related to
83
+ const evaluation). Note: it is unique only locally within the item, so it
84
+ should be associated with a ` DefId ` .
85
+ [ ` GlobalId ` ] will give you a more specific identifier (TODO).
86
+
87
+ - [ ` GlobalId ` ] identifies a global variable: a ` const ` , a ` static ` , a ` const fn `
88
+ where all arguments are [ zero-sized types] , or a promoted constant.
89
+
90
+ - [ ` Location ` ] represents the location in the MIR of a statement or terminator.
91
+ It identifies the block (using [ ` BasicBlock ` ] ) and the index of the statement
92
+ or terminator in the block.
93
+
94
+ [ `BasicBlock` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlock.html
95
+ [ `BasicBlockData` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlockData.html
96
+ [ `Body::basic_blocks()` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#method.basic_blocks
97
+ [ `Local` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Local.html
98
+ [ `LocalDecl` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.LocalDecl.html
99
+ [ `Body.local_decls` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.local_decls
100
+ [ `Field` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Field.html
101
+ [ `Place` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html
102
+ [ `SourceScope` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.SourceScope.html
103
+ [ `SourceScopeData` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.SourceScopeData.html
104
+ [ `Body.source_scopes` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.source_scopes
105
+ [ `Promoted` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Promoted.html
106
+ [ `GlobalId` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.GlobalId.html
107
+ [ `Location` ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Location.html
108
+ [ zero-sized types ] : https://doc.rust-lang.org/nomicon/exotic-sizes.html#zero-sized-types-zsts
0 commit comments