diff options
-rw-r--r-- | cli/lsp/language_server.rs | 30 | ||||
-rw-r--r-- | cli/lsp/text.rs | 12 |
2 files changed, 26 insertions, 16 deletions
diff --git a/cli/lsp/language_server.rs b/cli/lsp/language_server.rs index dc36c0540..08ebfccee 100644 --- a/cli/lsp/language_server.rs +++ b/cli/lsp/language_server.rs @@ -1651,11 +1651,11 @@ impl Inner { } // spawn a blocking task to allow doing other work while this is occurring - let format_result = deno_core::unsync::spawn_blocking({ + let text_edits = deno_core::unsync::spawn_blocking({ let fmt_options = self.fmt_options.options.clone(); let document = document.clone(); move || { - match document.maybe_parsed_source() { + let format_result = match document.maybe_parsed_source() { Some(Ok(parsed_source)) => { format_parsed_source(&parsed_source, &fmt_options) } @@ -1672,26 +1672,24 @@ impl Inner { // it's not a js/ts file, so attempt to format its contents format_file(&file_path, &document.content(), &fmt_options) } + }; + match format_result { + Ok(Some(new_text)) => Some(text::get_edits( + &document.content(), + &new_text, + document.line_index().as_ref(), + )), + Ok(None) => Some(Vec::new()), + Err(err) => { + lsp_warn!("Format error: {:#}", err); + None + } } } }) .await .unwrap(); - let text_edits = match format_result { - Ok(Some(new_text)) => Some(text::get_edits( - &document.content(), - &new_text, - document.line_index().as_ref(), - )), - Ok(None) => Some(Vec::new()), - Err(err) => { - // TODO(lucacasonato): handle error properly - lsp_warn!("Format error: {:#}", err); - None - } - }; - self.performance.measure(mark); if let Some(text_edits) = text_edits { if text_edits.is_empty() { diff --git a/cli/lsp/text.rs b/cli/lsp/text.rs index 26df170ce..8013edd52 100644 --- a/cli/lsp/text.rs +++ b/cli/lsp/text.rs @@ -210,6 +210,18 @@ pub fn get_edits(a: &str, b: &str, line_index: &LineIndex) -> Vec<TextEdit> { if a == b { return vec![]; } + // Heuristic to detect things like minified files. `diff()` is expensive. + if b.chars().filter(|c| *c == '\n').count() + > line_index.utf8_offsets.len() * 3 + { + return vec![TextEdit { + range: lsp::Range { + start: lsp::Position::new(0, 0), + end: line_index.position_utf16(TextSize::from(a.len() as u32)), + }, + new_text: b.to_string(), + }]; + } let chunks = diff(a, b); let mut text_edits = Vec::<TextEdit>::new(); let mut iter = chunks.iter().peekable(); |