1
Fork 0

Rollup merge of #124091 - jieyouxu:ast-validation-top-level-docs, r=wesleywiser

Update AST validation module docs

Drive-by doc update for AST validation pass:

- Syntax extensions are replaced by proc macros.
- Add rationale for why AST validation pass need to be run
  post-expansion and why the pass is needed in the first place.

This was discussed during this week's [rustc-dev-guide reading club](https://rust-lang.zulipchat.com/#narrow/stream/196385-t-compiler.2Fwg-rustc-dev-guide), and the rationale was explained by cc ``````@bjorn3.``````
This commit is contained in:
Matthias Krüger 2024-06-28 22:04:15 +02:00 committed by GitHub
commit 26df3146ab
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,10 +1,20 @@
// Validate AST before lowering it to HIR. //! Validate AST before lowering it to HIR.
// //!
// This pass is supposed to catch things that fit into AST data structures, //! This pass intends to check that the constructed AST is *syntactically valid* to allow the rest
// but not permitted by the language. It runs after expansion when AST is frozen, //! of the compiler to assume that the AST is valid. These checks cannot be performed during parsing
// so it can check for erroneous constructions produced by syntax extensions. //! because attribute macros are allowed to accept certain pieces of invalid syntax such as a
// This pass is supposed to perform only simple checks not requiring name resolution //! function without body outside of a trait definition:
// or type checking or some other kind of complex analysis. //!
//! ```ignore (illustrative)
//! #[my_attribute]
//! mod foo {
//! fn missing_body();
//! }
//! ```
//!
//! These checks are run post-expansion, after AST is frozen, to be able to check for erroneous
//! constructions produced by proc macros. This pass is only intended for simple checks that do not
//! require name resolution or type checking, or other kinds of complex analysis.
use itertools::{Either, Itertools}; use itertools::{Either, Itertools};
use rustc_ast::ptr::P; use rustc_ast::ptr::P;