Skip to content

Commit e7086a3

Browse files
committed
Slightly quieter fatal panics
1 parent c4809d0 commit e7086a3

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

src/tools/rust-analyzer/crates/rust-analyzer/src/main_loop.rs

+18-12
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,10 @@ impl GlobalState {
179179
}
180180
}
181181

182-
while let Some(event) = self.next_event(&inbox) {
182+
while let Ok(event) = self.next_event(&inbox) {
183+
let Some(event) = event else {
184+
anyhow::bail!("client exited without proper shutdown sequence");
185+
};
183186
if matches!(
184187
&event,
185188
Event::Lsp(lsp_server::Message::Notification(Notification { method, .. }))
@@ -190,7 +193,7 @@ impl GlobalState {
190193
self.handle_event(event)?;
191194
}
192195

193-
anyhow::bail!("client exited without proper shutdown sequence")
196+
Err(anyhow::anyhow!("A receiver has been dropped, something panicked!"))
194197
}
195198

196199
fn register_did_save_capability(&mut self, additional_patterns: impl Iterator<Item = String>) {
@@ -237,37 +240,40 @@ impl GlobalState {
237240
);
238241
}
239242

240-
fn next_event(&self, inbox: &Receiver<lsp_server::Message>) -> Option<Event> {
243+
fn next_event(
244+
&self,
245+
inbox: &Receiver<lsp_server::Message>,
246+
) -> Result<Option<Event>, crossbeam_channel::RecvError> {
241247
select! {
242248
recv(inbox) -> msg =>
243-
msg.ok().map(Event::Lsp),
249+
return Ok(msg.ok().map(Event::Lsp)),
244250

245251
recv(self.task_pool.receiver) -> task =>
246-
Some(Event::Task(task.unwrap())),
252+
task.map(Event::Task),
247253

248254
recv(self.deferred_task_queue.receiver) -> task =>
249-
Some(Event::QueuedTask(task.unwrap())),
255+
task.map(Event::QueuedTask),
250256

251257
recv(self.fmt_pool.receiver) -> task =>
252-
Some(Event::Task(task.unwrap())),
258+
task.map(Event::Task),
253259

254260
recv(self.loader.receiver) -> task =>
255-
Some(Event::Vfs(task.unwrap())),
261+
task.map(Event::Vfs),
256262

257263
recv(self.flycheck_receiver) -> task =>
258-
Some(Event::Flycheck(task.unwrap())),
264+
task.map(Event::Flycheck),
259265

260266
recv(self.test_run_receiver) -> task =>
261-
Some(Event::TestResult(task.unwrap())),
267+
task.map(Event::TestResult),
262268

263269
recv(self.discover_receiver) -> task =>
264-
Some(Event::DiscoverProject(task.unwrap())),
270+
task.map(Event::DiscoverProject),
265271
}
272+
.map(Some)
266273
}
267274

268275
fn handle_event(&mut self, event: Event) -> anyhow::Result<()> {
269276
let loop_start = Instant::now();
270-
// NOTE: don't count blocking select! call as a loop-turn time
271277
let _p = tracing::info_span!("GlobalState::handle_event", event = %event).entered();
272278

273279
let event_dbg_msg = format!("{event:?}");

src/tools/rust-analyzer/crates/vfs-notify/src/lib.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ impl NotifyActor {
103103
let (watcher_sender, watcher_receiver) = unbounded();
104104
let watcher = log_notify_error(RecommendedWatcher::new(
105105
move |event| {
106-
watcher_sender.send(event).unwrap();
106+
// we don't care about the error. If sending fails that usually
107+
// means we were dropped, so unwrapping will just add to the
108+
// panic noise.
109+
_ = watcher_sender.send(event);
107110
},
108111
Config::default(),
109112
));

0 commit comments

Comments
 (0)