Skip to content

Commit d5fdcd0

Browse files
committed
Fix signs tracking.
Close #288.
1 parent 1ad84dd commit d5fdcd0

File tree

2 files changed

+24
-12
lines changed

2 files changed

+24
-12
lines changed

src/languageclient.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -648,13 +648,9 @@ impl ILanguageClient for Arc<Mutex<State>> {
648648
signs.sort_unstable();
649649

650650
let cmd = self.update(|state| {
651-
let cmd: String;
652-
{
653-
let empty = vec![];
654-
let signs_prev = state.signs.get(filename).unwrap_or(&empty);
655-
cmd = get_command_update_signs(signs_prev, &signs, filename);
656-
}
657-
state.signs.insert(filename.to_owned(), signs);
651+
let signs_prev = state.signs.remove(filename).unwrap_or_default();
652+
let (signs_next, cmd) = get_command_update_signs(&signs_prev, &signs, filename);
653+
state.signs.insert(filename.to_string(), signs_next);
658654
Ok(cmd)
659655
})?;
660656
info!("Command to update signs: {}", cmd);
@@ -2385,7 +2381,7 @@ impl ILanguageClient for Arc<Mutex<State>> {
23852381
})?;
23862382

23872383
for (filename, signs) in signsmap {
2388-
let cmd = get_command_update_signs(&signs, &[], &filename);
2384+
let (_, cmd) = get_command_update_signs(&signs, &[], &filename);
23892385
self.command(&cmd)?;
23902386
}
23912387

src/utils.rs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,11 @@ fn test_get_command_delete_sign() {}
287287

288288
use diff;
289289

290-
pub fn get_command_update_signs(signs_prev: &[Sign], signs: &[Sign], filename: &str) -> String {
290+
pub fn get_command_update_signs(signs_prev: &[Sign], signs: &[Sign], filename: &str) -> (Vec<Sign>, String) {
291+
// Sign id might become different due to lines shifting. Use sign's existing sign id to
292+
// track same sign.
293+
let mut signs_next = vec![];
294+
291295
let mut cmd = "echo".to_owned();
292296
for comp in diff::slice(signs_prev, signs) {
293297
match comp {
@@ -296,16 +300,28 @@ pub fn get_command_update_signs(signs_prev: &[Sign], signs: &[Sign], filename: &
296300
}
297301
diff::Result::Right(sign) => {
298302
cmd += &get_command_add_sign(sign, filename);
303+
signs_next.push(sign.clone());
304+
}
305+
diff::Result::Both(sign, _) => {
306+
signs_next.push(sign.clone());
299307
}
300-
diff::Result::Both(_, _) => (),
301308
}
302309
}
303310

304-
cmd
311+
(signs_next, cmd)
305312
}
306313

307314
#[test]
308-
fn test_get_command_update_signs() {}
315+
fn test_get_command_update_signs() {
316+
let signs_prev = vec![Sign::new(1, "abcde".to_string(), DiagnosticSeverity::Error)];
317+
let signs = vec![Sign::new(3, "abcde".to_string(), DiagnosticSeverity::Error)];
318+
let (signs_next, cmd) = get_command_update_signs(&signs_prev, &signs, "f");
319+
assert_eq!(
320+
serde_json::to_string(&signs_next).unwrap(),
321+
"[{\"id\":75000,\"line\":1,\"text\":\"abcde\",\"severity\":1}]"
322+
);
323+
assert_eq!(cmd, "echo");
324+
}
309325

310326
pub trait Merge {
311327
fn merge(&mut self, other: Self) -> ();

0 commit comments

Comments
 (0)