about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/rust-analyzer/crates/base-db/src/lib.rs22
1 files changed, 10 insertions, 12 deletions
diff --git a/src/tools/rust-analyzer/crates/base-db/src/lib.rs b/src/tools/rust-analyzer/crates/base-db/src/lib.rs
index f7f4e024ef2..a67fbf75c02 100644
--- a/src/tools/rust-analyzer/crates/base-db/src/lib.rs
+++ b/src/tools/rust-analyzer/crates/base-db/src/lib.rs
@@ -387,10 +387,8 @@ fn relevant_crates(db: &dyn RootQueryDb, file_id: FileId) -> Arc<[Crate]> {
 }
 
 #[must_use]
-pub struct DbPanicContext {
-    // prevent arbitrary construction
-    _priv: (),
-}
+#[non_exhaustive]
+pub struct DbPanicContext;
 
 impl Drop for DbPanicContext {
     fn drop(&mut self) {
@@ -404,18 +402,18 @@ impl DbPanicContext {
         fn set_hook() {
             let default_hook = panic::take_hook();
             panic::set_hook(Box::new(move |panic_info| {
+                default_hook(panic_info);
+                if let Some(backtrace) = salsa::Backtrace::capture() {
+                    eprintln!("{backtrace:#}");
+                }
                 DbPanicContext::with_ctx(|ctx| {
                     if !ctx.is_empty() {
-                        eprintln!("Panic context:");
-                        for frame in ctx.iter() {
-                            eprintln!("> {frame}\n");
+                        eprintln!("additional context:");
+                        for (idx, frame) in ctx.iter().enumerate() {
+                            eprintln!("{idx:>4}: {frame}\n");
                         }
                     }
                 });
-                if let Some(backtrace) = salsa::Backtrace::capture() {
-                    eprintln!("{backtrace}");
-                }
-                default_hook(panic_info);
             }));
         }
 
@@ -423,7 +421,7 @@ impl DbPanicContext {
         SET_HOOK.call_once(set_hook);
 
         Self::with_ctx(|ctx| ctx.push(frame));
-        DbPanicContext { _priv: () }
+        DbPanicContext
     }
 
     fn with_ctx(f: impl FnOnce(&mut Vec<String>)) {