Make Document's format API a little nicer.
This commit is contained in:
parent
ffa2f2590b
commit
2902a10a3e
2 changed files with 21 additions and 14 deletions
|
@ -1160,20 +1160,12 @@ mod cmd {
|
||||||
if doc.path().is_none() {
|
if doc.path().is_none() {
|
||||||
return Err(anyhow!("cannot write a buffer without a filename"));
|
return Err(anyhow!("cannot write a buffer without a filename"));
|
||||||
}
|
}
|
||||||
let autofmt = doc
|
let fmt = doc.auto_format().map(|fmt| {
|
||||||
.language_config()
|
|
||||||
.map(|config| config.auto_format)
|
|
||||||
.unwrap_or_default();
|
|
||||||
let fmt = if autofmt {
|
|
||||||
doc.format().map(|fmt| {
|
|
||||||
let shared = fmt.shared();
|
let shared = fmt.shared();
|
||||||
let callback = make_format_callback(doc.id(), doc.version(), true, shared.clone());
|
let callback = make_format_callback(doc.id(), doc.version(), true, shared.clone());
|
||||||
jobs.callback(callback);
|
jobs.callback(callback);
|
||||||
shared
|
shared
|
||||||
})
|
});
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
Ok(tokio::spawn(doc.format_and_save(fmt)))
|
Ok(tokio::spawn(doc.format_and_save(fmt)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1917,6 +1909,9 @@ fn append_to_line(cx: &mut Context) {
|
||||||
|
|
||||||
// Creates an LspCallback that waits for formatting changes to be computed. When they're done,
|
// Creates an LspCallback that waits for formatting changes to be computed. When they're done,
|
||||||
// it applies them, but only if the doc hasn't changed.
|
// it applies them, but only if the doc hasn't changed.
|
||||||
|
//
|
||||||
|
// TODO: provide some way to cancel this, probably as part of a more general job cancellation
|
||||||
|
// scheme
|
||||||
async fn make_format_callback(
|
async fn make_format_callback(
|
||||||
doc_id: DocumentId,
|
doc_id: DocumentId,
|
||||||
doc_version: i32,
|
doc_version: i32,
|
||||||
|
|
|
@ -473,6 +473,18 @@ impl Document {
|
||||||
Ok(doc)
|
Ok(doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The same as [`format`], but only returns formatting changes if auto-formatting
|
||||||
|
/// is configured.
|
||||||
|
pub fn auto_format(&self) -> Option<impl Future<Output = LspFormatting> + 'static> {
|
||||||
|
if self.language_config().map(|c| c.auto_format) == Some(true) {
|
||||||
|
self.format()
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If supported, returns the changes that should be applied to this document in order
|
||||||
|
/// to format it nicely.
|
||||||
pub fn format(&self) -> Option<impl Future<Output = LspFormatting> + 'static> {
|
pub fn format(&self) -> Option<impl Future<Output = LspFormatting> + 'static> {
|
||||||
if let Some(language_server) = self.language_server.clone() {
|
if let Some(language_server) = self.language_server.clone() {
|
||||||
let text = self.text.clone();
|
let text = self.text.clone();
|
||||||
|
|
Loading…
Add table
Reference in a new issue