Skip to content

perf(oxlint/lsp): only invoke lint on code actions when document is not opened#24676

Merged
graphite-app[bot] merged 1 commit into
mainfrom
07-19-perf_oxlint_lsp_only_invoke_lint_on_code_actions_when_document_is_not_opened
Jul 19, 2026
Merged

perf(oxlint/lsp): only invoke lint on code actions when document is not opened#24676
graphite-app[bot] merged 1 commit into
mainfrom
07-19-perf_oxlint_lsp_only_invoke_lint_on_code_actions_when_document_is_not_opened

Conversation

@Sysix

@Sysix Sysix commented Jul 19, 2026

Copy link
Copy Markdown
Member

Some clients can send code actions for documents, which are not opened and already analyzed with a lint process.
A good example is the IntelliJ plugin, which allows the "fix all" code action from the file explorer.

This PR refactors the language-server → tool code-action API to pass a single request struct (including an “is document open” flag), enabling the oxlint LSP linter to avoid re-running lint for code-action requests when the document is already open (and presumably already linted/cached).

This is mostly needed for #23768

@github-actions github-actions Bot added A-linter Area - Linter A-cli Area - CLI A-editor Area - Editor and Language Server labels Jul 19, 2026

Sysix commented Jul 19, 2026

Copy link
Copy Markdown
Member Author

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent changes, fast-track this PR to the front of the merge queue

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR refactors the language-server → tool code-action API to pass a single request struct (including an “is document open” flag), enabling the oxlint LSP linter to avoid re-running lint for code-action requests when the document is already open (and presumably already linted/cached).

Changes:

  • Introduce CodeActionParams (crate-level) and thread it through Backend → WorkspaceWorker → Tool.
  • Add LSPFileSystem::is_open and use it in Backend::code_action to set is_open_document.
  • Update oxlint’s ServerLinter code-action path to conditionally run lint based on is_open_document, and adjust tests/call sites accordingly.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
crates/oxc_language_server/src/worker.rs Update worker API to accept CodeActionParams instead of separate uri/range/context arguments.
crates/oxc_language_server/src/tool.rs Change Tool::get_code_actions_or_commands to accept &CodeActionParams.
crates/oxc_language_server/src/tool_params.rs Add new CodeActionParams struct shared between backend and tools.
crates/oxc_language_server/src/tests.rs Update fake tool implementation to use CodeActionParams.
crates/oxc_language_server/src/lib.rs Export CodeActionParams and register tool_params module.
crates/oxc_language_server/src/file_system.rs Add is_open(&Uri) helper used by backend for open-document detection.
crates/oxc_language_server/src/backend.rs Build and forward tool CodeActionParams including is_open_document.
apps/oxlint/src/lsp/tester.rs Update tester to call linter with CodeActionParams.
apps/oxlint/src/lsp/server_linter.rs Use is_open_document to avoid running lint for invoked code actions when the document is open; update tests/helpers accordingly.

Comment thread crates/oxc_language_server/src/backend.rs
Comment thread apps/oxlint/src/lsp/server_linter.rs
@Sysix
Sysix marked this pull request as ready for review July 19, 2026 16:35
@Sysix
Sysix requested review from camc314 and leaysgur as code owners July 19, 2026 16:35
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Jul 19, 2026

camc314 commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Merge activity

…ot opened (#24676)

Some clients can send code actions for documents, which are not opened and already analyzed with a lint process.
A good example is the IntelliJ plugin, which allows the "fix all" code action from the file explorer.

> This PR refactors the language-server → tool code-action API to pass a single request struct (including an “is document open” flag), enabling the oxlint LSP linter to avoid re-running lint for code-action requests when the document is already open (and presumably already linted/cached).

This is mostly needed for #23768
@graphite-app
graphite-app Bot force-pushed the 07-19-perf_oxlint_lsp_only_invoke_lint_on_code_actions_when_document_is_not_opened branch from a157d1a to 7be5cf0 Compare July 19, 2026 17:16
@graphite-app
graphite-app Bot merged commit 7be5cf0 into main Jul 19, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 19, 2026
@graphite-app
graphite-app Bot deleted the 07-19-perf_oxlint_lsp_only_invoke_lint_on_code_actions_when_document_is_not_opened branch July 19, 2026 17:20
camc314 added a commit that referenced this pull request Jul 21, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 54cc121 ast: [**BREAKING**] Split `MetaProperty` into `ImportMeta` and
`NewTarget` (#24557) (camc314)

### 🚀 Features

- 7b045cd minfier: Drop last break from last switch case (#24673)
(Armano)
- dd18383 linter/node: Implement no-top-level-await rule (#24634)
(Connor Shea)
- 16a65f2 linter/react: Implement function-component-definition rule
(#24471) (Cole Ellison)
- 7f1f585 linter: Reuse `jest/padding-around-test-blocks` for
`vitest/padding-around-test-blocks` (#24519) (Mikhail Baev)
- 99978a8 linter/import/consistent-type-specifier-style: Support
`prefer-top-level-if-only-type-imports` option (#24502) (camc314)

### 🐛 Bug Fixes

- 0184ad6 linter/unicorn/no-useless-undefined: Preserve valid parameter
defaults (#24686) (camc314)
- 8694167 linter/eslint/prefer-destructuring: Handle typed declarations
(#24616) (camc314)
- 477cf0f linter/eslint/no-throw-literal: Handle assigned errors
(#24561) (Cole Ellison)
- ac9200a linter: Detect React components from returned JSX (#24521)
(camc314)
- c0a6522 linter/eslint/no-useless-computed-key: Allow TS syntax in
computed keys (#24524) (Cole Ellison)

### ⚡ Performance

- 346eed1 linter/unicorn/prefer-event-target: Only run on `Class` and
`NewExpression` nodes (#24685) (Mikhail Baev)
- 7be5cf0 oxlint/lsp: Only invoke lint on code actions when document is
not opened (#24676) (Sysix)
- d3f07a0 diagnostics: Box OxcDiagnosticInner to reduce binary size
(#24665) (Boshen)
- 90ae040 linter/reporter/stylish: Compute diagnostic Info once per
diagnostic (#24525) (connorshea)

### 📚 Documentation

- e6f7174 linter/valid-expect: Fix correct example being identical to
incorrect one (#24468) (mkan0141)
# Oxfmt
### 💥 BREAKING CHANGES

- 54cc121 ast: [**BREAKING**] Split `MetaProperty` into `ImportMeta` and
`NewTarget` (#24557) (camc314)

### 🚀 Features

- 3d22307 parser: Add `ParseOptions::enable_ident_hashes` (#24491)
(Boshen)

### 🐛 Bug Fixes

- 6fe866a oxfmt: Keep tailwind classes glued to template expr with
`preserveWhitespace` (#24609) (leaysgur)
- 33e32d8 formatter_css: Use `line_suffix` for EOL line comment (#24580)
(leaysgur)
- 5f76998 formatter_graphql: Keep same line comments pending across
intervening tokens (#24579) (leaysgur)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Co-authored-by: Cameron <cameron.clark@hey.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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants