Automatically subscribe for lsp logs of every server added
Avoid re-adding the server on new logs events.
This commit is contained in:
parent
adf313bd33
commit
91fac2aa76
2 changed files with 31 additions and 21 deletions
|
@ -38,7 +38,8 @@ struct ProjectState {
|
||||||
struct LanguageServerState {
|
struct LanguageServerState {
|
||||||
log_buffer: ModelHandle<Buffer>,
|
log_buffer: ModelHandle<Buffer>,
|
||||||
rpc_state: Option<LanguageServerRpcState>,
|
rpc_state: Option<LanguageServerRpcState>,
|
||||||
_subscription: Option<lsp::Subscription>,
|
_io_logs_subscription: Option<lsp::Subscription>,
|
||||||
|
_lsp_logs_subscription: Option<lsp::Subscription>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LanguageServerRpcState {
|
struct LanguageServerRpcState {
|
||||||
|
@ -134,8 +135,6 @@ impl LogStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_project(&mut self, project: &ModelHandle<Project>, cx: &mut ModelContext<Self>) {
|
pub fn add_project(&mut self, project: &ModelHandle<Project>, cx: &mut ModelContext<Self>) {
|
||||||
use project::Event::*;
|
|
||||||
|
|
||||||
let weak_project = project.downgrade();
|
let weak_project = project.downgrade();
|
||||||
self.projects.insert(
|
self.projects.insert(
|
||||||
weak_project,
|
weak_project,
|
||||||
|
@ -146,13 +145,13 @@ impl LogStore {
|
||||||
this.projects.remove(&weak_project);
|
this.projects.remove(&weak_project);
|
||||||
}),
|
}),
|
||||||
cx.subscribe(project, |this, project, event, cx| match event {
|
cx.subscribe(project, |this, project, event, cx| match event {
|
||||||
LanguageServerAdded(id) => {
|
project::Event::LanguageServerAdded(id) => {
|
||||||
this.add_language_server(&project, *id, cx);
|
this.add_language_server(&project, *id, cx);
|
||||||
}
|
}
|
||||||
LanguageServerRemoved(id) => {
|
project::Event::LanguageServerRemoved(id) => {
|
||||||
this.remove_language_server(&project, *id, cx);
|
this.remove_language_server(&project, *id, cx);
|
||||||
}
|
}
|
||||||
LanguageServerLog(id, message) => {
|
project::Event::LanguageServerLog(id, message) => {
|
||||||
this.add_language_server_log(&project, *id, message, cx);
|
this.add_language_server_log(&project, *id, message, cx);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -176,20 +175,34 @@ impl LogStore {
|
||||||
log_buffer: cx
|
log_buffer: cx
|
||||||
.add_model(|cx| Buffer::new(0, cx.model_id() as u64, ""))
|
.add_model(|cx| Buffer::new(0, cx.model_id() as u64, ""))
|
||||||
.clone(),
|
.clone(),
|
||||||
_subscription: None,
|
_io_logs_subscription: None,
|
||||||
|
_lsp_logs_subscription: None,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let server = project.read(cx).language_server_for_id(id);
|
let server = project.read(cx).language_server_for_id(id);
|
||||||
let weak_project = project.downgrade();
|
let weak_project = project.downgrade();
|
||||||
let io_tx = self.io_tx.clone();
|
let io_tx = self.io_tx.clone();
|
||||||
server_state._subscription = server.map(|server| {
|
server_state._io_logs_subscription = server.as_ref().map(|server| {
|
||||||
server.on_io(move |io_kind, message| {
|
server.on_io(move |io_kind, message| {
|
||||||
io_tx
|
io_tx
|
||||||
.unbounded_send((weak_project, id, io_kind, message.to_string()))
|
.unbounded_send((weak_project, id, io_kind, message.to_string()))
|
||||||
.ok();
|
.ok();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
let weak_project = project.downgrade();
|
||||||
|
server_state._lsp_logs_subscription = server.map(|server| {
|
||||||
|
let server_id = server.server_id();
|
||||||
|
server.on_notification::<lsp::notification::LogMessage, _>({
|
||||||
|
move |params, mut cx| {
|
||||||
|
if let Some(project) = weak_project.upgrade(&cx) {
|
||||||
|
project.update(&mut cx, |_, cx| {
|
||||||
|
cx.emit(project::Event::LanguageServerLog(server_id, params.message))
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
Some(server_state.log_buffer.clone())
|
Some(server_state.log_buffer.clone())
|
||||||
}
|
}
|
||||||
|
@ -201,7 +214,16 @@ impl LogStore {
|
||||||
message: &str,
|
message: &str,
|
||||||
cx: &mut ModelContext<Self>,
|
cx: &mut ModelContext<Self>,
|
||||||
) -> Option<()> {
|
) -> Option<()> {
|
||||||
let buffer = self.add_language_server(&project, id, cx)?;
|
let buffer = match self
|
||||||
|
.projects
|
||||||
|
.get_mut(&project.downgrade())?
|
||||||
|
.servers
|
||||||
|
.get(&id)
|
||||||
|
.map(|state| state.log_buffer.clone())
|
||||||
|
{
|
||||||
|
Some(existing_buffer) => existing_buffer,
|
||||||
|
None => self.add_language_server(&project, id, cx)?,
|
||||||
|
};
|
||||||
buffer.update(cx, |buffer, cx| {
|
buffer.update(cx, |buffer, cx| {
|
||||||
let len = buffer.len();
|
let len = buffer.len();
|
||||||
let has_newline = message.ends_with("\n");
|
let has_newline = message.ends_with("\n");
|
||||||
|
|
|
@ -2789,18 +2789,6 @@ impl Project {
|
||||||
None => return Ok(None),
|
None => return Ok(None),
|
||||||
};
|
};
|
||||||
|
|
||||||
language_server
|
|
||||||
.on_notification::<lsp::notification::LogMessage, _>({
|
|
||||||
move |params, mut cx| {
|
|
||||||
if let Some(this) = this.upgrade(&cx) {
|
|
||||||
this.update(&mut cx, |_, cx| {
|
|
||||||
cx.emit(Event::LanguageServerLog(server_id, params.message))
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.detach();
|
|
||||||
|
|
||||||
language_server
|
language_server
|
||||||
.on_notification::<lsp::notification::PublishDiagnostics, _>({
|
.on_notification::<lsp::notification::PublishDiagnostics, _>({
|
||||||
let adapter = adapter.clone();
|
let adapter = adapter.clone();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue