Skip to content

Comments

feat(oxlint): add --lsp flag to run the language server#15611

Merged
graphite-app[bot] merged 1 commit intomainfrom
11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server
Nov 14, 2025
Merged

feat(oxlint): add --lsp flag to run the language server#15611
graphite-app[bot] merged 1 commit intomainfrom
11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server

Conversation

@Sysix
Copy link
Member

@Sysix Sysix commented Nov 11, 2025

closes #15038 and #12251

This PR adds a --lsp flag to the oxlint command-line tool that starts the language server directly, allowing for a unified binary that can function as both a linter and a language server. This addresses the need for a simpler deployment model where a single oxlint binary can be used in different modes.

@github-actions github-actions bot added A-linter Area - Linter A-cli Area - CLI A-editor Area - Editor and Language Server C-enhancement Category - New feature or request labels Nov 11, 2025
Copy link
Member Author

Sysix commented Nov 11, 2025


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 hot fixes, skip the queue and merge this PR next

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.

@codspeed-hq
Copy link

codspeed-hq bot commented Nov 11, 2025

CodSpeed Performance Report

Merging #15611 will not alter performance

Comparing 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server (1797278) with main (f5d9abb)1

Summary

✅ 37 untouched

Footnotes

  1. No successful run was found on main (765ef31) during the generation of this report, so f5d9abb was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@Sysix Sysix force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch 4 times, most recently from 38b3e94 to 646cf5e Compare November 12, 2025 19:16
@Sysix Sysix requested a review from Copilot November 12, 2025 20:17
Copy link
Contributor

Copilot AI left a comment

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 adds a --lsp flag to the oxlint command-line tool that starts the language server directly, allowing for a unified binary that can function as both a linter and a language server. This addresses the need for a simpler deployment model where a single oxlint binary can be used in different modes.

Key Changes

  • Added --lsp command-line flag to oxlint that starts the language server
  • Refactored VSCode extension tests by separating formatter tests into a dedicated file
  • Added new test configuration to verify the --lsp flag functionality with the VSCode extension

Reviewed Changes

Copilot reviewed 14 out of 15 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
tasks/website/src/linter/snapshots/cli_terminal.snap Updated CLI help text snapshot to include the new --lsp flag
tasks/website/src/linter/snapshots/cli.snap Updated CLI documentation snapshot to include the new --lsp flag
editors/vscode/tests/e2e_server_linter.spec.ts Renamed test suite and removed formatter tests (moved to separate file)
editors/vscode/tests/e2e_server_formatter.spec.ts New file containing formatter tests extracted from the linter test suite
editors/vscode/client/extension.ts Modified to support running oxlint with --lsp flag in test mode
editors/vscode/.vscode-test.mjs Added new test configuration to run tests with oxlint in LSP mode
apps/oxlint/src/run.rs Made lint_impl async and added LSP mode handling
apps/oxlint/src/main.rs Changed main to async and added LSP mode check before normal linting
apps/oxlint/src/lsp.rs New module that implements the language server entry point
apps/oxlint/src/lib.rs Added lsp module and exported run_lsp function in CLI module
apps/oxlint/src/command/lint.rs Added lsp boolean field to LintCommand struct
apps/oxlint/Cargo.toml Added oxc_language_server dependency and tokio features for async support
Cargo.toml Added oxc_language_server workspace member
Cargo.lock Updated with new dependency
.github/workflows/ci_vscode.yml Added step to build oxlint with napi for testing

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

graphite-app bot pushed a commit that referenced this pull request Nov 12, 2025
With #15611 the language server is included in all package including `oxc_linter`.
Removing the feature flag because it is obsolete now.

