diff --git a/crates/oxc_language_server/src/linter.rs b/crates/oxc_language_server/src/linter.rs index 0cd3cd8a4..d187a41c3 100644 --- a/crates/oxc_language_server/src/linter.rs +++ b/crates/oxc_language_server/src/linter.rs @@ -369,8 +369,10 @@ fn get_valid_extensions() -> Vec<&'static str> { #[allow(clippy::cast_possible_truncation)] fn offset_to_position(offset: usize, source_text: &str) -> Option { let rope = Rope::from_str(source_text); - let line = rope.try_char_to_line(offset).ok()?; + let line = rope.try_byte_to_line(offset).ok()?; let first_char_of_line = rope.try_line_to_char(line).ok()?; + // Original offset is byte, but Rope uses char offset + let offset = rope.try_byte_to_char(offset).ok()?; let column = offset - first_char_of_line; Some(Position::new(line as u32, column as u32)) }