fix: retain semantic colors across editable diff updates

This commit is contained in:
Valdemar Lorenzen
2026-10-15 15:48:34 +02:00
parent a3be494d57
commit 1df9e66cd5
7 changed files with 322 additions and 48 deletions
+44
View File
@@ -2357,6 +2357,50 @@ fn lsp_semantics_coalesce_changed_text_and_refresh_without_decoding_stale_payloa
&& frame.get("result").is_some()));
}
#[test]
fn lsp_semantic_colors_survive_edits_and_polling_until_a_current_reply() {
let fixture = Fixture::new();
let mut session = fixture.open("controlled-semantic");
until(&mut session, &fixture, |_| {
fixture.method_count("textDocument/semanticTokens/full") == 1
});
semantic_reply(
&mut session,
&fixture,
1,
json!({"result": {"data": [0, 0, 1, 4, 0]}}),
);
let original = session.editor().semantic_tokens().to_vec();
assert_eq!(original[0].kind, SemanticTokenKind::Type);
session.handle(Input::Char('A'));
session.handle(Input::Char('!'));
until(&mut session, &fixture, |_| {
fixture.method_count("textDocument/semanticTokens/full") == 2
});
assert_eq!(session.editor().semantic_tokens(), original);
session.handle(Input::Char('?'));
semantic_reply(
&mut session,
&fixture,
2,
json!({"result": {"data": ["stale malformed data"]}}),
);
until(&mut session, &fixture, |_| {
fixture.method_count("textDocument/semanticTokens/full") == 3
});
assert_eq!(session.editor().semantic_tokens(), original);
semantic_reply(
&mut session,
&fixture,
3,
json!({"result": {"data": [0, 1, 2, 2, 0]}}),
);
let tokens = session.editor().semantic_tokens();
assert_eq!(tokens[0].kind, SemanticTokenKind::Function);
assert_eq!(tokens[0].start, TextPosition { row: 0, column: 1 });
assert_eq!(tokens[0].end, TextPosition { row: 0, column: 2 });
}
#[test]
fn lsp_semantics_discard_queued_same_revision_rename_and_close_outputs() {
let fixture = Fixture::new();