Merge pull request #2256 from torfsen/fix-examples-for-nightly-2025-02-13
This commit is contained in:
commit
0af2f51b5d
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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:?}")
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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}}
|
||||||
|
|
|
||||||
|
|
@ -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}}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue