diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2022-05-15 14:41:37 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-15 14:41:37 -0400 |
commit | eb5ffab1cbc010424aa1764005f71dcd67525dc1 (patch) | |
tree | 31f66727bb590a99f4e67a11e4874f72f9d3567e /cli/lsp/text.rs | |
parent | 8744ee883e093ecc09add4054177f8afa793ec77 (diff) |
fix(lsp): correct positions in some scenarios (#14359)
Diffstat (limited to 'cli/lsp/text.rs')
-rw-r--r-- | cli/lsp/text.rs | 261 |
1 files changed, 0 insertions, 261 deletions
diff --git a/cli/lsp/text.rs b/cli/lsp/text.rs index 64721ebc7..33ac2048f 100644 --- a/cli/lsp/text.rs +++ b/cli/lsp/text.rs @@ -2,13 +2,9 @@ use deno_core::error::custom_error; use deno_core::error::AnyError; -use deno_core::serde_json::json; -use deno_core::serde_json::Value; use dissimilar::diff; use dissimilar::Chunk; use std::collections::HashMap; -use std::ops::Bound; -use std::ops::RangeBounds; use text_size::TextRange; use text_size::TextSize; use tower_lsp::jsonrpc; @@ -261,112 +257,6 @@ pub fn get_edits(a: &str, b: &str, line_index: &LineIndex) -> Vec<TextEdit> { text_edits } -/// Convert a difference between two strings into a change range used by the -/// TypeScript Language Service. -pub fn get_range_change(a: &str, b: &str) -> Value { - if a == b { - return json!(null); - } - let chunks = diff(a, b); - let mut iter = chunks.iter().peekable(); - let mut started = false; - let mut start = 0; - let mut end = 0; - let mut new_length = 0; - let mut equal = 0; - let mut a_pos = 0; - loop { - let diff = iter.next(); - match diff { - None => break, - Some(Chunk::Equal(e)) => { - a_pos += e.encode_utf16().count(); - equal += e.encode_utf16().count(); - } - Some(Chunk::Delete(d)) => { - if !started { - start = a_pos; - started = true; - equal = 0; - } - a_pos += d.encode_utf16().count(); - if started { - end = a_pos; - new_length += equal; - equal = 0; - } - } - Some(Chunk::Insert(i)) => { - if !started { - start = a_pos; - end = a_pos; - started = true; - equal = 0; - } else { - end += equal; - } - new_length += i.encode_utf16().count() + equal; - equal = 0; - } - } - } - - json!({ - "span": { - "start": start, - "length": end - start, - }, - "newLength": new_length, - }) -} - -/// Provide a slice of a string based on a character range. -pub fn slice(s: &str, range: impl RangeBounds<usize>) -> &str { - let start = match range.start_bound() { - Bound::Included(bound) | Bound::Excluded(bound) => *bound, - Bound::Unbounded => 0, - }; - let len = match range.end_bound() { - Bound::Included(bound) => *bound + 1, - Bound::Excluded(bound) => *bound, - Bound::Unbounded => s.encode_utf16().count(), - } - start; - substring(s, start, start + len) -} - -/// Provide a substring based on the start and end character index positions. -pub fn substring(s: &str, start: usize, end: usize) -> &str { - let len = end - start; - let mut char_pos = 0; - let mut byte_start = 0; - let mut it = s.chars(); - loop { - if char_pos == start { - break; - } - if let Some(c) = it.next() { - char_pos += c.len_utf16(); - byte_start += c.len_utf8(); - } else { - break; - } - } - char_pos = 0; - let mut byte_end = byte_start; - loop { - if char_pos == len { - break; - } - if let Some(c) = it.next() { - char_pos += c.len_utf16(); - byte_end += c.len_utf8(); - } else { - break; - } - } - &s[byte_start..byte_end] -} - #[cfg(test)] mod tests { use super::*; @@ -637,155 +527,4 @@ const C: char = \"γ‘ γ‘\"; ] ) } - - #[test] - fn test_get_range_change() { - let a = "abcdefg"; - let b = "abcdefg"; - let actual = get_range_change(a, b); - assert_eq!(actual, json!(null)); - - let a = "abcdefg"; - let b = "abedcfg"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 2, - "length": 3, - }, - "newLength": 3 - }) - ); - - let a = "abfg"; - let b = "abcdefg"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 2, - "length": 0, - }, - "newLength": 3 - }) - ); - - let a = "abcdefg"; - let b = "abfg"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 2, - "length": 3, - }, - "newLength": 0 - }) - ); - - let a = "abcdefg"; - let b = "abfghij"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 2, - "length": 5, - }, - "newLength": 5 - }) - ); - - let a = "abcdefghijk"; - let b = "axcxexfxixk"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 1, - "length": 9, - }, - "newLength": 9 - }) - ); - - let a = "abcde"; - let b = "ab(c)de"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span" : { - "start": 2, - "length": 1, - }, - "newLength": 3 - }) - ); - - let a = "hello π¦!"; - let b = "hello deno!"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 6, - "length": 2, - }, - "newLength": 4 - }) - ); - - let a = "hello deno!"; - let b = "hello denoπ¦!"; - let actual = get_range_change(a, b); - assert_eq!( - actual, - json!({ - "span": { - "start": 10, - "length": 0, - }, - "newLength": 2 - }) - ); - - // TODO(@kitsonk): https://github.com/dtolnay/dissimilar/issues/5 - // let a = r#" π¦πΊπΈπ "#; - // let b = r#" πΊπΈπ "#; - // let actual = get_range_change(a, b); - // assert_eq!( - // actual, - // json!({ - // "span": { - // "start": 1, - // "length": 2, - // }, - // "newLength": 0 - // }) - // ); - } - - #[test] - fn test_substring() { - assert_eq!(substring("Deno", 1, 3), "en"); - assert_eq!(substring("yΜyΜ", 2, 4), "yΜ"); - assert_eq!(substring("π¦π¦", 2, 4), "π¦"); - } - - #[test] - fn test_slice() { - assert_eq!(slice("Deno", 1..3), "en"); - assert_eq!(slice("Deno", 1..=3), "eno"); - assert_eq!(slice("Deno Land", 1..), "eno Land"); - assert_eq!(slice("Deno", ..3), "Den"); - assert_eq!(slice("Hello π¦", 6..8), "π¦"); - } } |