Properly sanitize out inlay hints from remote hosts (#42878)

Part of https://github.com/zed-industries/zed/issues/42671

Release Notes:

- Fixed remote hosts causing duplicate hints to be displayed
This commit is contained in:
Kirill Bulatov
2025-11-17 15:53:18 +02:00
committed by GitHub
parent f1bebd79d1
commit e0b64773d9
2 changed files with 33 additions and 10 deletions
+22 -10
View File
@@ -2169,16 +2169,28 @@ async fn test_inlay_hint_refresh_is_forwarded(
} else {
"initial hint"
};
Ok(Some(vec![lsp::InlayHint {
position: lsp::Position::new(0, character),
label: lsp::InlayHintLabel::String(label.to_string()),
kind: None,
text_edits: None,
tooltip: None,
padding_left: None,
padding_right: None,
data: None,
}]))
Ok(Some(vec![
lsp::InlayHint {
position: lsp::Position::new(0, character),
label: lsp::InlayHintLabel::String(label.to_string()),
kind: None,
text_edits: None,
tooltip: None,
padding_left: None,
padding_right: None,
data: None,
},
lsp::InlayHint {
position: lsp::Position::new(1090, 1090),
label: lsp::InlayHintLabel::String("out-of-bounds hint".to_string()),
kind: None,
text_edits: None,
tooltip: None,
padding_left: None,
padding_right: None,
data: None,
},
]))
}
})
.next()
+11
View File
@@ -6881,6 +6881,7 @@ impl LspStore {
}))
.await;
let buffer_snapshot = buffer.read_with(cx, |buffer, _| buffer.snapshot())?;
let mut has_errors = false;
let inlay_hints = inlay_hints
.into_iter()
@@ -6892,6 +6893,16 @@ impl LspStore {
None
}
})
.map(|(server_id, mut new_hints)| {
new_hints.retain(|hint| {
hint.position.is_valid(&buffer_snapshot)
&& range.start.is_valid(&buffer_snapshot)
&& range.end.is_valid(&buffer_snapshot)
&& hint.position.cmp(&range.start, &buffer_snapshot).is_ge()
&& hint.position.cmp(&range.end, &buffer_snapshot).is_lt()
});
(server_id, new_hints)
})
.collect::<HashMap<_, _>>();
anyhow::ensure!(
!has_errors || !inlay_hints.is_empty(),