<img width="1180" height="327" alt="graphic showing very small performance regression" src="https://github.com/user-attachments/assets/129bd94f-0392-41b0-a23f-ec70d174279e" />
@graphite-app graphite-app bot force-pushed the 11-11-refactor_language_server_provided_commands_and_provided_code_action_kinds_for_toolbuilder_ branch from 7adc26c to 5aef593 Compare November 12, 2025 21:30
@graphite-app graphite-app bot force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch from 646cf5e to 92eb5a2 Compare November 12, 2025 21:30
@graphite-app graphite-app bot changed the base branch from 11-11-refactor_language_server_provided_commands_and_provided_code_action_kinds_for_toolbuilder_ to graphite-base/15611 November 12, 2025 21:44
@graphite-app graphite-app bot force-pushed the graphite-base/15611 branch from 5aef593 to e71a6a9 Compare November 12, 2025 21:51
@graphite-app graphite-app bot force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch from 92eb5a2 to 1ae2e35 Compare November 12, 2025 21:51
@graphite-app graphite-app bot changed the base branch from graphite-base/15611 to main November 12, 2025 21:51
@graphite-app graphite-app bot force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch from 1ae2e35 to 9cd0a02 Compare November 12, 2025 21:51
@Sysix Sysix force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch 3 times, most recently from d4b9a9a to 3c16cfa Compare November 13, 2025 20:19
@Sysix Sysix force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch from 3c16cfa to 1797278 Compare November 13, 2025 23:21
@Sysix Sysix marked this pull request as ready for review November 13, 2025 23:26
@Sysix Sysix requested a review from camc314 as a code owner November 13, 2025 23:26
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Nov 14, 2025
Copy link
Contributor

camc314 commented Nov 14, 2025

Merge activity

closes #15038 and #12251

> This PR adds a --lsp flag to the oxlint command-line tool that starts the language server directly, allowing for a unified binary that can function as both a linter and a language server. This addresses the need for a simpler deployment model where a single oxlint binary can be used in different modes.
@graphite-app graphite-app bot force-pushed the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch from 1797278 to e01c551 Compare November 14, 2025 13:15
@graphite-app graphite-app bot merged commit e01c551 into main Nov 14, 2025
24 checks passed
@graphite-app graphite-app bot deleted the 11-11-feat_oxlint_add_--lsp_flag_to_run_the_language_server branch November 14, 2025 13:21
@graphite-app graphite-app bot removed the 0-merge Merge with Graphite Merge Queue label Nov 14, 2025
overlookmotel pushed a commit that referenced this pull request Nov 17, 2025
# Oxlint
### 🚀 Features

- c199e38 linter: Implement config for all tsgolint rules supporting
options (#15659) (camchenry)
- 7598b3e linter: Allow configuring tsgolint rules (#15286) (camchenry)
- e77f2ce vscode: Support `oxlint --lsp` (#15680) (Sysix)
- e01c551 oxlint: Add `--lsp` flag to run the language server (#15611)
(Sysix)
- ac5c2ab lsp/fmt: Support ignore files & patterns (#15647) (Sysix)
- e50a9bf linter: Add unicorn/prefer-response-static-json rule (#15692)
(Mikhail Baev)
- f5d9abb oxlint: Add enabled? column to --rules cli output (#15213)
(Wren)
- 6b5205c linter/plugins: Implement deprecated
`SourceCode#getJSDocComment` method (#15653) (overlookmotel)
- 5eccff1 linter/plugins: Implement deprecated `SourceCode` tokens
methods (#15645) (overlookmotel)
- 4c62ffa language_server: Add `run_server` helper for CLI tools
(#15609) (Sysix)
- 0d52a5e linter/plugins: Implement `Context#parserOptions` getter
(#15632) (overlookmotel)
- 287a538 linter/plugins: Implement `Context#get*` deprecated methods
(#15606) (overlookmotel)
- 84de1ca oxlint,oxfmt: Allow comments and also commas for
vscode-json-ls (#15612) (leaysgur)
- e763919 linter: Add test to enforce schema documentation for rules
with configuration options (#15234) (Connor Shea)
- 6cd0b5f linter/no-callback-in-promise: Add support for `timeoutsErr`
option (#15507) (Li Wei)

### 🐛 Bug Fixes

- 1decd57 linter/no-empty-named-blocks: Only search within node for
comma token (#15751) (camc314)
- 17c3d6d linter: Improve docs, diagnostic message, and implementation
of typescript/consistent-indexed-object-style rule. (#15750)
(connorshea)
- 78a6df2 linter/no-empty-named-blocks: Skip comments when searching for
token (#15735) (camc314)
- 042befd linter/require-await: Skip comments when searching for token
(#15734) (camc314)
- 7a78220 linter/no-async-await: Skip comments when searching for token
(#15733) (camc314)
- 23b9ad1 linter/consistent-type-specifier-style: Skip comments when
searching for token (#15732) (camc314)
- 440a977 ast: Include rest properties when using
`get_binding_identifiers` (#15710) (camc314)
- 516d14e linter/no-namespace: Skip comments when searching for token
(#15716) (camc314)
- b5aaace linter/prefer-namespace-keyword: Skip comments when searching
for token (#15715) (camc314)
- 4eb9fa6 editor: Execute `oxc.path.server` in win32 with shell (#14203)
(Sysix)
- 9f991a4 linter: Reverse extends overrides priority (#14939) (Peter
Wagenet)
- 7c4a916 linter: Restores `oxlint --rules -f=json` functionality.
(#15689) (Wren)
- 24d00f4 linter/plugins: Add types for suggested fixes (#15636)
(overlookmotel)
- 257360f linter/plugins: Fill in TS type def for `RuleMeta` (#15629)
(overlookmotel)
- 81e179c linter: Allow file extensions without a dot in
react/jsx-filename-extension rule (#15574) (Connor Shea)
- 7a0e931 linter: Update the unicorn/prefer-add-event-listener rule with
new JavaScript APIs (#15581) (connorshea)
- bb5f8ca oxlint: Fix type annotation for big-endian (#15561) (Sysix)

### ⚡ Performance

- e2a0997 linter/plugins: Recycle empty visitor object in ESLint compat
mode (#15693) (overlookmotel)
- 7528db4 language_server: Pass file content as a referenced `String`
(#15568) (Sysix)
- 54061e9 linter/plugins: Avoid implicit boolean coercion in `initLines`
(#15641) (overlookmotel)
- ccfd935 language_server: Avoid `Mutex` in `ServerLinter` (#15516)
(Sysix)

### 📚 Documentation

- 3ab750a linter: Clarify react-in-jsx-scope rule docs. (#15749)
(connorshea)
- a5feebc linter: `oxlint-disable` not `eslint-disable` (#15672)
(overlookmotel)
- 3d15805 linter: Reformat doc comments (#15670) (overlookmotel)
- 16fcba6 linter: Remove "experimental" from description of stable
features (#15669) (overlookmotel)
- e62fd98 linter: Correct comment on what `EnablePlugins` does (#15668)
(overlookmotel)
- a25d31e linter: Fix grammar (#15666) (overlookmotel)
- f5f452f linter: Add missing `perf` category (#15667) (overlookmotel)
- 2c58952 linter: Add config docs for no-restricted-globals rule.
(#15662) (connorshea)
- a210b12 linter/plugins: Improve JSDoc comment for `RuleOptionsSchema`
(#15642) (overlookmotel)
- 3aabfac linter/plugins: Alter comments on `FILE_CONTEXT` used in
ESLint-compat `Context` shim (#15605) (overlookmotel)
- fd58aea linter: Fix a typo in the docs for react/no-is-mounted.
(#15575) (Connor Shea)
# Oxfmt
### 🚀 Features

- 84de1ca oxlint,oxfmt: Allow comments and also commas for
vscode-json-ls (#15612) (leaysgur)
- 99823ad oxfmt: Print nothing for default(write) mode (#15583)
(leaysgur)
- 25a0163 formatter/sort_imports: Sort imports by `Array<Array<string>>`
groups (#15578) (leaysgur)

### 🐛 Bug Fixes

- bf20cf5 formatter: `CRLF` issue in the member chain (#15764) (Dunqing)
- 5d688a0 formatter: Measuring multiline text in `fits_text` is
incorrect (#15762) (Dunqing)
- e306958 formatter: Regression case for test call (#15760) (Dunqing)
- c42d983 formatter: Re-fix all cases that fail after
`AstNode::Argument` was removed (#15676) (Dunqing)

### ⚡ Performance

- d99a83f oxfmt: Use simdutf8 based read_to_string (#15614) (leaysgur)
- 128e186 formatter/sort_imports: Precompute import metadata (#15580)
(leaysgur)
- cd31cc1 formatter/sort_imports: Use `Vec::with_capacity` for
`next_elements` (#15579) (leaysgur)

### 📚 Documentation

- 3d15805 linter: Reformat doc comments (#15670) (overlookmotel)

Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
taearls pushed a commit to taearls/oxc that referenced this pull request Dec 11, 2025
# Oxlint
### 🚀 Features

- c199e38 linter: Implement config for all tsgolint rules supporting
options (oxc-project#15659) (camchenry)
- 7598b3e linter: Allow configuring tsgolint rules (oxc-project#15286) (camchenry)
- e77f2ce vscode: Support `oxlint --lsp` (oxc-project#15680) (Sysix)
- e01c551 oxlint: Add `--lsp` flag to run the language server (oxc-project#15611)
(Sysix)
- ac5c2ab lsp/fmt: Support ignore files & patterns (oxc-project#15647) (Sysix)
- e50a9bf linter: Add unicorn/prefer-response-static-json rule (oxc-project#15692)
(Mikhail Baev)
- f5d9abb oxlint: Add enabled? column to --rules cli output (oxc-project#15213)
(Wren)
- 6b5205c linter/plugins: Implement deprecated
`SourceCode#getJSDocComment` method (oxc-project#15653) (overlookmotel)
- 5eccff1 linter/plugins: Implement deprecated `SourceCode` tokens
methods (oxc-project#15645) (overlookmotel)
- 4c62ffa language_server: Add `run_server` helper for CLI tools
(oxc-project#15609) (Sysix)
- 0d52a5e linter/plugins: Implement `Context#parserOptions` getter
(oxc-project#15632) (overlookmotel)
- 287a538 linter/plugins: Implement `Context#get*` deprecated methods
(oxc-project#15606) (overlookmotel)
- 84de1ca oxlint,oxfmt: Allow comments and also commas for
vscode-json-ls (oxc-project#15612) (leaysgur)
- e763919 linter: Add test to enforce schema documentation for rules
with configuration options (oxc-project#15234) (Connor Shea)
- 6cd0b5f linter/no-callback-in-promise: Add support for `timeoutsErr`
option (oxc-project#15507) (Li Wei)

### 🐛 Bug Fixes

- 1decd57 linter/no-empty-named-blocks: Only search within node for
comma token (oxc-project#15751) (camc314)
- 17c3d6d linter: Improve docs, diagnostic message, and implementation
of typescript/consistent-indexed-object-style rule. (oxc-project#15750)
(connorshea)
- 78a6df2 linter/no-empty-named-blocks: Skip comments when searching for
token (oxc-project#15735) (camc314)
- 042befd linter/require-await: Skip comments when searching for token
(oxc-project#15734) (camc314)
- 7a78220 linter/no-async-await: Skip comments when searching for token
(oxc-project#15733) (camc314)
- 23b9ad1 linter/consistent-type-specifier-style: Skip comments when
searching for token (oxc-project#15732) (camc314)
- 440a977 ast: Include rest properties when using
`get_binding_identifiers` (oxc-project#15710) (camc314)
- 516d14e linter/no-namespace: Skip comments when searching for token
(oxc-project#15716) (camc314)
- b5aaace linter/prefer-namespace-keyword: Skip comments when searching
for token (oxc-project#15715) (camc314)
- 4eb9fa6 editor: Execute `oxc.path.server` in win32 with shell (oxc-project#14203)
(Sysix)
- 9f991a4 linter: Reverse extends overrides priority (oxc-project#14939) (Peter
Wagenet)
- 7c4a916 linter: Restores `oxlint --rules -f=json` functionality.
(oxc-project#15689) (Wren)
- 24d00f4 linter/plugins: Add types for suggested fixes (oxc-project#15636)
(overlookmotel)
- 257360f linter/plugins: Fill in TS type def for `RuleMeta` (oxc-project#15629)
(overlookmotel)
- 81e179c linter: Allow file extensions without a dot in
react/jsx-filename-extension rule (oxc-project#15574) (Connor Shea)
- 7a0e931 linter: Update the unicorn/prefer-add-event-listener rule with
new JavaScript APIs (oxc-project#15581) (connorshea)
- bb5f8ca oxlint: Fix type annotation for big-endian (oxc-project#15561) (Sysix)

### ⚡ Performance

- e2a0997 linter/plugins: Recycle empty visitor object in ESLint compat
mode (oxc-project#15693) (overlookmotel)
- 7528db4 language_server: Pass file content as a referenced `String`
(oxc-project#15568) (Sysix)
- 54061e9 linter/plugins: Avoid implicit boolean coercion in `initLines`
(oxc-project#15641) (overlookmotel)
- ccfd935 language_server: Avoid `Mutex` in `ServerLinter` (oxc-project#15516)
(Sysix)

### 📚 Documentation

- 3ab750a linter: Clarify react-in-jsx-scope rule docs. (oxc-project#15749)
(connorshea)
- a5feebc linter: `oxlint-disable` not `eslint-disable` (oxc-project#15672)
(overlookmotel)
- 3d15805 linter: Reformat doc comments (oxc-project#15670) (overlookmotel)
- 16fcba6 linter: Remove "experimental" from description of stable
features (oxc-project#15669) (overlookmotel)
- e62fd98 linter: Correct comment on what `EnablePlugins` does (oxc-project#15668)
(overlookmotel)
- a25d31e linter: Fix grammar (oxc-project#15666) (overlookmotel)
- f5f452f linter: Add missing `perf` category (oxc-project#15667) (overlookmotel)
- 2c58952 linter: Add config docs for no-restricted-globals rule.
(oxc-project#15662) (connorshea)
- a210b12 linter/plugins: Improve JSDoc comment for `RuleOptionsSchema`
(oxc-project#15642) (overlookmotel)
- 3aabfac linter/plugins: Alter comments on `FILE_CONTEXT` used in
ESLint-compat `Context` shim (oxc-project#15605) (overlookmotel)
- fd58aea linter: Fix a typo in the docs for react/no-is-mounted.
(oxc-project#15575) (Connor Shea)
# Oxfmt
### 🚀 Features

- 84de1ca oxlint,oxfmt: Allow comments and also commas for
vscode-json-ls (oxc-project#15612) (leaysgur)
- 99823ad oxfmt: Print nothing for default(write) mode (oxc-project#15583)
(leaysgur)
- 25a0163 formatter/sort_imports: Sort imports by `Array<Array<string>>`
groups (oxc-project#15578) (leaysgur)

### 🐛 Bug Fixes

- bf20cf5 formatter: `CRLF` issue in the member chain (oxc-project#15764) (Dunqing)
- 5d688a0 formatter: Measuring multiline text in `fits_text` is
incorrect (oxc-project#15762) (Dunqing)
- e306958 formatter: Regression case for test call (oxc-project#15760) (Dunqing)
- c42d983 formatter: Re-fix all cases that fail after
`AstNode::Argument` was removed (oxc-project#15676) (Dunqing)

### ⚡ Performance

- d99a83f oxfmt: Use simdutf8 based read_to_string (oxc-project#15614) (leaysgur)
- 128e186 formatter/sort_imports: Precompute import metadata (oxc-project#15580)
(leaysgur)
- cd31cc1 formatter/sort_imports: Use `Vec::with_capacity` for
`next_elements` (oxc-project#15579) (leaysgur)

### 📚 Documentation

- 3d15805 linter: Reformat doc comments (oxc-project#15670) (overlookmotel)

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-enhancement Category - New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants