diff options
| author | bors <bors@rust-lang.org> | 2025-01-02 03:05:42 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-01-02 03:05:42 +0000 |
| commit | c528b8c67895bfe7fdcdfeb56ec5bf6ef928dcd7 (patch) | |
| tree | c2c885f853241ea38d8a5c46b79ffd79433ef810 /src/doc/rustc-dev-guide/examples/rustc-driver-example.rs | |
| parent | 504f4f5275d0dc9532fc97fcc25350b83dde9dde (diff) | |
| parent | 47e2baa1c91e955ad31ace4a4a0c116295394034 (diff) | |
| download | rust-c528b8c67895bfe7fdcdfeb56ec5bf6ef928dcd7.tar.gz rust-c528b8c67895bfe7fdcdfeb56ec5bf6ef928dcd7.zip | |
Auto merge of #134907 - Kobzol:rustc-dev-guide-josh, r=ehuss
Turn rustc-dev-guide into a Josh subtree
Discussed on [Zulip](https://rust-lang.zulipchat.com/#narrow/channel/196385-t-compiler.2Fwg-rustc-dev-guide/topic/a.20move.20to.20main.20repo.20.28rust-lang.2Frust.29).
Accompanying rustc-dev-guide PR: https://github.com/rust-lang/rustc-dev-guide/pull/2183
I didn't create a bootstrap step for rustc-dev-guide yet, because the rustc-dev-guide version that we currently use in this repo doesn't have linkcheck enabled and that fails tests.
The subtree starts with commit [ad93c5f1c49f2aeb45f7a4954017b1e607df9f5e](https://github.com/rust-lang/rustc-dev-guide/commit/ad93c5f1c49f2aeb45f7a4954017b1e607df9f5e).
What I did:
```
export DIR=src/doc/rustc-dev-guide
# Remove submodule
git submodule status ${DIR}
git submodule deinit ${DIR}
git rm -r --cached ${DIR}
rm -rf ${DIR}
# Remove rustc-dev-guide from .gitmodules
git commit -m"Removed `${DIR}` submodule"
# Import history with josh
git fetch https://github.com/rust-lang/rustc-dev-guide ad93c5f1c49f2aeb45f7a4954017b1e607df9f5e
josh-filter ':prefix=src/doc/rustc-dev-guide' FETCH_HEAD
git merge --allow-unrelated FILTERED_HEAD
# A few follow-up cleanup commits
```
r? ehuss
Diffstat (limited to 'src/doc/rustc-dev-guide/examples/rustc-driver-example.rs')
| -rw-r--r-- | src/doc/rustc-dev-guide/examples/rustc-driver-example.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs b/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs new file mode 100644 index 00000000000..576bbcea965 --- /dev/null +++ b/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs @@ -0,0 +1,92 @@ +#![feature(rustc_private)] + +extern crate rustc_ast; +extern crate rustc_ast_pretty; +extern crate rustc_data_structures; +extern crate rustc_driver; +extern crate rustc_error_codes; +extern crate rustc_errors; +extern crate rustc_hash; +extern crate rustc_hir; +extern crate rustc_interface; +extern crate rustc_middle; +extern crate rustc_session; +extern crate rustc_span; + +use std::io; +use std::path::Path; + +use rustc_ast_pretty::pprust::item_to_string; +use rustc_data_structures::sync::Lrc; +use rustc_driver::{Compilation, RunCompiler}; +use rustc_interface::interface::Compiler; +use rustc_middle::ty::TyCtxt; + +struct MyFileLoader; + +impl rustc_span::source_map::FileLoader for MyFileLoader { + fn file_exists(&self, path: &Path) -> bool { + path == Path::new("main.rs") + } + + fn read_file(&self, path: &Path) -> io::Result<String> { + if path == Path::new("main.rs") { + Ok(r#" +fn main() { + let message = "Hello, World!"; + println!("{message}"); +} +"# + .to_string()) + } else { + Err(io::Error::other("oops")) + } + } + + fn read_binary_file(&self, _path: &Path) -> io::Result<Lrc<[u8]>> { + Err(io::Error::other("oops")) + } +} + +struct MyCallbacks; + +impl rustc_driver::Callbacks for MyCallbacks { + fn after_crate_root_parsing( + &mut self, + _compiler: &Compiler, + krate: &rustc_ast::Crate, + ) -> Compilation { + for item in &krate.items { + println!("{}", item_to_string(&item)); + } + + Compilation::Continue + } + + fn after_analysis(&mut self, _compiler: &Compiler, tcx: TyCtxt<'_>) -> Compilation { + // Analyze the program and inspect the types of definitions. + for id in tcx.hir().items() { + let hir = tcx.hir(); + let item = hir.item(id); + match item.kind { + rustc_hir::ItemKind::Static(_, _, _) | rustc_hir::ItemKind::Fn(_, _, _) => { + let name = item.ident; + let ty = tcx.type_of(item.hir_id().owner.def_id); + println!("{name:?}:\t{ty:?}") + } + _ => (), + } + } + + Compilation::Stop + } +} + +fn main() { + match RunCompiler::new(&["main.rs".to_string()], &mut MyCallbacks) { + mut compiler => { + compiler.set_file_loader(Some(Box::new(MyFileLoader))); + compiler.run(); + } + } +} |
