Invoke remote Prettier commands
This commit is contained in:
parent
faf1d38a6d
commit
2ec2036c2f
3 changed files with 172 additions and 135 deletions
|
@ -9,6 +9,7 @@ use fs::Fs;
|
||||||
use gpui::{AsyncAppContext, ModelHandle};
|
use gpui::{AsyncAppContext, ModelHandle};
|
||||||
use language::language_settings::language_settings;
|
use language::language_settings::language_settings;
|
||||||
use language::{Buffer, BundledFormatter, Diff};
|
use language::{Buffer, BundledFormatter, Diff};
|
||||||
|
use lsp::request::Request;
|
||||||
use lsp::{LanguageServer, LanguageServerBinary, LanguageServerId};
|
use lsp::{LanguageServer, LanguageServerBinary, LanguageServerId};
|
||||||
use node_runtime::NodeRuntime;
|
use node_runtime::NodeRuntime;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -216,12 +217,35 @@ impl Prettier {
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn invoke(
|
||||||
|
&self,
|
||||||
|
buffer: &ModelHandle<Buffer>,
|
||||||
|
buffer_path: Option<PathBuf>,
|
||||||
|
method: &str,
|
||||||
|
cx: &AsyncAppContext,
|
||||||
|
) -> anyhow::Result<Option<Diff>> {
|
||||||
|
match method {
|
||||||
|
Format::METHOD => self
|
||||||
|
.format(buffer, buffer_path, cx)
|
||||||
|
.await
|
||||||
|
.context("invoke method")
|
||||||
|
.map(Some),
|
||||||
|
ClearCache::METHOD => {
|
||||||
|
self.clear_cache().await.context("invoke method")?;
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
unknown => anyhow::bail!("Unknown method {unknown}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn format(
|
pub async fn format(
|
||||||
&self,
|
&self,
|
||||||
buffer: &ModelHandle<Buffer>,
|
buffer: &ModelHandle<Buffer>,
|
||||||
buffer_path: Option<PathBuf>,
|
buffer_path: Option<PathBuf>,
|
||||||
cx: &AsyncAppContext,
|
cx: &AsyncAppContext,
|
||||||
) -> anyhow::Result<Diff> {
|
) -> anyhow::Result<Diff> {
|
||||||
|
match self {
|
||||||
|
Self::Local(local) => {
|
||||||
let params = buffer.read_with(cx, |buffer, cx| {
|
let params = buffer.read_with(cx, |buffer, cx| {
|
||||||
let buffer_language = buffer.language();
|
let buffer_language = buffer.language();
|
||||||
let parsers_with_plugins = buffer_language
|
let parsers_with_plugins = buffer_language
|
||||||
|
@ -342,22 +366,27 @@ impl Prettier {
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}).context("prettier params calculation")?;
|
}).context("prettier params calculation")?;
|
||||||
let response = self
|
let response = local
|
||||||
.server()
|
.server
|
||||||
.expect("TODO kb split into local and remote")
|
|
||||||
.request::<Format>(params)
|
.request::<Format>(params)
|
||||||
.await
|
.await
|
||||||
.context("prettier format request")?;
|
.context("prettier format request")?;
|
||||||
let diff_task = buffer.read_with(cx, |buffer, cx| buffer.diff(response.text, cx));
|
let diff_task = buffer.read_with(cx, |buffer, cx| buffer.diff(response.text, cx));
|
||||||
Ok(diff_task.await)
|
Ok(diff_task.await)
|
||||||
}
|
}
|
||||||
|
Self::Remote(remote) => todo!("TODO kb"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn clear_cache(&self) -> anyhow::Result<()> {
|
pub async fn clear_cache(&self) -> anyhow::Result<()> {
|
||||||
self.server()
|
match self {
|
||||||
.expect("TODO kb split into local and remote")
|
Self::Local(local) => local
|
||||||
|
.server
|
||||||
.request::<ClearCache>(())
|
.request::<ClearCache>(())
|
||||||
.await
|
.await
|
||||||
.context("prettier clear cache")
|
.context("prettier clear cache"),
|
||||||
|
Self::Remote(remote) => todo!("TODO kb"),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn server(&self) -> Option<&Arc<LanguageServer>> {
|
pub fn server(&self) -> Option<&Arc<LanguageServer>> {
|
||||||
|
|
|
@ -8353,10 +8353,13 @@ impl Project {
|
||||||
});
|
});
|
||||||
|
|
||||||
let diff = prettier
|
let diff = prettier
|
||||||
.format(&buffer, buffer_path, &cx)
|
.invoke(&buffer, buffer_path, &envelope.payload.method, &cx)
|
||||||
.await
|
.await
|
||||||
.context("handle buffer formatting")?;
|
.with_context(|| format!("prettier invoke method {}", &envelope.payload.method))?;
|
||||||
todo!("TODO kb serialize diff")
|
|
||||||
|
Ok(proto::InvokePrettierForBufferResponse {
|
||||||
|
diff: todo!("TODO kb serialize diff"),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn prettier_instance_for_buffer(
|
fn prettier_instance_for_buffer(
|
||||||
|
|
|
@ -1578,9 +1578,14 @@ message InvokePrettierForBuffer {
|
||||||
uint64 buffer_id = 3;
|
uint64 buffer_id = 3;
|
||||||
optional uint64 worktree_id = 4;
|
optional uint64 worktree_id = 4;
|
||||||
string method = 5;
|
string method = 5;
|
||||||
optional string command_parameters = 6;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message InvokePrettierForBufferResponse {
|
message InvokePrettierForBufferResponse {
|
||||||
optional string diff = 1;
|
optional Diff diff = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Diff {
|
||||||
|
VectorClockEntry version = 1;
|
||||||
|
string line_ending = 2;
|
||||||
|
string edits = 3;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue