formatting before save adds timeout

This commit is contained in:
Dongdong Zhou 2021-02-19 11:12:05 +00:00
parent a4ef03fead
commit 5636d16f76
4 changed files with 49 additions and 53 deletions

1
Cargo.lock generated
View File

@ -1603,6 +1603,7 @@ dependencies = [
"anyhow",
"bit-vec",
"cc",
"crossbeam-channel 0.5.0",
"druid",
"fzyr",
"git2",

View File

@ -5,9 +5,9 @@ authors = ["Dongdong Zhou <dzhou121@gmail.com>"]
edition = "2018"
[dependencies]
crossbeam-channel = "0.5.0"
regex = "1.4.2"
usvg = "0.12.0"
lapce-proxy = { path = "../proxy" }
git2 = "0.13"
jsonrpc-lite = "0.5.0"
bit-vec = "0.5.0"
@ -30,6 +30,7 @@ fzyr = "0.1.2"
uuid = { version = "0.7.4", features = ["v4"] }
lsp-types = { version = "0.82.0", features = ["proposed"] }
druid = { version = "0.7.0", features = ["svg"] }
lapce-proxy = { path = "../proxy" }
[build-dependencies]
cc = "*"

View File

@ -32,6 +32,7 @@
};
use anyhow::{anyhow, Result};
use bit_vec::BitVec;
use crossbeam_channel::{self, bounded};
use druid::{
kurbo::Line, piet::PietText, theme, widget::IdentityWrapper, widget::Padding,
widget::SvgData, Affine, BoxConstraints, Color, Command, Data, Env, Event,
@ -51,11 +52,10 @@
Location, Position, SignatureHelp, TextEdit, Url, WorkspaceEdit,
};
use serde_json::Value;
use std::str::FromStr;
use std::sync::mpsc::channel;
use std::thread;
use std::{cmp::Ordering, iter::Iterator, path::PathBuf};
use std::{collections::HashMap, sync::Arc};
use std::{str::FromStr, time::Duration};
use xi_core_lib::selection::InsertDrift;
use xi_rope::{Interval, RopeDelta};
@ -1814,18 +1814,24 @@ pub fn apply_edits_and_save(
rev: u64,
result: &Result<Value>,
) -> Option<()> {
let mut rev = rev;
if let Ok(res) = result {
let edits: Result<Vec<TextEdit>, serde_json::Error> =
serde_json::from_value(res.clone());
if let Ok(edits) = edits {
if edits.len() > 0 {
self.apply_edits(ctx, ui_state, rev, &edits);
if let Some(r) = self.apply_edits(ctx, ui_state, rev, &edits) {
rev = r;
}
}
}
}
let editor = self.editors.get_mut(&self.active)?;
let buffer_id = editor.buffer_id.clone()?;
let buffer = self.buffers.get_mut(&buffer_id)?;
if buffer.rev != rev {
return None;
}
let state = LAPCE_APP_STATE.get_tab_state(&self.window_id, &self.tab_id);
let window_id = self.window_id;
let tab_id = self.tab_id;
@ -1839,6 +1845,9 @@ pub fn apply_edits_and_save(
let state = LAPCE_APP_STATE.get_tab_state(&window_id, &tab_id);
let mut editor_split = state.editor_split.lock();
let buffer = editor_split.buffers.get_mut(&buffer_id).unwrap();
if buffer.rev != rev {
return;
}
buffer.dirty = false;
for (view_id, editor) in editor_split.editors.iter() {
if editor.buffer_id.as_ref() == Some(&buffer_id) {
@ -1860,7 +1869,7 @@ pub fn apply_edits(
ui_state: &mut LapceUIState,
rev: u64,
edits: &Vec<TextEdit>,
) -> Option<()> {
) -> Option<u64> {
let editor = self.editors.get_mut(&self.active)?;
let buffer_id = editor.buffer_id.clone()?;
let buffer = self.buffers.get_mut(&buffer_id)?;
@ -1885,8 +1894,9 @@ pub fn apply_edits(
edits.iter().map(|(s, c)| (s, c.as_ref())).collect(),
true,
);
let new_rev = buffer.rev;
self.notify_fill_text_layouts(ctx, &buffer_id);
None
Some(new_rev)
}
pub fn get_code_actions(&self) -> Option<()> {
@ -2796,52 +2806,32 @@ pub fn run_command(
let offset = editor.selection.get_cursor_offset();
let state =
LAPCE_APP_STATE.get_tab_state(&self.window_id, &self.tab_id);
state
.clone()
.proxy
.lock()
.as_ref()
.unwrap()
.get_document_formatting(
buffer.id,
Box::new(move |result| {
println!("get document formating");
let result = match result {
Ok(r) => Ok(r),
Err(e) => Err(anyhow!("{:?}", e)),
};
LAPCE_APP_STATE.submit_ui_command(
LapceUICommand::ApplyEditsAndSave(
offset, rev, result,
),
state.editor_split.lock().widget_id,
);
}),
let (sender, receiver) = bounded(1);
let local_state = state.clone();
let buffer_id = buffer.id;
thread::spawn(move || {
local_state
.clone()
.proxy
.lock()
.as_ref()
.unwrap()
.get_document_formatting(
buffer_id,
Box::new(move |result| {
sender.send(result);
}),
);
let result =
receiver.recv_timeout(Duration::from_secs(1)).map_or_else(
|e| Err(anyhow!("{}", e)),
|v| v.map_err(|e| anyhow!("{:?}", e)),
);
LAPCE_APP_STATE.submit_ui_command(
LapceUICommand::ApplyEditsAndSave(offset, rev, result),
local_state.editor_split.lock().widget_id,
);
// if let Some(edits) = {
// let state =
// LAPCE_APP_STATE.get_tab_state(&self.window_id, &self.tab_id);
// let lsp = state.lsp.lock();
// let edits = lsp.get_document_formatting(buffer);
// edits
// } {
// if edits.len() > 0 {
// self.apply_edits(ctx, ui_state, rev, &edits);
// }
// }
// let buffer_ui_state = ui_state.get_buffer_mut(&buffer_id);
// let buffer = self.buffers.get_mut(&buffer_id)?;
// if let Err(e) = buffer.save() {
// println!("buffer save error {}", e);
// }
// buffer_ui_state.dirty = buffer.dirty;
// LAPCE_APP_STATE
// .get_tab_state(&self.window_id, &self.tab_id)
// .lsp
// .lock()
// .save_buffer(buffer);
});
}
_ => {
let editor = self.editors.get_mut(&self.active)?;

View File

@ -389,7 +389,9 @@ fn event(
}
for child in self.children.as_mut_slice() {
if child.widget.is_active() {
child.widget.event(ctx, event, data, env);
if child.widget.is_initialized() {
child.widget.event(ctx, event, data, env);
}
if ctx.is_handled() {
return;
}
@ -435,7 +437,9 @@ fn event(
for child in self.children.as_mut_slice() {
if !child.widget.is_active() {
child.widget.event(ctx, event, data, env);
if child.widget.is_initialized() {
child.widget.event(ctx, event, data, env);
}
}
}
}