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 "