Repository: oxc-project/oxc (2026-04-06T15:21:40Z)

Issue:
oxlint(lsp): Auto-fix for unused eslint-disable directives should delete the line, not leave blank comments
### Confirm that this is a Bug for the editor extension, not the CLI

- [x] This bug does not happen in the Oxlint/Oxfmt CLI
- [x] After restarting the editor, the bug still appears

<!-- If you are able to see the same problem in the CLI, please report your issue at https://github.com/oxc-project/oxc -->

### Versions used

<!-- Please fill out the versions, hover over the Status Bar "oxc" in the bottom right to get the information as needed. -->

```
VS Code extension: v1.52.0
oxlint: v1.58.0
oxfmt: v0.43.0
VS Code version: 1.105.1
Operating System and Version: macOs 26.3.1
Node Version: v24.12.0
Node Manager: npm v11.6.2
```

### What happened?

When Oxlint reports an unused disable directive (e.g. with `reportUnusedDisableDirectives` enabled in the Oxlint config), the **CLI does not offer an auto-fix** for that diagnostic. The **VS Code extension** does apply a fix (e.g. via **Fix all** / `source.fixAll.oxc` on save), but the fix is **wrong**: it strips the directive text and leaves an **empty comment** on the line (`//` or `/**/`) instead of **removing the whole line**, which matches what users expect from ESLint-style tooling and leaves noisy, useless lines in the file.

**Steps to reproduce**
1. Clone https://github.com/arsnl/oxlint-repro-file-level-disable and open the folder in VS Code.
2. Run `npm install`.
3. In `.vscode/settings.json`, set `"source.fixAll.oxc"` to `"always"` under `editor.codeActionsOnSave` (or use **Fix all** from the lightbulb on an unused-disable diagnostic).
4. Save `test.ts` (or trigger fix all).
**Actual behavior:** Lines that contained only the disable comment become `//` or `/**/` with nothing after it.

**Expected behavior:** The **entire line** should be removed when nothing meaningful remains (same idea as removing a full `eslint-disable` line), not replaced with an empty comment token.
*(Related upstream context: in that repro, file-level `oxlint-disable` for a file-scope rule may still leave the real rule violation plus an “unused directive” warning—[that’s separate Oxlint engine behavior](https://github.com/oxc-project/oxc/issues/21072); this ticket is specifically about the **editor fix** leaving empty comments.)*

### Reproduction repo

https://github.com/arsnl/oxlint-repro-file-level-disable  

Minimal workspace: `test.ts`, `oxlint.config.ts` (`reportUnusedDisableDirectives: "warn"`), and `.vscode/` recommendations for `oxc.oxc-vscode`. See the **“Reproduction (VS Code extension)”** section in the repo `README.md`.

### Output channel log

<!--
  If you have a problem with oxlint / oxfmt, the output log could be helpful for us.
  Set `oxc.trace.server` to `verbose` in your `.vscode/settings.json` for more
  information and then use "Oxc: Show Output Channel (Linter/Formatter)".
  Warning: setting it to `verbose` will output your file contents as well, make sure you do not include confidential information. You may consider asking your AI agent of choice to redact the log for you before sharing it if you have concerns.
-->

<details>
<summary>Click to expand</summary>

```
2026-04-05 14:42:48.027 [info] [Error - 14:42:48] Server process exited with code 0.
2026-04-05 14:42:48.028 [info] [Trace - 14:42:48] Received request 'client/registerCapability - (0)'.
2026-04-05 14:42:48.028 [info] Params: {
    "registrations": [
        {
            "id": "watcher-formatter-file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
            "method": "workspace/didChangeWatchedFiles",
            "registerOptions": {
                "watchers": [
                    {
                        "globPattern": {
                            "baseUri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
                            "pattern": ".oxfmtrc.json"
                        },
                        "kind": 7
                    },
                    {
                        "globPattern": {
                            "baseUri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
                            "pattern": ".oxfmtrc.jsonc"
                        },
                        "kind": 7
                    },
                    {
                        "globPattern": {
                            "baseUri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
                            "pattern": "oxfmt.config.ts"
                        },
                        "kind": 7
                    },
                    {
                        "globPattern": {
                            "baseUri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
                            "pattern": "vite.config.ts"
                        },
                        "kind": 7
                    },
                    {
                        "globPattern": {
                            "baseUri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable",
                            "pattern": ".editorconfig"
                        },
                        "kind": 7
                    }
                ]
            }
        }
    ]
}


2026-04-05 14:42:48.028 [info] [Trace - 14:42:48] Sending response 'client/registerCapability - (0)'. Processing request took 0ms
2026-04-05 14:42:48.028 [info] No result returned.


2026-04-05 14:43:18.904 [info] [Trace - 14:43:18] Sending notification 'textDocument/didChange'.
2026-04-05 14:43:18.904 [info] Params: {
    "textDocument": {
        "uri": "file:///Users/arsnl/Developer/oxlint-repro-file-level-disable/test.ts",
        "version": 3
    },
    "contentChanges": [
        {
            "text": "/**/\n\n//\nvar x = \"y\";"
        }
    ]
}
```

</details>



Discussion:
@Sysix I see you are working on a fix. Do you know why only the VS Code Extension auto-fix the unused eslint/oxlint-disable directives, but `oxlint --fix`, `oxlint --fix-suggestions` or `oxlint --fix-dangerously` don't?
@arsnl the fix-logic for unused disable directive was only implemented for the LSP. 
We can check if it is preferred to auto-fix it in CLI too. @camc314 your thoughts?
> We can check if it is preferred to auto-fix it in CLI too. @camc314 your thoughts?

yes, would be nie if we can support this - might be a bit of a pain to wrangle and get working, but definitly nice to have.



Patch:
diff --git a/apps/oxlint/src/lsp/error_with_position.rs b/apps/oxlint/src/lsp/error_with_position.rs
index 250a592062968..eef7469816e0d 100644
--- a/apps/oxlint/src/lsp/error_with_position.rs
+++ b/apps/oxlint/src/lsp/error_with_position.rs
@@ -273,6 +273,7 @@ pub fn create_unused_directives_report(
     let unused_disable = directives.collect_unused_disable_comments();
     for unused_comment in unused_disable {
         let span = unused_comment.span;
+        let fix_span = unused_comment.fix_span;
         match unused_comment.r#type {
             RuleCommentType::All => {
                 reports.push(build_unused_disable_diagnostic_report(
@@ -281,7 +282,7 @@ pub fn create_unused_directives_report(
                     severity,
                     source_text,
                     rope,
-                    Some(&Fix::delete(span).with_message(fix_message)),
+                    Some(&Fix::delete(fix_span).with_message(fix_message)),
                 ));
             }
             RuleCommentType::Single(rules) => {
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=checkstyle --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=checkstyle --report-unused-disable-directives disable-directive.js@oxlint.snap
index b44c3722f5924..86c39220c218d 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=checkstyle --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=checkstyle --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -5,7 +5,7 @@ source: apps/oxlint/src/tester.rs
 arguments: --format=checkstyle --report-unused-disable-directives disable-directive.js
 working directory: fixtures/cli/output_formatter_diagnostic
 ----------
-<?xml version="1.0" encoding="utf-8"?><checkstyle version="4.3"><file name="disable-directive.js"><error line="9" column="3" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /><error line="12" column="3" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /><error line="15" column="3" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /></file></checkstyle>
+<?xml version="1.0" encoding="utf-8"?><checkstyle version="4.3"><file name="disable-directive.js"><error line="9" column="1" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /><error line="12" column="1" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /><error line="15" column="1" severity="warning" message="Unused eslint-disable directive (no problems were reported)." source="" /></file></checkstyle>
 ----------
 CLI result: LintSucceeded
 ----------
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=default --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=default --report-unused-disable-directives disable-directive.js@oxlint.snap
index 37b937826d090..0846e0db21b7f 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=default --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=default --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -7,26 +7,26 @@ working directory: fixtures/cli/output_formatter_diagnostic
 ----------
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[disable-directive.js:9:3]
+    ,-[disable-directive.js:9:1]
   8 | 
   9 | // eslint-disable-next-line no-debugger
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | const foo = 3;
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[disable-directive.js:12:3]
+    ,-[disable-directive.js:12:1]
  11 | 
  12 | // oxlint-disable-next-line no-debugger
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  13 | const bar = 3;
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[disable-directive.js:15:3]
+    ,-[disable-directive.js:15:1]
  14 | 
  15 | // oxlint-disable-next-line eslint/no-debugger
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  16 | const baz = 3;
     `----
 
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=github --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=github --report-unused-disable-directives disable-directive.js@oxlint.snap
index 8e806541cab83..2731ee39cb629 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=github --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=github --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -5,9 +5,9 @@ source: apps/oxlint/src/tester.rs
 arguments: --format=github --report-unused-disable-directives disable-directive.js
 working directory: fixtures/cli/output_formatter_diagnostic
 ----------
-::warning file=disable-directive.js,line=9,endLine=9,col=3,endColumn=40,title=oxlint::Unused eslint-disable directive (no problems were reported).
-::warning file=disable-directive.js,line=12,endLine=12,col=3,endColumn=40,title=oxlint::Unused eslint-disable directive (no problems were reported).
-::warning file=disable-directive.js,line=15,endLine=15,col=3,endColumn=47,title=oxlint::Unused eslint-disable directive (no problems were reported).
+::warning file=disable-directive.js,line=9,endLine=9,col=1,endColumn=40,title=oxlint::Unused eslint-disable directive (no problems were reported).
+::warning file=disable-directive.js,line=12,endLine=12,col=1,endColumn=40,title=oxlint::Unused eslint-disable directive (no problems were reported).
+::warning file=disable-directive.js,line=15,endLine=15,col=1,endColumn=47,title=oxlint::Unused eslint-disable directive (no problems were reported).
 
 Found 3 warnings and 0 errors.
 ----------
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=json --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=json --report-unused-disable-directives disable-directive.js@oxlint.snap
index 33e4cd800c25b..a0c1ba286c661 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=json --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=json --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -5,9 +5,9 @@ source: apps/oxlint/src/tester.rs
 arguments: --format=json --report-unused-disable-directives disable-directive.js
 working directory: fixtures/cli/output_formatter_diagnostic
 ----------
-{ "diagnostics": [{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 233,"length": 37,"line": 9,"column": 3}}],"related": []},
-{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 289,"length": 37,"line": 12,"column": 3}}],"related": []},
-{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 345,"length": 44,"line": 15,"column": 3}}],"related": []}],
+{ "diagnostics": [{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 231,"length": 39,"line": 9,"column": 1}}],"related": []},
+{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 287,"length": 39,"line": 12,"column": 1}}],"related": []},
+{"message": "Unused eslint-disable directive (no problems were reported).","severity": "warning","causes": [],"filename": "disable-directive.js","labels": [{"span": {"offset": 343,"length": 46,"line": 15,"column": 1}}],"related": []}],
               "number_of_files": 1,
               "number_of_rules": 2,
               "threads_count": 1,
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=junit --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=junit --report-unused-disable-directives disable-directive.js@oxlint.snap
index 6d3ea55048733..82d82c7c78b85 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=junit --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=junit --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -9,13 +9,13 @@ working directory: fixtures/cli/output_formatter_diagnostic
 <testsuites name="Oxlint" tests="3" failures="3" errors="0">
     <testsuite name="disable-directive.js" tests="3" disabled="0" errors="0" failures="3">
         <testcase name="">
-            <failure message="Unused eslint-disable directive (no problems were reported).">line 9, column 3, Unused eslint-disable directive (no problems were reported).</failure>
+            <failure message="Unused eslint-disable directive (no problems were reported).">line 9, column 1, Unused eslint-disable directive (no problems were reported).</failure>
         </testcase>
         <testcase name="">
-            <failure message="Unused eslint-disable directive (no problems were reported).">line 12, column 3, Unused eslint-disable directive (no problems were reported).</failure>
+            <failure message="Unused eslint-disable directive (no problems were reported).">line 12, column 1, Unused eslint-disable directive (no problems were reported).</failure>
         </testcase>
         <testcase name="">
-            <failure message="Unused eslint-disable directive (no problems were reported).">line 15, column 3, Unused eslint-disable directive (no problems were reported).</failure>
+            <failure message="Unused eslint-disable directive (no problems were reported).">line 15, column 1, Unused eslint-disable directive (no problems were reported).</failure>
         </testcase>
     </testsuite>
 </testsuites>
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=stylish --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=stylish --report-unused-disable-directives disable-directive.js@oxlint.snap
index 575cc30af0859..51b9dfca4becc 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=stylish --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=stylish --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -7,9 +7,9 @@ working directory: fixtures/cli/output_formatter_diagnostic
 ----------
 
 [4mdisable-directive.js[0m
-  [2m9:3 [0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
-  [2m12:3[0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
-  [2m15:3[0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
+  [2m9:1 [0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
+  [2m12:1[0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
+  [2m15:1[0m  [33mwarning[0m  Unused eslint-disable directive (no problems were reported).  [2m[0m
 
 [33m✖ 3 problems (0 errors, 3 warnings)[0m
 ----------
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=unix --report-unused-disable-directives disable-directive.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=unix --report-unused-disable-directives disable-directive.js@oxlint.snap
index b672dafa86cee..e8e7e60c2f3b2 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=unix --report-unused-disable-directives disable-directive.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__output_formatter_diagnostic_--format=unix --report-unused-disable-directives disable-directive.js@oxlint.snap
@@ -5,9 +5,9 @@ source: apps/oxlint/src/tester.rs
 arguments: --format=unix --report-unused-disable-directives disable-directive.js
 working directory: fixtures/cli/output_formatter_diagnostic
 ----------
-disable-directive.js:9:3: Unused eslint-disable directive (no problems were reported). [Warning]
-disable-directive.js:12:3: Unused eslint-disable directive (no problems were reported). [Warning]
-disable-directive.js:15:3: Unused eslint-disable directive (no problems were reported). [Warning]
+disable-directive.js:9:1: Unused eslint-disable directive (no problems were reported). [Warning]
+disable-directive.js:12:1: Unused eslint-disable directive (no problems were reported). [Warning]
+disable-directive.js:15:1: Unused eslint-disable directive (no problems were reported). [Warning]
 
 3 problems
 ----------
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc-with-rudd.json@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc-with-rudd.json@oxlint.snap
index a8471194b60fb..b6f8c7be0fa2e 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc-with-rudd.json@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc-with-rudd.json@oxlint.snap
@@ -7,10 +7,10 @@ working directory: fixtures/cli/report_unused_directives
 ----------
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test-multiple-scripts.vue:6:3]
+   ,-[test-multiple-scripts.vue:6:1]
  5 | <script>
  6 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  7 | console.log('regular script');
    `----
 
@@ -24,10 +24,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Delete this console statement.
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:9:3]
+    ,-[test-multiple-scripts.vue:9:1]
   8 | 
   9 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | debugger;
     `----
 
@@ -41,18 +41,18 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:17:3]
+    ,-[test-multiple-scripts.vue:17:1]
  16 | 
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:30:3]
+    ,-[test-multiple-scripts.vue:30:1]
  29 | 
  30 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  31 | console.log("complete line");
     `----
 
@@ -66,18 +66,18 @@ working directory: fixtures/cli/report_unused_directives
   help: Delete this console statement.
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.astro:5:3]
+   ,-[test.astro:5:1]
  4 | 
  5 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  6 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:10:3]
+    ,-[test.astro:10:1]
   9 | 
  10 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  11 | debugger;
     `----
 
@@ -91,10 +91,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:17:3]
+    ,-[test.astro:17:1]
  16 | <script>
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
@@ -107,10 +107,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:31:3]
+    ,-[test.astro:31:1]
  30 | 
  31 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  32 | console.log("complete line");
     `----
 
@@ -132,18 +132,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.js:4:3]
+   ,-[test.js:4:1]
  3 | 
  4 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  5 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.js:9:3]
+    ,-[test.js:9:1]
   8 | 
   9 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | debugger;
     `----
 
@@ -165,10 +165,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.js:26:3]
+    ,-[test.js:26:1]
  25 | 
  26 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  27 | console.log("complete line");
     `----
 
@@ -189,18 +189,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.svelte:5:3]
+   ,-[test.svelte:5:1]
  4 | 
  5 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  6 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:10:3]
+    ,-[test.svelte:10:1]
   9 | 
  10 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  11 | debugger;
     `----
 
@@ -214,10 +214,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:13:3]
+    ,-[test.svelte:13:1]
  12 | 
  13 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  14 | const unusedVariable2 = 100;
     `----
 
@@ -230,10 +230,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:27:3]
+    ,-[test.svelte:27:1]
  26 | 
  27 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  28 | console.log("complete line");
     `----
 
@@ -255,18 +255,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:9:3]
+    ,-[test.vue:9:1]
   8 | 
   9 | // eslint-disable-next-line no-debugger
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | console.log('This is a test');
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:14:3]
+    ,-[test.vue:14:1]
  13 | 
  14 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  15 | debugger;
     `----
 
@@ -280,10 +280,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:17:3]
+    ,-[test.vue:17:1]
  16 | 
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
@@ -296,10 +296,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:31:3]
+    ,-[test.vue:31:1]
  30 | 
  31 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  32 | console.log("complete line");
     `----
 
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc.json --report-unused-disable-directives@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc.json --report-unused-disable-directives@oxlint.snap
index 50ad04f61573a..c38703fe4e313 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc.json --report-unused-disable-directives@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__report_unused_directives_-c .oxlintrc.json --report-unused-disable-directives@oxlint.snap
@@ -7,10 +7,10 @@ working directory: fixtures/cli/report_unused_directives
 ----------
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test-multiple-scripts.vue:6:3]
+   ,-[test-multiple-scripts.vue:6:1]
  5 | <script>
  6 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  7 | console.log('regular script');
    `----
 
@@ -24,10 +24,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Delete this console statement.
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:9:3]
+    ,-[test-multiple-scripts.vue:9:1]
   8 | 
   9 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | debugger;
     `----
 
@@ -41,18 +41,18 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:17:3]
+    ,-[test-multiple-scripts.vue:17:1]
  16 | 
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test-multiple-scripts.vue:30:3]
+    ,-[test-multiple-scripts.vue:30:1]
  29 | 
  30 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  31 | console.log("complete line");
     `----
 
@@ -66,18 +66,18 @@ working directory: fixtures/cli/report_unused_directives
   help: Delete this console statement.
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.astro:5:3]
+   ,-[test.astro:5:1]
  4 | 
  5 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  6 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:10:3]
+    ,-[test.astro:10:1]
   9 | 
  10 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  11 | debugger;
     `----
 
@@ -91,10 +91,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:17:3]
+    ,-[test.astro:17:1]
  16 | <script>
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
@@ -107,10 +107,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.astro:31:3]
+    ,-[test.astro:31:1]
  30 | 
  31 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  32 | console.log("complete line");
     `----
 
@@ -132,18 +132,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.js:4:3]
+   ,-[test.js:4:1]
  3 | 
  4 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  5 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.js:9:3]
+    ,-[test.js:9:1]
   8 | 
   9 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | debugger;
     `----
 
@@ -165,10 +165,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.js:26:3]
+    ,-[test.js:26:1]
  25 | 
  26 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  27 | console.log("complete line");
     `----
 
@@ -189,18 +189,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-   ,-[test.svelte:5:3]
+   ,-[test.svelte:5:1]
  4 | 
  5 | // eslint-disable-next-line no-debugger
-   :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  6 | console.log('This is a test');
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:10:3]
+    ,-[test.svelte:10:1]
   9 | 
  10 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  11 | debugger;
     `----
 
@@ -214,10 +214,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:13:3]
+    ,-[test.svelte:13:1]
  12 | 
  13 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  14 | const unusedVariable2 = 100;
     `----
 
@@ -230,10 +230,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.svelte:27:3]
+    ,-[test.svelte:27:1]
  26 | 
  27 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  28 | console.log("complete line");
     `----
 
@@ -255,18 +255,18 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:9:3]
+    ,-[test.vue:9:1]
   8 | 
   9 | // eslint-disable-next-line no-debugger
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | console.log('This is a test');
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:14:3]
+    ,-[test.vue:14:1]
  13 | 
  14 | // eslint-disable-next-line no-console
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  15 | debugger;
     `----
 
@@ -280,10 +280,10 @@ working directory: fixtures/cli/report_unused_directives
   help: Remove the debugger statement
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:17:3]
+    ,-[test.vue:17:1]
  16 | 
  17 | // eslint-disable-next-line no-unused-vars
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  18 | const unusedVariable2 = 100;
     `----
 
@@ -296,10 +296,10 @@ working directory: fixtures/cli/report_unused_directives
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.vue:31:3]
+    ,-[test.vue:31:1]
  30 | 
  31 | // oxlint-disable-next-line no-debugger, no-for-loop
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  32 | console.log("complete line");
     `----
 
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__tsgolint_disable_directives_--type-aware --report-unused-disable-directives unused.ts@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__tsgolint_disable_directives_--type-aware --report-unused-disable-directives unused.ts@oxlint.snap
index fbd5c9b98b220..9c1f04f105206 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__tsgolint_disable_directives_--type-aware --report-unused-disable-directives unused.ts@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__tsgolint_disable_directives_--type-aware --report-unused-disable-directives unused.ts@oxlint.snap
@@ -16,18 +16,18 @@ working directory: fixtures/cli/tsgolint_disable_directives
   help: Consider using this expression or removing it
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[unused.ts:9:3]
+    ,-[unused.ts:9:1]
   8 | // This disable directive is UNUSED (no error to suppress)
   9 | // oxlint-disable-next-line typescript/no-floating-promises
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  10 | console.log("hello")
     `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[unused.ts:13:3]
+    ,-[unused.ts:13:1]
  12 | // This disable directive is UNUSED (wrong rule name)
  13 | // oxlint-disable-next-line typescript/no-unsafe-assignment
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  14 | myPromise
     `----
 
@@ -69,10 +69,10 @@ working directory: fixtures/cli/tsgolint_disable_directives
   help: Consider removing this declaration.
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[unused.ts:24:3]
+    ,-[unused.ts:24:1]
  23 | const x = 1 + 2
  24 | /* eslint-enable @typescript-eslint/no-floating-promises */
-    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  25 | 
     `----
 
diff --git a/crates/oxc_linter/src/context/host.rs b/crates/oxc_linter/src/context/host.rs
index 2a5fd6b2333bd..2e655da8a67d3 100644
--- a/crates/oxc_linter/src/context/host.rs
+++ b/crates/oxc_linter/src/context/host.rs
@@ -330,6 +330,7 @@ impl<'a> ContextHost<'a> {
 
         for unused_disable_comment in unused_disable_comments {
             let span = unused_disable_comment.span;
+            let fix_span = unused_disable_comment.fix_span;
             match &unused_disable_comment.r#type {
                 RuleCommentType::All => {
                     // eslint-disable
@@ -338,7 +339,7 @@ impl<'a> ContextHost<'a> {
                             .with_label(span)
                             .with_severity(rule_severity),
                         PossibleFixes::Single(
-                            Fix::delete(span)
+                            Fix::delete(fix_span)
                                 .with_kind(FixKind::Suggestion)
                                 .with_message(fix_message),
                         ),
diff --git a/crates/oxc_linter/src/disable_directives.rs b/crates/oxc_linter/src/disable_directives.rs
index 6b7fb7cbcbcca..2078117d70e0e 100644
--- a/crates/oxc_linter/src/disable_directives.rs
+++ b/crates/oxc_linter/src/disable_directives.rs
@@ -19,8 +19,13 @@ enum DisabledRule {
     ///    ^^^^^^^^^^^^^^^ comment_span
     /// ```
     All {
-        /// Span of the comment containing the disable directive
+        /// Full outer span of the comment (including `//` or `/* */` delimiters).
+        /// Used for diagnostic labels.
         comment_span: Span,
+        /// Span used for the fix.  Extends to cover the whole line (including leading
+        /// whitespace and the trailing newline) when the comment is the only content
+        /// on that line; otherwise equals `comment_span`.
+        fix_span: Span,
         /// Whether this is a line-specific directive (`-next-line` or `-line`).
         is_next_line: bool,
     },
@@ -40,10 +45,13 @@ enum DisabledRule {
         ///
         /// For `/* eslint-disable no-debugger */`, this points to "no-debugger".
         name_span: Span,
-        /// Span of the entire comment content containing the disable directive.
-        ///
-        /// For `/* eslint-disable no-debugger */`, this points to "eslint-disable no-debugger".
+        /// Full outer span of the comment (including `//` or `/* */` delimiters).
+        /// Used for diagnostic labels.
         comment_span: Span,
+        /// Span used for the fix.  Extends to cover the whole line (including leading
+        /// whitespace and the trailing newline) when the comment is the only content
+        /// on that line; otherwise equals `comment_span`.
+        fix_span: Span,
         /// Whether this is a line-specific directive (`-next-line` or `-line`).
         /// When true, only diagnostics starting within the interval are suppressed.
         /// When false, any diagnostic overlapping the interval is suppressed.
@@ -60,6 +68,12 @@ impl DisabledRule {
         }
     }
 
+    pub fn fix_span(&self) -> &Span {
+        match self {
+            DisabledRule::All { fix_span, .. } | DisabledRule::Single { fix_span, .. } => fix_span,
+        }
+    }
+
     pub fn is_next_line(&self) -> bool {
         match self {
             DisabledRule::All { is_next_line, .. } | DisabledRule::Single { is_next_line, .. } => {
@@ -158,8 +172,13 @@ pub enum RuleCommentType {
 /// A comment which disables one or more specific rules
 #[derive(Debug, Eq, PartialEq, Clone)]
 pub struct DisableRuleComment {
-    /// Span of the comment
+    /// Full outer span of the comment (including `//` or `/* */` delimiters).
+    /// Used for diagnostic labels.
     pub span: Span,
+    /// Span used for the fix.  Extends to cover the whole line (including leading
+    /// whitespace and the trailing newline) when the comment is the only content
+    /// on that line; otherwise equals `span`.
+    pub fix_span: Span,
     /// Rules disabled by the comment
     pub r#type: RuleCommentType,
 }
@@ -265,6 +284,9 @@ impl DisableDirectives {
                     return None;
                 }
 
+                // All intervals in the group share the same comment, so they have the same fix_span.
+                let fix_span = *group_vec[0].val.fix_span();
+
                 let rules: Vec<RuleCommentRule> = group_vec
                     .iter()
                     .filter_map(|interval| {
@@ -293,12 +315,14 @@ impl DisableDirectives {
                 if rules.len() == group_vec.len() {
                     return Some(DisableRuleComment {
                         span: *comment_span,
+                        fix_span,
                         r#type: RuleCommentType::All,
                     });
                 }
 
                 Some(DisableRuleComment {
                     span: *comment_span,
+                    fix_span,
                     r#type: RuleCommentType::Single(rules),
                 })
             })
@@ -310,9 +334,9 @@ pub struct DisableDirectivesBuilder {
     /// All the disabled rules with their corresponding covering spans
     intervals: Lapper<u32, DisabledRule>,
     /// Start of `eslint-disable` or `oxlint-disable`
-    disable_all_start: Option<(u32, Span)>,
+    disable_all_start: Option<(u32, Span, Span)>,
     /// Start of `eslint-disable` or `oxlint-disable` rule_name`
-    disable_start_map: FxHashMap<String, (u32, Span, Span)>,
+    disable_start_map: FxHashMap<String, (u32, Span, Span, Span)>,
     /// All comments that disable one or more specific rules
     disable_rule_comments: Vec<DisableRuleComment>,
     /// Spans of unused enable directives
@@ -345,6 +369,41 @@ impl DisableDirectivesBuilder {
         self.intervals.insert(Interval { start, stop, val });
     }
 
+    /// Computes the fix span for a disable-directive comment.
+    ///
+    /// If the comment is the only non-whitespace content on its line, returns a
+    /// span that covers the entire line (including leading whitespace and the
+    /// trailing newline).  Otherwise returns the comment's full outer span
+    /// (including `//` or `/* */` delimiters).
+    ///
+    /// This span is stored in [`DisabledRule`] so that `Fix::delete(span)`
+    /// produces the correct edit without any extra post-processing in callers.
+    #[expect(clippy::cast_possible_truncation)]
+    pub(crate) fn compute_comment_fix_span(comment: &Comment, source_text: &str) -> Span {
+        let outer_start = comment.span.start as usize;
+        let outer_end = comment.span.end as usize;
+
+        // Find the start of the current line (character after the preceding `\n`, or 0).
+        let line_start = source_text[..outer_start].rfind('\n').map_or(0, |i| i + 1);
+
+        // Find the end of the current line, including the newline character itself.
+        let line_end =
+            source_text[outer_end..].find('\n').map_or(source_text.len(), |i| outer_end + i + 1);
+
+        let before_on_line = &source_text[line_start..outer_start];
+        let after_on_line = source_text[outer_end..line_end].trim_end_matches(['\r', '\n']);
+
+        if before_on_line.trim().is_empty() && after_on_line.trim().is_empty() {
+            // The comment is the only meaningful content on the line – the fix
+            // should delete the whole line.
+            Span::new(line_start as u32, line_end as u32)
+        } else {
+            // There is other content on the same line – only delete the comment
+            // itself (including its delimiters).
+            comment.span
+        }
+    }
+
     #[expect(clippy::cast_possible_truncation)] // for `as u32`
     fn build_impl(&mut self, source_text: &str, comments: &[Comment]) {
         let source_len = source_text.len() as u32;
@@ -362,6 +421,13 @@ impl DisableDirectivesBuilder {
 
         for comment in comments {
             let comment_span = comment.content_span();
+            // `comment.span` is the full outer span (including `//` or `/* */` delimiters).
+            // It is used as the diagnostic span.
+            let outer_span = comment.span;
+            // Pre-compute the fix span for this comment:
+            // - whole line (incl. leading whitespace + newline) if the comment is alone on the line
+            // - outer comment span (incl. `//` / `/* */` delimiters) otherwise
+            let comment_fix_span = Self::compute_comment_fix_span(comment, source_text);
             let text_source = comment_span.source_text(source_text);
             let text = text_source.trim_start();
             let mut rule_name_start = comment_span.start + (text_source.len() - text.len()) as u32;
@@ -373,10 +439,12 @@ impl DisableDirectivesBuilder {
                 // `eslint-disable`
                 if text.trim().is_empty() {
                     if self.disable_all_start.is_none() {
-                        self.disable_all_start = Some((comment_span.end, comment_span));
+                        self.disable_all_start =
+                            Some((comment_span.end, outer_span, comment_fix_span));
                     }
                     self.disable_rule_comments.push(DisableRuleComment {
                         span: comment_span,
+                        fix_span: comment_fix_span,
                         r#type: RuleCommentType::All,
                     });
                     continue;
@@ -402,10 +470,15 @@ impl DisableDirectivesBuilder {
                         self.add_interval(
                             comment_span.end,
                             stop,
-                            DisabledRule::All { comment_span, is_next_line: true },
+                            DisabledRule::All {
+                                comment_span: outer_span,
+                                fix_span: comment_fix_span,
+                                is_next_line: true,
+                            },
                         );
                         self.disable_rule_comments.push(DisableRuleComment {
                             span: comment_span,
+                            fix_span: comment_fix_span,
                             r#type: RuleCommentType::All,
                         });
                     } else {
@@ -418,7 +491,8 @@ impl DisableDirectivesBuilder {
                                 DisabledRule::Single {
                                     rule_name: rule_name.to_string(),
                                     name_span,
-                                    comment_span,
+                                    comment_span: outer_span,
+                                    fix_span: comment_fix_span,
                                     is_next_line: true,
                                 },
                             );
@@ -429,6 +503,7 @@ impl DisableDirectivesBuilder {
                         });
                         self.disable_rule_comments.push(DisableRuleComment {
                             span: comment_span,
+                            fix_span: comment_fix_span,
                             r#type: RuleCommentType::Single(rules),
                         });
                     }
@@ -450,10 +525,15 @@ impl DisableDirectivesBuilder {
                         self.add_interval(
                             start,
                             stop,
-                            DisabledRule::All { comment_span, is_next_line: true },
+                            DisabledRule::All {
+                                comment_span: outer_span,
+                                fix_span: comment_fix_span,
+                                is_next_line: true,
+                            },
                         );
                         self.disable_rule_comments.push(DisableRuleComment {
                             span: comment_span,
+                            fix_span: comment_fix_span,
                             r#type: RuleCommentType::All,
                         });
                     } else {
@@ -466,7 +546,8 @@ impl DisableDirectivesBuilder {
                                 DisabledRule::Single {
                                     rule_name: rule_name.to_string(),
                                     name_span,
-                                    comment_span,
+                                    comment_span: outer_span,
+                                    fix_span: comment_fix_span,
                                     is_next_line: true,
                                 },
                             );
@@ -477,6 +558,7 @@ impl DisableDirectivesBuilder {
                         });
                         self.disable_rule_comments.push(DisableRuleComment {
                             span: comment_span,
+                            fix_span: comment_fix_span,
                             r#type: RuleCommentType::Single(rules),
                         });
                     }
@@ -491,12 +573,14 @@ impl DisableDirectivesBuilder {
                         self.disable_start_map.entry(rule_name.to_string()).or_insert((
                             comment_span.end,
                             name_span,
-                            comment_span,
+                            outer_span,
+                            comment_fix_span,
                         ));
                         rules.push(RuleCommentRule { rule_name: rule_name.to_string(), name_span });
                     });
                     self.disable_rule_comments.push(DisableRuleComment {
                         span: comment_span,
+                        fix_span: comment_fix_span,
                         r#type: RuleCommentType::Single(rules),
                     });
                     continue;
@@ -509,11 +593,15 @@ impl DisableDirectivesBuilder {
                 rule_name_start += 13; // eslint-enable is 13 bytes
                 // `eslint-enable`
                 if text.trim().is_empty() {
-                    if let Some((start, _)) = self.disable_all_start.take() {
+                    if let Some((start, _, _)) = self.disable_all_start.take() {
                         self.add_interval(
                             start,
                             comment_span.start,
-                            DisabledRule::All { comment_span, is_next_line: false },
+                            DisabledRule::All {
+                                comment_span: outer_span,
+                                fix_span: comment_fix_span,
+                                is_next_line: false,
+                            },
                         );
                     } else {
                         // collect as unused enable (see more at note comments in beginning of this method)
@@ -522,14 +610,15 @@ impl DisableDirectivesBuilder {
                 } else {
                     // `eslint-enable rule-name1, rule-name2`
                     Self::get_rule_names(text, rule_name_start, |rule_name, name_span| {
-                        if let Some((start, _, _)) = self.disable_start_map.remove(rule_name) {
+                        if let Some((start, _, _, _)) = self.disable_start_map.remove(rule_name) {
                             self.add_interval(
                                 start,
                                 comment_span.start,
                                 DisabledRule::Single {
                                     rule_name: rule_name.to_string(),
                                     name_span,
-                                    comment_span,
+                                    comment_span: outer_span,
+                                    fix_span: comment_fix_span,
                                     is_next_line: false,
                                 },
                             );
@@ -543,21 +632,27 @@ impl DisableDirectivesBuilder {
         }
 
         // Lone `eslint-disable`
-        if let Some((start, comment_span)) = self.disable_all_start {
+        if let Some((start, comment_span, fix_span)) = self.disable_all_start {
             self.add_interval(
                 start,
                 source_len,
-                DisabledRule::All { comment_span, is_next_line: false },
+                DisabledRule::All { comment_span, fix_span, is_next_line: false },
             );
         }
 
         // Lone `eslint-disable rule_name`
         let disable_start_map = self.disable_start_map.drain().collect::<Vec<_>>();
-        for (rule_name, (start, name_span, comment_span)) in disable_start_map {
+        for (rule_name, (start, name_span, comment_span, fix_span)) in disable_start_map {
             self.add_interval(
                 start,
                 source_len,
-                DisabledRule::Single { rule_name, name_span, comment_span, is_next_line: false },
+                DisabledRule::Single {
+                    rule_name,
+                    name_span,
+                    comment_span,
+                    fix_span,
+                    is_next_line: false,
+                },
             );
         }
 
@@ -1088,9 +1183,14 @@ mod tests {
         semantic_ret.semantic
     }
 
+    /// Replicates the `compute_comment_fix_span` logic for use in tests.
+    fn comment_fix_span(comment: &Comment, source_text: &str) -> Span {
+        DisableDirectivesBuilder::compute_comment_fix_span(comment, source_text)
+    }
+
     fn test_directives(
         create_source_text: impl Fn(&str) -> String,
-        test: impl Fn(&[Comment], DisableDirectives),
+        test: impl Fn(&str, &[Comment], DisableDirectives),
     ) {
         let allocator = Allocator::default();
         for prefix in ["eslint", "oxlint"] {
@@ -1099,7 +1199,7 @@ mod tests {
             let comments = semantic.comments();
             let directives =
                 DisableDirectivesBuilder::new().build(semantic.source_text(), comments);
-            test(comments, directives);
+            test(semantic.source_text(), comments, directives);
         }
     }
 
@@ -1126,7 +1226,7 @@ mod tests {
                     "
                 )
             },
-            |comments, directives| {
+            |_source_text, comments, directives| {
                 let unused = directives.unused_enable_comments();
 
                 assert_eq!(unused.len(), 1);
@@ -1151,7 +1251,7 @@ mod tests {
                     "
                 )
             },
-            |comments, directives| {
+            |_source_text, comments, directives| {
                 let unused = directives.unused_enable_comments();
 
                 assert_eq!(unused.len(), 2);
@@ -1187,7 +1287,7 @@ mod tests {
                     "
                 )
             },
-            |_, directives| {
+            |_source_text, _, directives| {
                 // no mark unused
 
                 let unused = directives.unused_enable_comments();
@@ -1208,15 +1308,32 @@ mod tests {
                     "
                 )
             },
-            |comments, directives| {
-                // no mark unused
-
+            |source_text, comments, directives| {
                 let unused = directives.collect_unused_disable_comments();
 
                 assert_eq!(unused.len(), 1);
 
                 let comment = unused.first().unwrap();
-                assert_eq!(comment.span, comments.first().unwrap().content_span());
+                let outer_span = comments.first().unwrap().span;
+
+                // Diagnostic span must be the original comment outer span (no line extension).
+                assert_eq!(
+                    comment.span, outer_span,
+                    "diagnostic span must be the original comment span"
+                );
+
+                // Fix span must extend to cover the whole line when the comment is alone on it.
+                let line_has_only_comment = source_text[..outer_span.start as usize]
+                    .rsplit_once('\n')
+                    .is_none_or(|(_, before)| before.trim().is_empty());
+                if line_has_only_comment {
+                    assert!(
+                        comment.fix_span.start < outer_span.start
+                            || comment.fix_span.end > outer_span.end,
+                        "fix span should extend beyond the comment when alone on a line"
+                    );
+                }
+
                 assert_eq!(comment.r#type, RuleCommentType::All);
             },
         );
@@ -1233,15 +1350,32 @@ mod tests {
                     "
                 )
             },
-            |comments, directives| {
-                // no mark unused
-
+            |source_text, comments, directives| {
                 let unused = directives.collect_unused_disable_comments();
 
                 assert_eq!(unused.len(), 1);
 
                 let comment = unused.first().unwrap();
-                assert_eq!(comment.span, comments.first().unwrap().content_span());
+                let outer_span = comments.first().unwrap().span;
+
+                // Diagnostic span must be the original comment outer span (no line extension).
+                assert_eq!(
+                    comment.span, outer_span,
+                    "diagnostic span must be the original comment span"
+                );
+
+                // Fix span must extend to cover the whole line when the comment is alone on it.
+                let line_has_only_comment = source_text[..outer_span.start as usize]
+                    .rsplit_once('\n')
+                    .is_none_or(|(_, before)| before.trim().is_empty());
+                if line_has_only_comment {
+                    assert!(
+                        comment.fix_span.start < outer_span.start
+                            || comment.fix_span.end > outer_span.end,
+                        "fix span should extend beyond the comment when alone on a line"
+                    );
+                }
+
                 assert_eq!(comment.r#type, RuleCommentType::All);
             },
         );
@@ -1260,17 +1394,24 @@ mod tests {
                     "
                 )
             },
-            |comments, directives| {
+            |source_text, comments, directives| {
+                // Mark each directive as used by constructing the matching `DisabledRule` with the
+                // correct spans (same as what `build_impl` stores).
+                let fix_span_0 = comment_fix_span(&comments[0], source_text);
+                let fix_span_1 = comment_fix_span(&comments[1], source_text);
+
                 directives.mark_disable_directive_used(DisabledRule::Single {
                     rule_name: "no-console".to_string(),
                     name_span: Span::sized(comments[0].content_span().start + 16, 10),
-                    comment_span: comments[0].content_span(),
+                    comment_span: comments[0].span,
+                    fix_span: fix_span_0,
                     is_next_line: false,
                 });
                 directives.mark_disable_directive_used(DisabledRule::Single {
                     rule_name: "no-debugger".to_string(),
                     name_span: Span::sized(comments[1].content_span().start + 16, 11),
-                    comment_span: comments[1].content_span(),
+                    comment_span: comments[1].span,
+                    fix_span: fix_span_1,
                     is_next_line: false,
                 });
 
@@ -1296,7 +1437,9 @@ mod tests {
     #[expect(clippy::cast_possible_truncation)] // for `as u32`
     fn test_rule_comment_rule_create_fix() {
         let source_text = "// eslint-disable-next-line max-params, no-console, no-debugger";
-        let comment_span = Span::sized(3, source_text.len() as u32 - 3);
+        // comment_span now represents the fix span (outer span including `//`, whole line if alone).
+        // Since this string has no newline, the fix span = outer span = Span::new(0, len).
+        let comment_span = Span::new(0, source_text.len() as u32);
 
         let max_params_fix =
             RuleCommentRule { rule_name: "max-params".to_string(), name_span: Span::sized(28, 10) }
@@ -1331,7 +1474,7 @@ mod tests {
         // This test is expected to panic because it is a standalone rule.
         // Standalone rules should be `RuleCommentType::All`.
         let source_text = "// eslint-disable-next-line max-params";
-        let comment_span = Span::sized(3, source_text.len() as u32 - 3);
+        let comment_span = Span::new(0, source_text.len() as u32);
 
         RuleCommentRule { rule_name: "max-params".to_string(), name_span: Span::sized(28, 10) }
             .create_fix(source_text, comment_span);
@@ -1382,4 +1525,112 @@ function test() {
             "eslint-disable-next-line should NOT suppress diagnostics on lines after the next line"
         );
     }
+
+    /// Helper: apply a `Fix::delete` on `span` to `source_text` and return the resulting string.
+    fn apply_delete(source_text: &str, span: Span) -> String {
+        let start = span.start as usize;
+        let end = span.end as usize;
+        format!("{}{}", &source_text[..start], &source_text[end..])
+    }
+
+    #[test]
+    fn fix_span_line_comment_alone_on_line() {
+        // A `// eslint-disable` on its own line.
+        // - diagnostic `span` = outer comment span (no line extension)
+        // - `fix_span` = the whole line (including the newline)
+        let source_text = "const x = 1;\n// eslint-disable no-console\nconsole.log(x);\n";
+        let allocator = Allocator::default();
+        let semantic = process_source(&allocator, source_text);
+        let directives =
+            DisableDirectivesBuilder::new().build(semantic.source_text(), semantic.comments());
+
+        let unused = directives.collect_unused_disable_comments();
+        assert_eq!(unused.len(), 1);
+
+        // span must be the outer comment span only (no line extension).
+        let comment_outer_span = semantic.comments()[0].span;
+        assert_eq!(
+            unused[0].span, comment_outer_span,
+            "diagnostic span must be the outer comment span"
+        );
+
+        // fix_span must delete the whole line.
+        let result = apply_delete(source_text, unused[0].fix_span);
+        assert_eq!(result, "const x = 1;\nconsole.log(x);\n");
+    }
+
+    #[test]
+    fn fix_span_block_comment_alone_on_line() {
+        // A `/* eslint-disable */` on its own line.
+        // - diagnostic `span` = outer comment span (no line extension)
+        // - `fix_span` = the whole line (including the newline)
+        let source_text = "const x = 1;\n/* eslint-disable no-console */\nconsole.log(x);\n";
+        let allocator = Allocator::default();
+        let semantic = process_source(&allocator, source_text);
+        let directives =
+            DisableDirectivesBuilder::new().build(semantic.source_text(), semantic.comments());
+
+        let unused = directives.collect_unused_disable_comments();
+        assert_eq!(unused.len(), 1);
+
+        // span must be the outer comment span only.
+        let comment_outer_span = semantic.comments()[0].span;
+        assert_eq!(
+            unused[0].span, comment_outer_span,
+            "diagnostic span must be the outer comment span"
+        );
+
+        // fix_span must delete the whole line.
+        let result = apply_delete(source_text, unused[0].fix_span);
+        assert_eq!(result, "const x = 1;\nconsole.log(x);\n");
+    }
+
+    #[test]
+    fn fix_span_comment_on_line_with_code() {
+        // An `eslint-disable-line` style comment after code.
+        // Both `span` and `fix_span` should cover just the comment (no line extension since
+        // there is code before it on the same line).
+        let source_text = "const x = 1; // eslint-disable-line no-unused-vars\n";
+        let allocator = Allocator::default();
+        let semantic = process_source(&allocator, source_text);
+        let directives =
+            DisableDirectivesBuilder::new().build(semantic.source_text(), semantic.comments());
+
+        let unused = directives.collect_unused_disable_comments();
+        assert_eq!(unused.len(), 1);
+
+        // fix_span deletes only the comment; code on the same line is preserved.
+        let result = apply_delete(source_text, unused[0].fix_span);
+        assert!(result.contains("const x = 1;"), "code on the line must not be removed");
+        assert!(!result.contains("eslint-disable"), "directive must be removed");
+        // Must not leave `//` behind.
+        assert!(!result.contains("//"), "must not leave an empty `//` behind");
+    }
+
+    #[test]
+    fn fix_span_indented_line_comment() {
+        // An indented directive on its own line.
+        // - `span` = outer comment span (no indentation)
+        // - `fix_span` = whole line including indentation and newline
+        let source_text =
+            "function f() {\n    // eslint-disable-next-line no-console\n    console.log();\n}\n";
+        let allocator = Allocator::default();
+        let semantic = process_source(&allocator, source_text);
+        let directives =
+            DisableDirectivesBuilder::new().build(semantic.source_text(), semantic.comments());
+
+        let unused = directives.collect_unused_disable_comments();
+        assert_eq!(unused.len(), 1);
+
+        // span must be the outer comment span (starts at `//`, not at the indentation).
+        let comment_outer_span = semantic.comments()[0].span;
+        assert_eq!(
+            unused[0].span, comment_outer_span,
+            "diagnostic span must be the outer comment span"
+        );
+
+        // fix_span must delete the whole line (including the 4-space indentation).
+        let result = apply_delete(source_text, unused[0].fix_span);
+        assert_eq!(result, "function f() {\n    console.log();\n}\n");
+    }
 }


Test patch:
diff --git a/apps/oxlint/src/lsp/snapshots/fixtures_lsp_unused_disabled_directives@test.js.snap b/apps/oxlint/src/lsp/snapshots/fixtures_lsp_unused_disabled_directives@test.js.snap
index aae1195444ae1..887ece6082bca 100644
--- a/apps/oxlint/src/lsp/snapshots/fixtures_lsp_unused_disabled_directives@test.js.snap
+++ b/apps/oxlint/src/lsp/snapshots/fixtures_lsp_unused_disabled_directives@test.js.snap
@@ -32,7 +32,7 @@ tags: None
 code: ""
 code_description.href: "None"
 message: "Unused oxlint-disable directive (no problems were reported)."
-range: Range { start: Position { line: 0, character: 2 }, end: Position { line: 0, character: 56 } }
+range: Range { start: Position { line: 0, character: 0 }, end: Position { line: 0, character: 56 } }
 related_information: None
 severity: Some(Error)
 source: Some("oxc")
@@ -50,7 +50,7 @@ tags: None
 code: ""
 code_description.href: "None"
 message: "Unused oxlint-disable directive (no problems were reported)."
-range: Range { start: Position { line: 8, character: 2 }, end: Position { line: 8, character: 52 } }
+range: Range { start: Position { line: 8, character: 0 }, end: Position { line: 8, character: 52 } }
 related_information: None
 severity: Some(Error)
 source: Some("oxc")
@@ -172,11 +172,11 @@ TextEdit: TextEdit {
     range: Range {
         start: Position {
             line: 0,
-            character: 2,
+            character: 0,
         },
         end: Position {
-            line: 0,
-            character: 56,
+            line: 1,
+            character: 0,
         },
     },
     new_text: "",
@@ -208,11 +208,11 @@ TextEdit: TextEdit {
     range: Range {
         start: Position {
             line: 8,
-            character: 2,
+            character: 0,
         },
         end: Position {
-            line: 8,
-            character: 52,
+            line: 9,
+            character: 0,
         },
     },
     new_text: "",
@@ -227,11 +227,11 @@ TextEdit: TextEdit {
     range: Range {
         start: Position {
             line: 0,
-            character: 2,
+            character: 0,
         },
         end: Position {
-            line: 0,
-            character: 56,
+            line: 1,
+            character: 0,
         },
     },
     new_text: "",
@@ -266,24 +266,11 @@ TextEdit: TextEdit {
     range: Range {
         start: Position {
             line: 8,
-            character: 2,
-        },
-        end: Position {
-            line: 8,
-            character: 52,
-        },
-    },
-    new_text: "",
-}
-TextEdit: TextEdit {
-    range: Range {
-        start: Position {
-            line: 9,
             character: 0,
         },
         end: Position {
             line: 9,
-            character: 29,
+            character: 0,
         },
     },
     new_text: "",
diff --git a/apps/oxlint/src/snapshots/fixtures__cli__disable_vitest_rules_-c .oxlintrc-vitest.json --report-unused-disable-directives test.js@oxlint.snap b/apps/oxlint/src/snapshots/fixtures__cli__disable_vitest_rules_-c .oxlintrc-vitest.json --report-unused-disable-directives test.js@oxlint.snap
index f1b41e1adf410..d198766f86ce0 100644
--- a/apps/oxlint/src/snapshots/fixtures__cli__disable_vitest_rules_-c .oxlintrc-vitest.json --report-unused-disable-directives test.js@oxlint.snap
+++ b/apps/oxlint/src/snapshots/fixtures__cli__disable_vitest_rules_-c .oxlintrc-vitest.json --report-unused-disable-directives test.js@oxlint.snap
@@ -15,10 +15,10 @@ working directory: fixtures/cli/disable_vitest_rules
    `----
 
   ! Unused eslint-disable directive (no problems were reported).
-    ,-[test.js:19:5]
+    ,-[test.js:19:3]
  18 |   // This one should trigger a warning about an unnecessary disable:
  19 |   // oxlint-disable-next-line vitest/no-restricted-vi-methods
-    :     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    :   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  20 |   video.play();
     `----
 
diff --git a/apps/oxlint/test/lsp/lint/__snapshots__/lint.test.ts.snap b/apps/oxlint/test/lsp/lint/__snapshots__/lint.test.ts.snap
index 97760fcaa0612..7366dc1f4758e 100644
--- a/apps/oxlint/test/lsp/lint/__snapshots__/lint.test.ts.snap
+++ b/apps/oxlint/test/lsp/lint/__snapshots__/lint.test.ts.snap
@@ -145,7 +145,7 @@ exports[`LSP linting > config options > should apply config from unused-disable-
 unused-disable-directive-from-config/test.ts
 --- Diagnostics ---------
 > 1 | // oxlint-disable-next-line debugger
-    |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Unused oxlint-disable directive (no problems were reported).
+    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: Unused oxlint-disable directive (no problems were reported).
   2 | console.log("This directive is not used");
   3 |
 --------------------"