diff --git a/crates/oxc_language_server/fixtures/linter/issue_14565/.oxlintrc.json b/crates/oxc_language_server/fixtures/linter/issue_14565/.oxlintrc.json
new file mode 100644
index 0000000000000..5c94e487822d3
--- /dev/null
+++ b/crates/oxc_language_server/fixtures/linter/issue_14565/.oxlintrc.json
@@ -0,0 +1,13 @@
+{
+ "rules": {
+ "no-debugger": "off",
+ "unicorn/filename-case": ["error", {
+ "cases": {
+ "kebabCase": false,
+ "camelCase": false,
+ "pascalCase": true,
+ "snakeCase": true
+ }
+ }]
+ }
+}
diff --git a/crates/oxc_language_server/fixtures/linter/issue_14565/foo-bar.astro b/crates/oxc_language_server/fixtures/linter/issue_14565/foo-bar.astro
new file mode 100644
index 0000000000000..3c1754963b54a
--- /dev/null
+++ b/crates/oxc_language_server/fixtures/linter/issue_14565/foo-bar.astro
@@ -0,0 +1,3 @@
+---
+debugger
+---
diff --git a/crates/oxc_language_server/src/linter/error_with_position.rs b/crates/oxc_language_server/src/linter/error_with_position.rs
index 231a4a86fbf85..6542b5dff6de6 100644
--- a/crates/oxc_language_server/src/linter/error_with_position.rs
+++ b/crates/oxc_language_server/src/linter/error_with_position.rs
@@ -122,6 +122,14 @@ pub fn message_to_lsp_diagnostic(
// Add ignore fixes
let error_offset = message.span().start;
let section_offset = message.section_offset;
+
+ // If the error is exactly at the section offset and has 0 span length, it means that the file is the problem
+ // and attaching a ignore comment would not ignore the error.
+ // This is because the ignore comment would need to be placed before the error offset, which is not possible.
+ if error_offset == section_offset && message.span().end == section_offset {
+ return DiagnosticReport { diagnostic, fixed_content };
+ }
+
let fixed_content = add_ignore_fixes(
fixed_content,
&message.error.code,
@@ -265,6 +273,9 @@ fn disable_for_this_line(
let whitespace_range = {
let start = insert_offset as usize;
let end = error_offset as usize;
+
+ // make sure that end is at least start to avoid panic
+ let end = end.max(start);
let slice = &bytes[start..end];
let whitespace_len = slice.iter().take_while(|c| matches!(c, b' ' | b'\t')).count();
&slice[..whitespace_len]
@@ -608,6 +619,21 @@ mod test {
assert_eq!(fix.range.start.character, 0);
}
+ #[test]
+ fn disable_for_this_line_section_offset_start() {
+ // Test framework file where error is exactly at section offset
+ let source = "";
+ let rope = Rope::from_str(source);
+ let section_offset = 8; // At the \n after "