Merge pull request #848 from zed-industries/out-of-sync-diagnostics

Use the entire `ProjectPath` to find open buffer for an LSP diagnostic
This commit is contained in:
Antonio Scandurra 2022-04-19 13:03:19 +02:00 committed by GitHub
commit 1cd23df4d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1961,19 +1961,10 @@ impl Project {
worktree_id: worktree.read(cx).id(),
path: relative_path.into(),
};
for buffer in self.opened_buffers.values() {
if let Some(buffer) = buffer.upgrade(cx) {
if buffer
.read(cx)
.file()
.map_or(false, |file| *file.path() == project_path.path)
{
self.update_buffer_diagnostics(&buffer, diagnostics.clone(), version, cx)?;
break;
}
}
if let Some(buffer) = self.get_open_buffer(&project_path, cx) {
self.update_buffer_diagnostics(&buffer, diagnostics.clone(), version, cx)?;
}
worktree.update(cx, |worktree, cx| {
worktree
.as_local_mut()
@ -5347,6 +5338,122 @@ mod tests {
);
}
#[gpui::test]
async fn test_single_file_worktrees_diagnostics(cx: &mut gpui::TestAppContext) {
cx.foreground().forbid_parking();
let fs = FakeFs::new(cx.background());
fs.insert_tree(
"/dir",
json!({
"a.rs": "let a = 1;",
"b.rs": "let b = 2;"
}),
)
.await;
let project = Project::test(fs, cx);
let worktree_a_id = project
.update(cx, |project, cx| {
project.find_or_create_local_worktree("/dir/a.rs", true, cx)
})
.await
.unwrap()
.0
.read_with(cx, |tree, _| tree.id());
let worktree_b_id = project
.update(cx, |project, cx| {
project.find_or_create_local_worktree("/dir/b.rs", true, cx)
})
.await
.unwrap()
.0
.read_with(cx, |tree, _| tree.id());
let buffer_a = project
.update(cx, |project, cx| {
project.open_buffer((worktree_a_id, ""), cx)
})
.await
.unwrap();
let buffer_b = project
.update(cx, |project, cx| {
project.open_buffer((worktree_b_id, ""), cx)
})
.await
.unwrap();
project.update(cx, |project, cx| {
project
.update_diagnostics(
lsp::PublishDiagnosticsParams {
uri: Url::from_file_path("/dir/a.rs").unwrap(),
version: None,
diagnostics: vec![lsp::Diagnostic {
range: lsp::Range::new(
lsp::Position::new(0, 4),
lsp::Position::new(0, 5),
),
severity: Some(lsp::DiagnosticSeverity::ERROR),
message: "error 1".to_string(),
..Default::default()
}],
},
&[],
cx,
)
.unwrap();
project
.update_diagnostics(
lsp::PublishDiagnosticsParams {
uri: Url::from_file_path("/dir/b.rs").unwrap(),
version: None,
diagnostics: vec![lsp::Diagnostic {
range: lsp::Range::new(
lsp::Position::new(0, 4),
lsp::Position::new(0, 5),
),
severity: Some(lsp::DiagnosticSeverity::WARNING),
message: "error 2".to_string(),
..Default::default()
}],
},
&[],
cx,
)
.unwrap();
});
buffer_a.read_with(cx, |buffer, _| {
let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
assert_eq!(
chunks
.iter()
.map(|(s, d)| (s.as_str(), *d))
.collect::<Vec<_>>(),
&[
("let ", None),
("a", Some(DiagnosticSeverity::ERROR)),
(" = 1;", None),
]
);
});
buffer_b.read_with(cx, |buffer, _| {
let chunks = chunks_with_diagnostics(&buffer, 0..buffer.len());
assert_eq!(
chunks
.iter()
.map(|(s, d)| (s.as_str(), *d))
.collect::<Vec<_>>(),
&[
("let ", None),
("b", Some(DiagnosticSeverity::WARNING)),
(" = 2;", None),
]
);
});
}
#[gpui::test]
async fn test_disk_based_diagnostics_progress(cx: &mut gpui::TestAppContext) {
cx.foreground().forbid_parking();