1use lsp_types::Position;
2
3pub fn byte_pos_to_line_col(source: &str, byte_pos: usize) -> Position {
4 let mut line = 0;
5 let mut col: u32 = 0;
6
7 for (idx, c) in source.chars().enumerate() {
8 if idx >= byte_pos {
9 break;
10 }
11 if c == '\n' {
12 line += 1;
13 col = 0;
14 } else {
15 col += 1;
16 }
17 }
18
19 Position {
20 line,
21 character: col.saturating_sub(1),
22 }
23}
24
25pub fn get_text_byte_offset(source: &str, line: usize, character: usize) -> Option<usize> {
26 let mut character = character;
27 let mut line = line;
28 let mut byte_offset = 0;
29
30 for l in source.lines() {
31 if line == 0 {
32 byte_offset += character;
33 character = character.saturating_sub(l.len());
34 break;
35 } else {
36 line -= 1;
37 byte_offset += l.len() + 1;
38 }
39 }
40
41 if line != 0 || character != 0 {
42 return None;
43 }
44
45 Some(byte_offset)
46}