Skip to content

Commit 4e376ba

Browse files
Merge #8954
8954: internal: document ItemTree design r=jonas-schievink a=jonas-schievink bors r+ Co-authored-by: Jonas Schievink <[email protected]>
2 parents 951c0e9 + 693325f commit 4e376ba

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

crates/hir_def/src/item_tree.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,34 @@
11
//! A simplified AST that only contains items.
2+
//!
3+
//! This is the primary IR used throughout `hir_def`. It is the input to the name resolution
4+
//! algorithm, as well as to the queries defined in `adt.rs`, `data.rs`, and most things in
5+
//! `attr.rs`.
6+
//!
7+
//! `ItemTree`s are built per `HirFileId`, from the syntax tree of the parsed file. This means that
8+
//! they are crate-independent: they don't know which `#[cfg]`s are active or which module they
9+
//! belong to, since those concepts don't exist at this level (a single `ItemTree` might be part of
10+
//! multiple crates, or might be included into the same crate twice via `#[path]`).
11+
//!
12+
//! One important purpose of this layer is to provide an "invalidation barrier" for incremental
13+
//! computations: when typing inside an item body, the `ItemTree` of the modified file is typically
14+
//! unaffected, so we don't have to recompute name resolution results or item data (see `data.rs`).
15+
//!
16+
//! The `ItemTree` for the currently open file can be displayed by using the VS Code command
17+
//! "Rust Analyzer: Debug ItemTree".
18+
//!
19+
//! Compared to rustc's architecture, `ItemTree` has properties from both rustc's AST and HIR: many
20+
//! syntax-level Rust features are already desugared to simpler forms in the `ItemTree`, but name
21+
//! resolution has not yet been performed. `ItemTree`s are per-file, while rustc's AST and HIR are
22+
//! per-crate, because we are interested in incrementally computing it.
23+
//!
24+
//! The representation of items in the `ItemTree` should generally mirror the surface syntax: it is
25+
//! usually a bad idea to desugar a syntax-level construct to something that is structurally
26+
//! different here. Name resolution needs to be able to process attributes and expand macros
27+
//! (including attribute macros), and having a 1-to-1 mapping between syntax and the `ItemTree`
28+
//! avoids introducing subtle bugs.
29+
//!
30+
//! In general, any item in the `ItemTree` stores its `AstId`, which allows mapping it back to its
31+
//! surface syntax.
232
333
mod lower;
434
mod pretty;
@@ -500,8 +530,8 @@ pub struct Import {
500530
pub alias: Option<ImportAlias>,
501531
pub visibility: RawVisibilityId,
502532
pub is_glob: bool,
503-
/// AST ID of the `use` or `extern crate` item this import was derived from. Note that many
504-
/// `Import`s can map to the same `use` item.
533+
/// AST ID of the `use` item this import was derived from. Note that many `Import`s can map to
534+
/// the same `use` item.
505535
pub ast_id: FileAstId<ast::Use>,
506536
/// Index of this `Import` when the containing `Use` is visited via `ModPath::expand_use_item`.
507537
///

0 commit comments

Comments
 (0)