Merge pull request #2256 from torfsen/fix-examples-for-nightly-2025-02-13

This commit is contained in:
许杰友 Jieyou Xu (Joe) 2025-02-20 02:36:21 +08:00 committed by GitHub
commit 0af2f51b5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 37 additions and 14 deletions

View File

@ -4,7 +4,10 @@ For each example to compile, you will need to first run the following:
To create an executable: To create an executable:
rustc rustc-driver-example.rs rustup run nightly rustc rustc-driver-example.rs
You might need to be more specific about the exact nightly version. See the comments at the top of
the examples for the version they were written for.
To run an executable: To run an executable:

View File

@ -1,3 +1,5 @@
// Tested with nightly-2025-02-13
#![feature(rustc_private)] #![feature(rustc_private)]
extern crate rustc_ast; extern crate rustc_ast;
@ -73,7 +75,7 @@ impl rustc_driver::Callbacks for MyCallbacks {
let hir = tcx.hir(); let hir = tcx.hir();
let item = hir.item(id); let item = hir.item(id);
match item.kind { match item.kind {
rustc_hir::ItemKind::Static(_, _, _) | rustc_hir::ItemKind::Fn(_, _, _) => { rustc_hir::ItemKind::Static(_, _, _) | rustc_hir::ItemKind::Fn { .. } => {
let name = item.ident; let name = item.ident;
let ty = tcx.type_of(item.hir_id().owner.def_id); let ty = tcx.type_of(item.hir_id().owner.def_id);
println!("{name:?}:\t{ty:?}") println!("{name:?}:\t{ty:?}")
@ -87,5 +89,13 @@ impl rustc_driver::Callbacks for MyCallbacks {
} }
fn main() { fn main() {
run_compiler(&["main.rs".to_string()], &mut MyCallbacks); run_compiler(
&[
// The first argument, which in practice contains the name of the binary being executed
// (i.e. "rustc") is ignored by rustc.
"ignored".to_string(),
"main.rs".to_string(),
],
&mut MyCallbacks,
);
} }

View File

@ -1,3 +1,5 @@
// Tested with nightly-2025-02-13
#![feature(rustc_private)] #![feature(rustc_private)]
extern crate rustc_ast; extern crate rustc_ast;
@ -74,8 +76,8 @@ impl rustc_driver::Callbacks for MyCallbacks {
for id in hir_krate.items() { for id in hir_krate.items() {
let item = hir_krate.item(id); let item = hir_krate.item(id);
// Use pattern-matching to find a specific node inside the main function. // Use pattern-matching to find a specific node inside the main function.
if let rustc_hir::ItemKind::Fn(_, _, body_id) = item.kind { if let rustc_hir::ItemKind::Fn { body, .. } = item.kind {
let expr = &tcx.hir().body(body_id).value; let expr = &tcx.hir().body(body).value;
if let rustc_hir::ExprKind::Block(block, _) = expr.kind { if let rustc_hir::ExprKind::Block(block, _) = expr.kind {
if let rustc_hir::StmtKind::Let(let_stmt) = block.stmts[0].kind { if let rustc_hir::StmtKind::Let(let_stmt) = block.stmts[0].kind {
if let Some(expr) = let_stmt.init { if let Some(expr) = let_stmt.init {
@ -94,5 +96,13 @@ impl rustc_driver::Callbacks for MyCallbacks {
} }
fn main() { fn main() {
run_compiler(&["main.rs".to_string()], &mut MyCallbacks); run_compiler(
&[
// The first argument, which in practice contains the name of the binary being executed
// (i.e. "rustc") is ignored by rustc.
"ignored".to_string(),
"main.rs".to_string(),
],
&mut MyCallbacks,
);
} }

View File

@ -1,3 +1,5 @@
// Tested with nightly-2025-02-13
#![feature(rustc_private)] #![feature(rustc_private)]
extern crate rustc_driver; extern crate rustc_driver;
@ -9,8 +11,6 @@ extern crate rustc_interface;
extern crate rustc_session; extern crate rustc_session;
extern crate rustc_span; extern crate rustc_span;
use std::sync::Arc;
use rustc_errors::registry; use rustc_errors::registry;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use rustc_session::config; use rustc_session::config;
@ -56,7 +56,7 @@ fn main() {
expanded_args: Vec::new(), expanded_args: Vec::new(),
ice_file: None, ice_file: None,
hash_untracked_state: None, hash_untracked_state: None,
using_internal_features: Arc::default(), using_internal_features: &rustc_driver::USING_INTERNAL_FEATURES,
}; };
rustc_interface::run_compiler(config, |compiler| { rustc_interface::run_compiler(config, |compiler| {
// Parse the program and print the syntax tree. // Parse the program and print the syntax tree.
@ -68,7 +68,7 @@ fn main() {
let hir = tcx.hir(); let hir = tcx.hir();
let item = hir.item(id); let item = hir.item(id);
match item.kind { match item.kind {
rustc_hir::ItemKind::Static(_, _, _) | rustc_hir::ItemKind::Fn(_, _, _) => { rustc_hir::ItemKind::Static(_, _, _) | rustc_hir::ItemKind::Fn { .. } => {
let name = item.ident; let name = item.ident;
let ty = tcx.type_of(item.hir_id().owner.def_id); let ty = tcx.type_of(item.hir_id().owner.def_id);
println!("{name:?}:\t{ty:?}") println!("{name:?}:\t{ty:?}")

View File

@ -1,3 +1,5 @@
// Tested with nightly-2025-02-13
#![feature(rustc_private)] #![feature(rustc_private)]
extern crate rustc_data_structures; extern crate rustc_data_structures;
@ -15,7 +17,7 @@ use std::sync::{Arc, Mutex};
use rustc_errors::emitter::Emitter; use rustc_errors::emitter::Emitter;
use rustc_errors::registry::{self, Registry}; use rustc_errors::registry::{self, Registry};
use rustc_errors::translation::Translate; use rustc_errors::translation::Translate;
use rustc_errors::{DiagCtxt, DiagInner, FluentBundle}; use rustc_errors::{DiagInner, FluentBundle};
use rustc_session::config; use rustc_session::config;
use rustc_span::source_map::SourceMap; use rustc_span::source_map::SourceMap;
@ -79,7 +81,7 @@ fn main() {
expanded_args: Vec::new(), expanded_args: Vec::new(),
ice_file: None, ice_file: None,
hash_untracked_state: None, hash_untracked_state: None,
using_internal_features: Arc::default(), using_internal_features: &rustc_driver::USING_INTERNAL_FEATURES,
}; };
rustc_interface::run_compiler(config, |compiler| { rustc_interface::run_compiler(config, |compiler| {
let krate = rustc_interface::passes::parse(&compiler.sess); let krate = rustc_interface::passes::parse(&compiler.sess);

View File

@ -8,7 +8,6 @@ otherwise be printed to stderr.
To get diagnostics from the compiler, To get diagnostics from the compiler,
configure [`rustc_interface::Config`] to output diagnostic to a buffer, configure [`rustc_interface::Config`] to output diagnostic to a buffer,
and run [`TyCtxt.analysis`]. and run [`TyCtxt.analysis`].
The following was tested with <!-- date-check: september 2024 --> `nightly-2024-09-16`:
```rust ```rust
{{#include ../../examples/rustc-interface-getting-diagnostics.rs}} {{#include ../../examples/rustc-interface-getting-diagnostics.rs}}

View File

@ -5,7 +5,6 @@
## Getting the type of an expression ## Getting the type of an expression
To get the type of an expression, use the [`after_analysis`] callback to get a [`TyCtxt`]. To get the type of an expression, use the [`after_analysis`] callback to get a [`TyCtxt`].
The following was tested with <!-- date-check: december 2024 --> `nightly-2024-12-15`:
```rust ```rust
{{#include ../../examples/rustc-driver-interacting-with-the-ast.rs}} {{#include ../../examples/rustc-driver-interacting-with-the-ast.rs}}