use crate::line_index::{LineCol, LineIndex};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct LspPosition {
pub line: usize,
pub character: usize,
}
impl LspPosition {
pub fn new(line: usize, character: usize) -> Self {
Self { line, character }
}
}
pub struct CoordinateMapper<'a> {
index: &'a LineIndex,
}
impl<'a> CoordinateMapper<'a> {
pub fn new(index: &'a LineIndex) -> Self {
Self { index }
}
pub fn byte_to_line_col(&self, byte_offset: usize) -> Option<LineCol> {
self.index.byte_to_line_col(byte_offset)
}
pub fn line_col_to_byte(&self, lc: LineCol) -> Option<usize> {
self.index.line_col_to_byte(lc)
}
pub fn byte_to_lsp(&self, byte_offset: usize) -> Option<LspPosition> {
let (line, character) = self.index.byte_to_utf16_col(byte_offset)?;
Some(LspPosition { line, character })
}
pub fn lsp_to_byte(&self, pos: LspPosition) -> Option<usize> {
self.index.utf16_col_to_byte(pos.line, pos.character)
}
pub fn line_col_to_lsp(&self, lc: LineCol) -> Option<LspPosition> {
let byte = self.index.line_col_to_byte(lc)?;
self.byte_to_lsp(byte)
}
pub fn lsp_to_line_col(&self, pos: LspPosition) -> Option<LineCol> {
let byte = self.lsp_to_byte(pos)?;
self.byte_to_line_col(byte)
}
}