Fix renames over language server for SSH remoting (#17897)
Release Notes: - ssh remoting: Fix rename over language server --------- Co-authored-by: Mikayla <mikayla@zed.dev> Co-authored-by: Max <max@zed.dev>
This commit is contained in:
parent
01bb10f518
commit
e66ea9e5d4
34 changed files with 505 additions and 329 deletions
|
@ -315,7 +315,7 @@ async fn test_managing_language_servers(cx: &mut gpui::TestAppContext) {
|
|||
let project = Project::test(fs.clone(), ["/the-root".as_ref()], cx).await;
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
|
||||
let mut fake_rust_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_rust_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
name: "the-rust-language-server",
|
||||
|
@ -335,7 +335,7 @@ async fn test_managing_language_servers(cx: &mut gpui::TestAppContext) {
|
|||
..Default::default()
|
||||
},
|
||||
);
|
||||
let mut fake_json_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_json_servers = language_registry.register_fake_lsp(
|
||||
"JSON",
|
||||
FakeLspAdapter {
|
||||
name: "the-json-language-server",
|
||||
|
@ -716,7 +716,7 @@ async fn test_reporting_fs_changes_to_language_servers(cx: &mut gpui::TestAppCon
|
|||
let project = Project::test(fs.clone(), ["/the-root".as_ref()], cx).await;
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
name: "the-language-server",
|
||||
|
@ -1125,7 +1125,7 @@ async fn test_disk_based_diagnostics_progress(cx: &mut gpui::TestAppContext) {
|
|||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
disk_based_diagnostics_progress_token: Some(progress_token.into()),
|
||||
|
@ -1247,7 +1247,7 @@ async fn test_restarting_server_with_diagnostics_running(cx: &mut gpui::TestAppC
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
name: "the-language-server",
|
||||
|
@ -1324,8 +1324,7 @@ async fn test_restarting_server_with_diagnostics_published(cx: &mut gpui::TestAp
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers =
|
||||
language_registry.register_fake_lsp_adapter("Rust", FakeLspAdapter::default());
|
||||
let mut fake_servers = language_registry.register_fake_lsp("Rust", FakeLspAdapter::default());
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.open_local_buffer("/dir/a.rs", cx))
|
||||
|
@ -1404,8 +1403,7 @@ async fn test_restarted_server_reporting_invalid_buffer_version(cx: &mut gpui::T
|
|||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers =
|
||||
language_registry.register_fake_lsp_adapter("Rust", FakeLspAdapter::default());
|
||||
let mut fake_servers = language_registry.register_fake_lsp("Rust", FakeLspAdapter::default());
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.open_local_buffer("/dir/a.rs", cx))
|
||||
|
@ -1445,7 +1443,7 @@ async fn test_cancel_language_server_work(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
name: "the-language-server",
|
||||
|
@ -1506,14 +1504,14 @@ async fn test_toggling_enable_language_server(cx: &mut gpui::TestAppContext) {
|
|||
let project = Project::test(fs, ["/dir".as_ref()], cx).await;
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
|
||||
let mut fake_rust_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_rust_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
name: "rust-lsp",
|
||||
..Default::default()
|
||||
},
|
||||
);
|
||||
let mut fake_js_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_js_servers = language_registry.register_fake_lsp(
|
||||
"JavaScript",
|
||||
FakeLspAdapter {
|
||||
name: "js-lsp",
|
||||
|
@ -1627,7 +1625,7 @@ async fn test_transforming_diagnostics(cx: &mut gpui::TestAppContext) {
|
|||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
disk_based_diagnostics_sources: vec!["disk".into()],
|
||||
|
@ -2049,8 +2047,7 @@ async fn test_edits_from_lsp2_with_past_version(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers =
|
||||
language_registry.register_fake_lsp_adapter("Rust", FakeLspAdapter::default());
|
||||
let mut fake_servers = language_registry.register_fake_lsp("Rust", FakeLspAdapter::default());
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.open_local_buffer("/dir/a.rs", cx))
|
||||
|
@ -2421,8 +2418,7 @@ async fn test_definition(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers =
|
||||
language_registry.register_fake_lsp_adapter("Rust", FakeLspAdapter::default());
|
||||
let mut fake_servers = language_registry.register_fake_lsp("Rust", FakeLspAdapter::default());
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |project, cx| project.open_local_buffer("/dir/b.rs", cx))
|
||||
|
@ -2515,7 +2511,7 @@ async fn test_completions_without_edit_ranges(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(typescript_lang());
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp(
|
||||
"TypeScript",
|
||||
FakeLspAdapter {
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
|
@ -2607,7 +2603,7 @@ async fn test_completions_with_carriage_returns(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(typescript_lang());
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp(
|
||||
"TypeScript",
|
||||
FakeLspAdapter {
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
|
@ -2668,7 +2664,7 @@ async fn test_apply_code_actions_with_commands(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(typescript_lang());
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp(
|
||||
"TypeScript",
|
||||
FakeLspAdapter {
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
|
@ -3310,7 +3306,10 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
assert!(buffer.is_dirty());
|
||||
assert_eq!(
|
||||
*events.lock(),
|
||||
&[language::Event::Edited, language::Event::DirtyChanged]
|
||||
&[
|
||||
language::BufferEvent::Edited,
|
||||
language::BufferEvent::DirtyChanged
|
||||
]
|
||||
);
|
||||
events.lock().clear();
|
||||
buffer.did_save(buffer.version(), buffer.file().unwrap().mtime(), cx);
|
||||
|
@ -3319,7 +3318,7 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
// after saving, the buffer is not dirty, and emits a saved event.
|
||||
buffer1.update(cx, |buffer, cx| {
|
||||
assert!(!buffer.is_dirty());
|
||||
assert_eq!(*events.lock(), &[language::Event::Saved]);
|
||||
assert_eq!(*events.lock(), &[language::BufferEvent::Saved]);
|
||||
events.lock().clear();
|
||||
|
||||
buffer.edit([(1..1, "B")], None, cx);
|
||||
|
@ -3333,9 +3332,9 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
assert_eq!(
|
||||
*events.lock(),
|
||||
&[
|
||||
language::Event::Edited,
|
||||
language::Event::DirtyChanged,
|
||||
language::Event::Edited,
|
||||
language::BufferEvent::Edited,
|
||||
language::BufferEvent::DirtyChanged,
|
||||
language::BufferEvent::Edited,
|
||||
],
|
||||
);
|
||||
events.lock().clear();
|
||||
|
@ -3349,7 +3348,10 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
assert_eq!(
|
||||
*events.lock(),
|
||||
&[language::Event::Edited, language::Event::DirtyChanged]
|
||||
&[
|
||||
language::BufferEvent::Edited,
|
||||
language::BufferEvent::DirtyChanged
|
||||
]
|
||||
);
|
||||
|
||||
// When a file is deleted, the buffer is considered dirty.
|
||||
|
@ -3374,8 +3376,8 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
assert_eq!(
|
||||
*events.lock(),
|
||||
&[
|
||||
language::Event::DirtyChanged,
|
||||
language::Event::FileHandleChanged
|
||||
language::BufferEvent::DirtyChanged,
|
||||
language::BufferEvent::FileHandleChanged
|
||||
]
|
||||
);
|
||||
|
||||
|
@ -3401,7 +3403,7 @@ async fn test_buffer_is_dirty(cx: &mut gpui::TestAppContext) {
|
|||
.await
|
||||
.unwrap();
|
||||
cx.executor().run_until_parked();
|
||||
assert_eq!(*events.lock(), &[language::Event::FileHandleChanged]);
|
||||
assert_eq!(*events.lock(), &[language::BufferEvent::FileHandleChanged]);
|
||||
cx.update(|cx| assert!(buffer3.read(cx).is_dirty()));
|
||||
}
|
||||
|
||||
|
@ -3809,7 +3811,7 @@ async fn test_rename(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(rust_lang());
|
||||
let mut fake_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_servers = language_registry.register_fake_lsp(
|
||||
"Rust",
|
||||
FakeLspAdapter {
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
|
@ -4696,50 +4698,52 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) {
|
|||
"ESLintServer",
|
||||
"NoHoverCapabilitiesServer",
|
||||
];
|
||||
let mut fake_tsx_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[0],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
let mut language_servers = [
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[0],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _a = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[1],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[1],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _b = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[2],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[2],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: Some(lsp::HoverProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _c = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[3],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: None,
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[3],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
hover_provider: None,
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
),
|
||||
];
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |p, cx| p.open_local_buffer("/dir/a.tsx", cx))
|
||||
|
@ -4749,7 +4753,7 @@ async fn test_multiple_language_server_hovers(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let mut servers_with_hover_requests = HashMap::default();
|
||||
for i in 0..language_server_names.len() {
|
||||
let new_server = fake_tsx_language_servers.next().await.unwrap_or_else(|| {
|
||||
let new_server = language_servers[i].next().await.unwrap_or_else(|| {
|
||||
panic!(
|
||||
"Failed to get language server #{i} with name {}",
|
||||
&language_server_names[i]
|
||||
|
@ -4840,7 +4844,7 @@ async fn test_hovers_with_empty_parts(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let language_registry = project.read_with(cx, |project, _| project.languages().clone());
|
||||
language_registry.add(typescript_lang());
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
let mut fake_language_servers = language_registry.register_fake_lsp(
|
||||
"TypeScript",
|
||||
FakeLspAdapter {
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
|
@ -4916,50 +4920,53 @@ async fn test_multiple_language_server_actions(cx: &mut gpui::TestAppContext) {
|
|||
"ESLintServer",
|
||||
"NoActionsCapabilitiesServer",
|
||||
];
|
||||
let mut fake_tsx_language_servers = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[0],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
|
||||
let mut language_server_rxs = [
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[0],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _a = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[1],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[1],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _b = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[2],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[2],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: Some(lsp::CodeActionProviderCapability::Simple(true)),
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
let _c = language_registry.register_fake_lsp_adapter(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[3],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: None,
|
||||
..lsp::ServerCapabilities::default()
|
||||
),
|
||||
language_registry.register_fake_lsp(
|
||||
"tsx",
|
||||
FakeLspAdapter {
|
||||
name: language_server_names[3],
|
||||
capabilities: lsp::ServerCapabilities {
|
||||
code_action_provider: None,
|
||||
..lsp::ServerCapabilities::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
..FakeLspAdapter::default()
|
||||
},
|
||||
);
|
||||
),
|
||||
];
|
||||
|
||||
let buffer = project
|
||||
.update(cx, |p, cx| p.open_local_buffer("/dir/a.tsx", cx))
|
||||
|
@ -4969,13 +4976,14 @@ async fn test_multiple_language_server_actions(cx: &mut gpui::TestAppContext) {
|
|||
|
||||
let mut servers_with_actions_requests = HashMap::default();
|
||||
for i in 0..language_server_names.len() {
|
||||
let new_server = fake_tsx_language_servers.next().await.unwrap_or_else(|| {
|
||||
let new_server = language_server_rxs[i].next().await.unwrap_or_else(|| {
|
||||
panic!(
|
||||
"Failed to get language server #{i} with name {}",
|
||||
&language_server_names[i]
|
||||
)
|
||||
});
|
||||
let new_server_name = new_server.server.name();
|
||||
|
||||
assert!(
|
||||
!servers_with_actions_requests.contains_key(new_server_name),
|
||||
"Unexpected: initialized server with the same name twice. Name: `{new_server_name}`"
|
||||
|
@ -5023,6 +5031,8 @@ async fn test_multiple_language_server_actions(cx: &mut gpui::TestAppContext) {
|
|||
let code_actions_task = project.update(cx, |project, cx| {
|
||||
project.code_actions(&buffer, 0..buffer.read(cx).len(), cx)
|
||||
});
|
||||
|
||||
// cx.run_until_parked();
|
||||
let _: Vec<()> = futures::future::join_all(servers_with_actions_requests.into_values().map(
|
||||
|mut code_actions_request| async move {
|
||||
code_actions_request
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue