Skip to content

feat(oxlint/lsp): add source.fixAllDangerous.oxc code action kind#20526

Merged
camc314 merged 17 commits intooxc-project:mainfrom
babu-ch:fix/lsp-fix-kind-dangerous
Apr 5, 2026
Merged

feat(oxlint/lsp): add source.fixAllDangerous.oxc code action kind#20526
camc314 merged 17 commits intooxc-project:mainfrom
babu-ch:fix/lsp-fix-kind-dangerous

Conversation

@babu-ch
Copy link
Copy Markdown
Contributor

@babu-ch babu-ch commented Mar 19, 2026

wip

Fixes #20523

babu-ch added 3 commits March 19, 2026 22:22
When fix_kind includes dangerous fixes, use "fix all fixable oxlint issues"
instead of "fix all safe fixable oxlint issues" to avoid misleading users.
Update snapshot to reflect the new dynamic title behavior where
dangerous fix_kind shows "fix all fixable oxlint issues" instead of
"fix all safe fixable oxlint issues".
@babu-ch babu-ch requested a review from camc314 as a code owner March 19, 2026 13:26
@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI C-bug Category - Bug labels Mar 19, 2026
@babu-ch babu-ch force-pushed the fix/lsp-fix-kind-dangerous branch from ae81ffc to f011338 Compare March 19, 2026 13:57
@Sysix
Copy link
Copy Markdown
Member

Sysix commented Mar 19, 2026

We cannot use the source.fixAll code action for this. The LSP specs are only allowing safe fixes:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeActionKind

    /**
	 * Base kind for a 'fix all' source action: `source.fixAll`.
	 *
	 * 'Fix all' actions automatically fix errors that have a clear fix that
	 * do not require user input. They should not suppress errors or perform
	 * unsafe fixes such as generating new types or classes.
	 *
	 * @since 3.17.0
	 */
	export const SourceFixAll: CodeActionKind = 'source.fixAll';

We need to create a new code action for this behavior.
And we do not need to filter them, we send the fixKind to the linter and only getting a filtered list of fixes out.

babu-ch added 3 commits March 20, 2026 02:54
Per LSP spec, source.fixAll is restricted to safe fixes only.
Introduce source.fixAllDangerous.oxc for dangerous fix-all operations.
Also remove the redundant fix kind filter from fix_all_text_edit since
the linter already filters fixes by the configured fix_kind.
@babu-ch babu-ch marked this pull request as draft March 19, 2026 18:32
@Sysix Sysix self-assigned this Mar 19, 2026
@babu-ch babu-ch changed the title fix(linter): respect fixKind in LSP fix-all action feat(lsp): add source.fixAllDangerous.oxc code action kind Mar 20, 2026
@github-actions github-actions bot added the C-enhancement Category - New feature or request label Mar 20, 2026
@babu-ch
Copy link
Copy Markdown
Contributor Author

babu-ch commented Mar 20, 2026

@Sysix
I wasn’t aware of that!

I’ve reverted the changes related to fixAll.
I also tried adding a new action called fixAllDangerous—what do you think?

Copy link
Copy Markdown
Member

@Sysix Sysix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great ❤️ Could successfully test it with VSCode without any changes 🥳

@babu-ch babu-ch marked this pull request as ready for review March 21, 2026 01:52
@babu-ch
Copy link
Copy Markdown
Contributor Author

babu-ch commented Mar 21, 2026

@Sysix Applied your suggested change. Should we also add source.fixAllDangerous.oxc to the Source Action menu in the editor plugins (VS Code / IntelliJ)?

@Sysix
Copy link
Copy Markdown
Member

Sysix commented Mar 21, 2026

Should we also add source.fixAllDangerous.oxc to the Source Action menu in the editor plugins (VS Code / IntelliJ)?

I think we should keep the default behavior. We do not add source.fixAll to the code action menu (like ESLint?),
I guess the user can somehow configure it himself?
I know that zed or coc is always requesting all provided code actions, so there that should be already shown :)

@Sysix Sysix changed the title feat(lsp): add source.fixAllDangerous.oxc code action kind feat(oxlint/lsp): add source.fixAllDangerous.oxc code action kind Mar 21, 2026
Copy link
Copy Markdown
Contributor

@camc314 camc314 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@camc314 camc314 merged commit 7a7b7b8 into oxc-project:main Apr 5, 2026
22 of 23 checks passed
leaysgur pushed a commit that referenced this pull request Apr 7, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 22ce6af oxlint/lsp: [**BREAKING**] Show/fix safe suggestions by
default (#19816) (Sysix)

### 🚀 Features

- 7a7b7b8 oxlint/lsp: Add source.fixAllDangerous.oxc code action kind
(#20526) (bab)
- 9cfe57e linter/unicorn: Implement prefer-import-meta-properties rule
(#20662) (Irfan - ئىرفان)
- 1edb391 linter/eslint: Implement `no-restricted-exports` rule (#20592)
(Nicolas Le Cam)
- 0f12bcd linter/react: Implement `hook-use-state` rule (#20986) (Khaled
Labeb)
- 1513a9f oxlint/lsp: Show note field for lsp diagnostic (#20983)
(Sysix)
- 7fdf722 linter/unicorn: Implement `no-useless-iterator-to-array` rule
(#20945) (Mikhail Baev)
- 39c8f2c linter/jest: Implement padding-around-after-all-blocks
(#21034) (Sapphire)
- ac39e51 linter/eslint-vitest-plugin: Prefer importing vitest globals
(#20960) (Said Atrahouch)
- 0b84de1 oxlint: Support allow option for prefer-promise-reject-errors
(#20934) (camc314)
- 23db851 linter/consistent-return: Move rule from nursery to suspicious
(#20920) (camc314)
- 9a27e32 linter/no-unnecessary-type-conversion: Move rule from nursery
to suspicious (#20919) (camc314)
- 1ca7b58 linter/dot-notation: Move rule from nursery to style (#20918)
(camc314)
- 73ba81a linter/consistent-type-exports: Move rule from nursery to
style (#20917) (camc314)
- b9199b1 linter/unicorn: Implement switch-case-break-position (#20872)
(Mikhail Baev)
- 3435ff8 linter: Implements `prefer-snapshot-hint` rule in Jest and
Vitest (#20870) (Said Atrahouch)
- 98510d2 linter: Implement react/prefer-function-component (#19652)
(Connor Shea)
- 871f9d9 linter: Implement no-useless-assignment (#15466) (Zhaoting
Zhou)
- 0f01fbd linter: Implement eslint/object-shorthand (#17688) (yue)

### 🐛 Bug Fixes

- dd2df87 npm: Export package.json for oxlint and oxfmt (#20784) (kazuya
kawaguchi)
- 9bc77dd linter/no-unused-private-class-members: False positive with
await expr (#21067) (camc314)
- 60a57cd linter/const-comparisons: Detect equality contradictions
(#21065) (camc314)
- 2bb2be2 linter/no-array-index-key: False positive when index is passed
as function argument (#21012) (bab)
- 6492953 linter/no-this-in-sfc: Only flag `this` used as member
expression object (#20961) (bab)
- 9446dcc oxlint/lsp: Skip `node_modules` in oxlint config walker
(#21004) (copilot-swe-agent)
- af89923 linter/no-namespace: Support glob pattern matching against
basename (#21031) (bab)
- 64a1a7e oxlint: Don't search for nested config outside base config
(#21051) (Sysix)
- 3b953bc linter/button-has-type: Ignore `document.createElement` calls
(#21008) (Said Atrahouch)
- 8c36070 linter/unicorn: Add support for `Array.from()` for
`prefer-set-size` rule (#21016) (Mikhail Baev)
- c1a48f0 linter: Detect vitest import from vite-plus/test (#20976)
(Said Atrahouch)
- 5c32fd1 lsp: Prevent corrupted autofix output from overlapping text
edits (#19793) (Peter Wagenet)
- ca79960 linter/no-array-index-key: Move span to `key` property
(#20947) (camc314)
- 2098274 linter: Add suggestion for `jest/prefer-equality-matcher`
(#20925) (eryue0220)
- 6eb77ec linter: Allow default-import barrels in import/named (#20757)
(Bazyli Brzóska)
- 9c218ef linter/eslint-vitest-plugin: Remove pending fix status for
require-local-test-context-for-concurrent-snapshot (#20890) (Said
Atrahouch)

### ⚡ Performance

- fb52383 napi/parser, linter/plugins: Clear buffers and source texts
earlier (#21025) (overlookmotel)
- 3b7dec4 napi/parser, linter/plugins: Use `utf8Slice` for decoding
UTF-8 strings (#21022) (overlookmotel)
- 012c924 napi/parser, linter/plugins: Speed up decoding strings in raw
transfer (#21021) (overlookmotel)
- 55e1e9b napi/parser, linter/plugins: Initialize vars as 0 (#21020)
(overlookmotel)
- c25ef02 napi/parser, linter/plugins: Simplify branch condition in
`deserializeStr` (#21019) (overlookmotel)
- 9f494c3 napi/parser, linter/plugins: Raw transfer use
`String.fromCharCode` in string decoding (#21018) (overlookmotel)
- 0503a78 napi/parser, linter/plugins: Faster deserialization of `raw`
fields (#20923) (overlookmotel)
- a24f75e napi/parser: Optimize string deserialization for non-ASCII
sources (#20834) (Joshua Tuddenham)

### 📚 Documentation

- af72b80 oxlint: Fix typo for --tsconfig (#20889) (leaysgur)
- 70c53b1 linter: Highlight that tsconfig is not respected in type aware
linting (#20884) (camc314)
# Oxfmt
### 🚀 Features

- 35cf6e8 oxfmt: Add node version hint for ts config import failures
(#21046) (camc314)

### 🐛 Bug Fixes

- dd2df87 npm: Export package.json for oxlint and oxfmt (#20784) (kazuya
kawaguchi)
- 9d45511 oxfmt: Propagate file write errors instead of panicking
(#20997) (leaysgur)
- 139ddd9 formatter: Handle leading comment after array elision (#20987)
(leaysgur)
- 4216380 oxfmt: Support `.editorconfig` `tab_width` fallback (#20988)
(leaysgur)
- d10df39 formatter: Resolve pending space in fits measurer before
expanded-mode early exit (#20954) (Dunqing)
- f9ef1bd formatter: Avoid breaking after `=>` when arrow body has JSDoc
type cast (#20857) (bab)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-cli Area - CLI A-editor Area - Editor and Language Server A-linter Area - Linter C-bug Category - Bug C-enhancement Category - New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

linter: unused imports are not removed when using no-unused-vars.fix.imports and fixKind=dangerous-fix

3 participants