Revert "Route language server requests through wrapper object"

This reverts commit 9b63d6f832.
This commit is contained in:
Julia 2023-06-22 10:45:08 -04:00
parent 9b63d6f832
commit e1cd6cebb9
3 changed files with 52 additions and 142 deletions

View file

@ -665,11 +665,11 @@ impl LanguageServer {
} }
} }
pub fn name<'a>(&self) -> &str { pub fn name<'a>(self: &'a Arc<Self>) -> &'a str {
&self.name &self.name
} }
pub fn capabilities<'a>(&self) -> &ServerCapabilities { pub fn capabilities<'a>(self: &'a Arc<Self>) -> &'a ServerCapabilities {
&self.capabilities &self.capabilities
} }

View file

@ -1,6 +1,6 @@
use crate::{ use crate::{
DocumentHighlight, Hover, HoverBlock, HoverBlockKind, Location, LocationLink, Project, DocumentHighlight, Hover, HoverBlock, HoverBlockKind, Location, LocationLink, Project,
ProjectLanguageServer, ProjectTransaction, ProjectTransaction,
}; };
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use async_trait::async_trait; use async_trait::async_trait;
@ -14,7 +14,7 @@ use language::{
range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CachedLspAdapter, CharKind, CodeAction, range_from_lsp, range_to_lsp, Anchor, Bias, Buffer, CachedLspAdapter, CharKind, CodeAction,
Completion, OffsetRangeExt, PointUtf16, ToOffset, ToPointUtf16, Transaction, Unclipped, Completion, OffsetRangeExt, PointUtf16, ToOffset, ToPointUtf16, Transaction, Unclipped,
}; };
use lsp::{DocumentHighlightKind, LanguageServerId, ServerCapabilities}; use lsp::{DocumentHighlightKind, LanguageServer, LanguageServerId, ServerCapabilities};
use std::{cmp::Reverse, ops::Range, path::Path, sync::Arc}; use std::{cmp::Reverse, ops::Range, path::Path, sync::Arc};
pub fn lsp_formatting_options(tab_size: u32) -> lsp::FormattingOptions { pub fn lsp_formatting_options(tab_size: u32) -> lsp::FormattingOptions {
@ -40,7 +40,7 @@ pub(crate) trait LspCommand: 'static + Sized {
&self, &self,
path: &Path, path: &Path,
buffer: &Buffer, buffer: &Buffer,
language_server: &Arc<ProjectLanguageServer>, language_server: &Arc<LanguageServer>,
cx: &AppContext, cx: &AppContext,
) -> <Self::LspRequest as lsp::request::Request>::Params; ) -> <Self::LspRequest as lsp::request::Request>::Params;
@ -156,7 +156,7 @@ impl LspCommand for PrepareRename {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::TextDocumentPositionParams { ) -> lsp::TextDocumentPositionParams {
lsp::TextDocumentPositionParams { lsp::TextDocumentPositionParams {
@ -279,7 +279,7 @@ impl LspCommand for PerformRename {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::RenameParams { ) -> lsp::RenameParams {
lsp::RenameParams { lsp::RenameParams {
@ -398,7 +398,7 @@ impl LspCommand for GetDefinition {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::GotoDefinitionParams { ) -> lsp::GotoDefinitionParams {
lsp::GotoDefinitionParams { lsp::GotoDefinitionParams {
@ -499,7 +499,7 @@ impl LspCommand for GetTypeDefinition {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::GotoTypeDefinitionParams { ) -> lsp::GotoTypeDefinitionParams {
lsp::GotoTypeDefinitionParams { lsp::GotoTypeDefinitionParams {
@ -587,7 +587,7 @@ fn language_server_for_buffer(
buffer: &ModelHandle<Buffer>, buffer: &ModelHandle<Buffer>,
server_id: LanguageServerId, server_id: LanguageServerId,
cx: &mut AsyncAppContext, cx: &mut AsyncAppContext,
) -> Result<(Arc<CachedLspAdapter>, Arc<ProjectLanguageServer>)> { ) -> Result<(Arc<CachedLspAdapter>, Arc<LanguageServer>)> {
project project
.read_with(cx, |project, cx| { .read_with(cx, |project, cx| {
project project
@ -784,7 +784,7 @@ impl LspCommand for GetReferences {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::ReferenceParams { ) -> lsp::ReferenceParams {
lsp::ReferenceParams { lsp::ReferenceParams {
@ -949,7 +949,7 @@ impl LspCommand for GetDocumentHighlights {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::DocumentHighlightParams { ) -> lsp::DocumentHighlightParams {
lsp::DocumentHighlightParams { lsp::DocumentHighlightParams {
@ -1096,7 +1096,7 @@ impl LspCommand for GetHover {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::HoverParams { ) -> lsp::HoverParams {
lsp::HoverParams { lsp::HoverParams {
@ -1314,7 +1314,7 @@ impl LspCommand for GetCompletions {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::CompletionParams { ) -> lsp::CompletionParams {
lsp::CompletionParams { lsp::CompletionParams {
@ -1530,7 +1530,7 @@ impl LspCommand for GetCodeActions {
&self, &self,
path: &Path, path: &Path,
buffer: &Buffer, buffer: &Buffer,
language_server: &Arc<ProjectLanguageServer>, language_server: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::CodeActionParams { ) -> lsp::CodeActionParams {
let relevant_diagnostics = buffer let relevant_diagnostics = buffer
@ -1673,7 +1673,7 @@ impl LspCommand for OnTypeFormatting {
&self, &self,
path: &Path, path: &Path,
_: &Buffer, _: &Buffer,
_: &Arc<ProjectLanguageServer>, _: &Arc<LanguageServer>,
_: &AppContext, _: &AppContext,
) -> lsp::DocumentOnTypeFormattingParams { ) -> lsp::DocumentOnTypeFormattingParams {
lsp::DocumentOnTypeFormattingParams { lsp::DocumentOnTypeFormattingParams {

View file

@ -279,79 +279,19 @@ pub enum Event {
CollaboratorLeft(proto::PeerId), CollaboratorLeft(proto::PeerId),
} }
pub struct ProjectLanguageServer {
server: Arc<LanguageServer>,
project: WeakModelHandle<Project>,
}
impl std::ops::Deref for ProjectLanguageServer {
type Target = LanguageServer;
fn deref(&self) -> &Self::Target {
&self.server
}
}
impl ProjectLanguageServer {
pub fn new(server: Arc<LanguageServer>, project: WeakModelHandle<Project>) -> Self {
ProjectLanguageServer { server, project }
}
pub fn request<T: lsp::request::Request + 'static>(
&self,
params: T::Params,
cx: &mut AsyncAppContext,
) -> impl Future<Output = Result<T::Result>>
where
T::Result: 'static + Send,
{
let server = self.server.clone();
let project = self.project.clone();
let future = server.request::<T>(params);
cx.spawn(|mut cx| async move {
let result = future.await;
if result.is_ok() {
return result;
}
let project = match project.upgrade(&cx) {
Some(project) => project,
None => return result,
};
project.update(&mut cx, |_, cx| {
Project::check_errored_language_server(server, cx);
});
result
})
}
pub fn notify<T: lsp::notification::Notification>(&self, params: T::Params) -> Result<()> {
let result = self.server.notify::<T>(params);
if result.is_ok() {
return Ok(());
}
result
}
}
pub enum LanguageServerState { pub enum LanguageServerState {
Validating(Task<Option<Arc<ProjectLanguageServer>>>), Validating(Task<Option<Arc<LanguageServer>>>),
Starting { Starting {
language: Arc<Language>, language: Arc<Language>,
adapter: Arc<CachedLspAdapter>, adapter: Arc<CachedLspAdapter>,
task: Task<Option<Arc<ProjectLanguageServer>>>, task: Task<Option<Arc<LanguageServer>>>,
}, },
Running { Running {
language: Arc<Language>, language: Arc<Language>,
adapter: Arc<CachedLspAdapter>, adapter: Arc<CachedLspAdapter>,
server: Arc<ProjectLanguageServer>, server: Arc<LanguageServer>,
watched_paths: HashMap<WorktreeId, GlobSet>, watched_paths: HashMap<WorktreeId, GlobSet>,
simulate_disk_based_diagnostics_completion: Option<Task<()>>, simulate_disk_based_diagnostics_completion: Option<Task<()>>,
}, },
@ -2297,13 +2237,7 @@ impl Project {
fn language_servers_for_worktree( fn language_servers_for_worktree(
&self, &self,
worktree_id: WorktreeId, worktree_id: WorktreeId,
) -> impl Iterator< ) -> impl Iterator<Item = (&Arc<CachedLspAdapter>, &Arc<Language>, &Arc<LanguageServer>)> {
Item = (
&Arc<CachedLspAdapter>,
&Arc<Language>,
&Arc<ProjectLanguageServer>,
),
> {
self.language_server_ids self.language_server_ids
.iter() .iter()
.filter_map(move |((language_server_worktree_id, _), id)| { .filter_map(move |((language_server_worktree_id, _), id)| {
@ -2543,7 +2477,7 @@ impl Project {
.await; .await;
match result { match result {
Ok(server) => Some(Arc::new(ProjectLanguageServer::new(server, this))), Ok(server) => Some(server),
Err(err) => { Err(err) => {
log::error!("failed to start language server {:?}: {}", server_name, err); log::error!("failed to start language server {:?}: {}", server_name, err);
@ -2869,10 +2803,7 @@ impl Project {
adapter: adapter.clone(), adapter: adapter.clone(),
language: language.clone(), language: language.clone(),
watched_paths: Default::default(), watched_paths: Default::default(),
server: Arc::new(ProjectLanguageServer::new( server: language_server.clone(),
language_server.clone(),
cx.weak_handle(),
)),
simulate_disk_based_diagnostics_completion: None, simulate_disk_based_diagnostics_completion: None,
}, },
); );
@ -3131,6 +3062,7 @@ impl Project {
} }
fn check_errored_language_server( fn check_errored_language_server(
&self,
language_server: Arc<LanguageServer>, language_server: Arc<LanguageServer>,
cx: &mut ModelContext<Self>, cx: &mut ModelContext<Self>,
) { ) {
@ -3965,7 +3897,7 @@ impl Project {
this: &ModelHandle<Self>, this: &ModelHandle<Self>,
buffer: &ModelHandle<Buffer>, buffer: &ModelHandle<Buffer>,
abs_path: &Path, abs_path: &Path,
language_server: &Arc<ProjectLanguageServer>, language_server: &Arc<LanguageServer>,
tab_size: NonZeroU32, tab_size: NonZeroU32,
cx: &mut AsyncAppContext, cx: &mut AsyncAppContext,
) -> Result<Vec<(Range<Anchor>, String)>> { ) -> Result<Vec<(Range<Anchor>, String)>> {
@ -3979,29 +3911,23 @@ impl Project {
let result = if !matches!(formatting_provider, Some(OneOf::Left(false))) { let result = if !matches!(formatting_provider, Some(OneOf::Left(false))) {
language_server language_server
.request::<lsp::request::Formatting>( .request::<lsp::request::Formatting>(lsp::DocumentFormattingParams {
lsp::DocumentFormattingParams {
text_document, text_document,
options: lsp_command::lsp_formatting_options(tab_size.get()), options: lsp_command::lsp_formatting_options(tab_size.get()),
work_done_progress_params: Default::default(), work_done_progress_params: Default::default(),
}, })
cx,
)
.await .await
} else if !matches!(range_formatting_provider, Some(OneOf::Left(false))) { } else if !matches!(range_formatting_provider, Some(OneOf::Left(false))) {
let buffer_start = lsp::Position::new(0, 0); let buffer_start = lsp::Position::new(0, 0);
let buffer_end = buffer.read_with(cx, |b, _| point_to_lsp(b.max_point_utf16())); let buffer_end = buffer.read_with(cx, |b, _| point_to_lsp(b.max_point_utf16()));
language_server language_server
.request::<lsp::request::RangeFormatting>( .request::<lsp::request::RangeFormatting>(lsp::DocumentRangeFormattingParams {
lsp::DocumentRangeFormattingParams {
text_document, text_document,
range: lsp::Range::new(buffer_start, buffer_end), range: lsp::Range::new(buffer_start, buffer_end),
options: lsp_command::lsp_formatting_options(tab_size.get()), options: lsp_command::lsp_formatting_options(tab_size.get()),
work_done_progress_params: Default::default(), work_done_progress_params: Default::default(),
}, })
cx,
)
.await .await
} else { } else {
Ok(None) Ok(None)
@ -4017,8 +3943,8 @@ impl Project {
err err
); );
this.update(cx, |_, cx| { this.update(cx, |this, cx| {
Self::check_errored_language_server(language_server.server.clone(), cx); this.check_errored_language_server(language_server.clone(), cx);
}); });
None None
@ -4164,7 +4090,6 @@ impl Project {
query: query.to_string(), query: query.to_string(),
..Default::default() ..Default::default()
}, },
&mut cx.to_async(),
) )
.map_ok(move |response| { .map_ok(move |response| {
let lsp_symbols = response.map(|symbol_response| match symbol_response { let lsp_symbols = response.map(|symbol_response| match symbol_response {
@ -4398,10 +4323,7 @@ impl Project {
cx.spawn(|this, mut cx| async move { cx.spawn(|this, mut cx| async move {
let resolved_completion = match lang_server let resolved_completion = match lang_server
.request::<lsp::request::ResolveCompletionItem>( .request::<lsp::request::ResolveCompletionItem>(completion.lsp_completion)
completion.lsp_completion,
&mut cx,
)
.await .await
{ {
Ok(resolved_completion) => resolved_completion, Ok(resolved_completion) => resolved_completion,
@ -4530,10 +4452,7 @@ impl Project {
{ {
*lsp_range = serde_json::to_value(&range_to_lsp(range)).unwrap(); *lsp_range = serde_json::to_value(&range_to_lsp(range)).unwrap();
action.lsp_action = match lang_server action.lsp_action = match lang_server
.request::<lsp::request::CodeActionResolveRequest>( .request::<lsp::request::CodeActionResolveRequest>(action.lsp_action)
action.lsp_action,
&mut cx,
)
.await .await
{ {
Ok(lsp_action) => lsp_action, Ok(lsp_action) => lsp_action,
@ -4577,14 +4496,11 @@ impl Project {
}); });
let result = lang_server let result = lang_server
.request::<lsp::request::ExecuteCommand>( .request::<lsp::request::ExecuteCommand>(lsp::ExecuteCommandParams {
lsp::ExecuteCommandParams {
command: command.command, command: command.command,
arguments: command.arguments.unwrap_or_default(), arguments: command.arguments.unwrap_or_default(),
..Default::default() ..Default::default()
}, })
&mut cx,
)
.await; .await;
if let Err(err) = result { if let Err(err) = result {
@ -4691,7 +4607,7 @@ impl Project {
edits: Vec<lsp::TextEdit>, edits: Vec<lsp::TextEdit>,
push_to_history: bool, push_to_history: bool,
_: Arc<CachedLspAdapter>, _: Arc<CachedLspAdapter>,
language_server: Arc<ProjectLanguageServer>, language_server: Arc<LanguageServer>,
cx: &mut AsyncAppContext, cx: &mut AsyncAppContext,
) -> Result<Option<Transaction>> { ) -> Result<Option<Transaction>> {
let edits = this let edits = this
@ -4732,7 +4648,7 @@ impl Project {
edit: lsp::WorkspaceEdit, edit: lsp::WorkspaceEdit,
push_to_history: bool, push_to_history: bool,
lsp_adapter: Arc<CachedLspAdapter>, lsp_adapter: Arc<CachedLspAdapter>,
language_server: Arc<ProjectLanguageServer>, language_server: Arc<LanguageServer>,
cx: &mut AsyncAppContext, cx: &mut AsyncAppContext,
) -> Result<ProjectTransaction> { ) -> Result<ProjectTransaction> {
let fs = this.read_with(cx, |this, _| this.fs.clone()); let fs = this.read_with(cx, |this, _| this.fs.clone());
@ -5154,15 +5070,12 @@ impl Project {
.map(|(_, server)| server.clone()), .map(|(_, server)| server.clone()),
) { ) {
let lsp_params = request.to_lsp(&file.abs_path(cx), buffer, &language_server, cx); let lsp_params = request.to_lsp(&file.abs_path(cx), buffer, &language_server, cx);
return cx.spawn(|this, mut cx| async move { return cx.spawn(|this, cx| async move {
if !request.check_capabilities(language_server.capabilities()) { if !request.check_capabilities(language_server.capabilities()) {
return Ok(Default::default()); return Ok(Default::default());
} }
let result = language_server let result = language_server.request::<R::LspRequest>(lsp_params).await;
.request::<R::LspRequest>(lsp_params, &mut cx)
.await;
let response = match result { let response = match result {
Ok(response) => response, Ok(response) => response,
@ -7364,10 +7277,7 @@ impl Project {
}) })
} }
pub fn language_server_for_id( pub fn language_server_for_id(&self, id: LanguageServerId) -> Option<Arc<LanguageServer>> {
&self,
id: LanguageServerId,
) -> Option<Arc<ProjectLanguageServer>> {
if let LanguageServerState::Running { server, .. } = self.language_servers.get(&id)? { if let LanguageServerState::Running { server, .. } = self.language_servers.get(&id)? {
Some(server.clone()) Some(server.clone())
} else { } else {
@ -7379,7 +7289,7 @@ impl Project {
&self, &self,
buffer: &Buffer, buffer: &Buffer,
cx: &AppContext, cx: &AppContext,
) -> impl Iterator<Item = (&Arc<CachedLspAdapter>, &Arc<ProjectLanguageServer>)> { ) -> impl Iterator<Item = (&Arc<CachedLspAdapter>, &Arc<LanguageServer>)> {
self.language_server_ids_for_buffer(buffer, cx) self.language_server_ids_for_buffer(buffer, cx)
.into_iter() .into_iter()
.filter_map(|server_id| { .filter_map(|server_id| {
@ -7399,7 +7309,7 @@ impl Project {
&self, &self,
buffer: &Buffer, buffer: &Buffer,
cx: &AppContext, cx: &AppContext,
) -> Option<(&Arc<CachedLspAdapter>, &Arc<ProjectLanguageServer>)> { ) -> Option<(&Arc<CachedLspAdapter>, &Arc<LanguageServer>)> {
self.language_servers_for_buffer(buffer, cx).next() self.language_servers_for_buffer(buffer, cx).next()
} }
@ -7408,7 +7318,7 @@ impl Project {
buffer: &Buffer, buffer: &Buffer,
server_id: LanguageServerId, server_id: LanguageServerId,
cx: &AppContext, cx: &AppContext,
) -> Option<(&Arc<CachedLspAdapter>, &Arc<ProjectLanguageServer>)> { ) -> Option<(&Arc<CachedLspAdapter>, &Arc<LanguageServer>)> {
self.language_servers_for_buffer(buffer, cx) self.language_servers_for_buffer(buffer, cx)
.find(|(_, s)| s.server_id() == server_id) .find(|(_, s)| s.server_id() == server_id)
} }