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-interface-getting-diagnostics.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-interface-getting-diagnostics.rs')
| -rw-r--r-- | src/doc/rustc-dev-guide/examples/rustc-interface-getting-diagnostics.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/doc/rustc-dev-guide/examples/rustc-interface-getting-diagnostics.rs b/src/doc/rustc-dev-guide/examples/rustc-interface-getting-diagnostics.rs new file mode 100644 index 00000000000..be37dd867b2 --- /dev/null +++ b/src/doc/rustc-dev-guide/examples/rustc-interface-getting-diagnostics.rs @@ -0,0 +1,98 @@ +#![feature(rustc_private)] + +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_session; +extern crate rustc_span; + +use rustc_errors::emitter::Emitter; +use rustc_errors::registry::{self, Registry}; +use rustc_errors::translation::Translate; +use rustc_errors::{DiagCtxt, DiagInner, FluentBundle}; +use rustc_session::config; +use rustc_span::source_map::SourceMap; + +use std::sync::{Arc, Mutex}; + +struct DebugEmitter { + source_map: Arc<SourceMap>, + diagnostics: Arc<Mutex<Vec<DiagInner>>>, +} + +impl Translate for DebugEmitter { + fn fluent_bundle(&self) -> Option<&FluentBundle> { + None + } + + fn fallback_fluent_bundle(&self) -> &FluentBundle { + panic!("this emitter should not translate message") + } +} + +impl Emitter for DebugEmitter { + fn emit_diagnostic(&mut self, diag: DiagInner, _: &Registry) { + self.diagnostics.lock().unwrap().push(diag); + } + + fn source_map(&self) -> Option<&SourceMap> { + Some(&self.source_map) + } +} + +fn main() { + let buffer: Arc<Mutex<Vec<DiagInner>>> = Arc::default(); + let diagnostics = buffer.clone(); + let config = rustc_interface::Config { + opts: config::Options::default(), + // This program contains a type error. + input: config::Input::Str { + name: rustc_span::FileName::Custom("main.rs".into()), + input: " +fn main() { + let x: &str = 1; +} +" + .into(), + }, + crate_cfg: Vec::new(), + crate_check_cfg: Vec::new(), + output_dir: None, + output_file: None, + file_loader: None, + locale_resources: rustc_driver::DEFAULT_LOCALE_RESOURCES.to_owned(), + lint_caps: rustc_hash::FxHashMap::default(), + psess_created: Some(Box::new(|parse_sess| { + parse_sess.set_dcx(DiagCtxt::new(Box::new(DebugEmitter { + source_map: parse_sess.clone_source_map(), + diagnostics, + }))); + })), + register_lints: None, + override_queries: None, + registry: registry::Registry::new(rustc_errors::codes::DIAGNOSTICS), + make_codegen_backend: None, + expanded_args: Vec::new(), + ice_file: None, + hash_untracked_state: None, + using_internal_features: Arc::default(), + }; + rustc_interface::run_compiler(config, |compiler| { + let krate = rustc_interface::passes::parse(&compiler.sess); + rustc_interface::create_and_enter_global_ctxt(&compiler, krate, |tcx| { + // Run the analysis phase on the local crate to trigger the type error. + let _ = tcx.analysis(()); + }); + // If the compiler has encountered errors when this closure returns, it will abort (!) the program. + // We avoid this by resetting the error count before returning + compiler.sess.dcx().reset_err_count(); + }); + // Read buffered diagnostics. + buffer.lock().unwrap().iter().for_each(|diagnostic| { + println!("{diagnostic:#?}"); + }); +} |
