Skip to content

Commit 93f58dd

Browse files
stevearcautozimu
authored andcommitted
Fix a race condition when setting diagnostic signs
1 parent f3d6320 commit 93f58dd

File tree

1 file changed

+26
-28
lines changed

1 file changed

+26
-28
lines changed

src/language_server_protocol.rs

+26-28
Original file line numberDiff line numberDiff line change
@@ -2547,49 +2547,47 @@ impl LanguageClient {
25472547
.map(|(line, severity)| Sign::new(line, format!("LanguageClient{:?}", severity)))
25482548
.collect())
25492549
})?;
2550-
let signs_prev: Vec<_> = self.update(|state| {
2551-
Ok(state
2550+
self.update(|state| {
2551+
let signs_prev: Vec<_> = state
25522552
.signs
25532553
.entry(filename.clone())
25542554
.or_default()
25552555
.iter()
25562556
.map(|(_, sign)| sign.clone())
2557-
.collect())
2558-
})?;
2559-
let mut signs_to_add = vec![];
2560-
let mut signs_to_delete = vec![];
2561-
let diffs = diff::slice(&signs_next, &signs_prev);
2562-
for diff in diffs {
2563-
match diff {
2564-
diff::Result::Left(s) => {
2565-
signs_to_add.push(s.clone());
2566-
}
2567-
diff::Result::Right(s) => {
2568-
signs_to_delete.push(s.clone());
2557+
.collect();
2558+
let mut signs_to_add = vec![];
2559+
let mut signs_to_delete = vec![];
2560+
let diffs = diff::slice(&signs_next, &signs_prev);
2561+
for diff in diffs {
2562+
match diff {
2563+
diff::Result::Left(s) => {
2564+
signs_to_add.push(s.clone());
2565+
}
2566+
diff::Result::Right(s) => {
2567+
signs_to_delete.push(s.clone());
2568+
}
2569+
_ => {}
25692570
}
2570-
_ => {}
25712571
}
2572-
}
2573-
for sign in &mut signs_to_add {
2574-
if sign.id == 0 {
2575-
sign.id = self.update(|state| {
2572+
for sign in &mut signs_to_add {
2573+
if sign.id == 0 {
25762574
state.sign_next_id += 1;
2577-
Ok(state.sign_next_id)
2578-
})?;
2575+
sign.id = state.sign_next_id;
2576+
}
25792577
}
2580-
}
2581-
self.vim()?
2582-
.set_signs(&filename, &signs_to_add, &signs_to_delete)?;
2583-
self.update(|state| {
2578+
25842579
let signs = state.signs.entry(filename.clone()).or_default();
25852580
// signs might be deleted AND added in the same line to change severity,
25862581
// so deletions must be before additions
2587-
for sign in signs_to_delete {
2582+
for sign in &signs_to_delete {
25882583
signs.remove(&sign.line);
25892584
}
2590-
for sign in signs_to_add {
2591-
signs.insert(sign.line, sign);
2585+
for sign in &signs_to_add {
2586+
signs.insert(sign.line, sign.clone());
25922587
}
2588+
state
2589+
.vim
2590+
.set_signs(&filename, &signs_to_add, &signs_to_delete)?;
25932591
Ok(())
25942592
})?;
25952593

0 commit comments

Comments
 (0)