feat(oxfmt/lsp): support untitled:// schema#19287
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via 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. |
f04a325 to
10b4f0b
Compare
c51ddcb to
a9b1aca
Compare
10b4f0b to
3e478df
Compare
run_format to format_in_memory and format_fileuntitled:// schema
a9b1aca to
10b8c79
Compare
3e478df to
6d8842d
Compare
10b8c79 to
bfe263c
Compare
0554ae2 to
2b3f78d
Compare
2b3f78d to
100f135
Compare
leaysgur
left a comment
There was a problem hiding this comment.
Instead of duplicating the strategy/options mapping from LanguageId (the large match blocks in mod.rs)..., you could generate a fake path from the language ID (e.g. "untitled.tsx" for "typescriptreact") and feed it into the existing FormatFileStrategy::try_from(path) + config_resolver.resolve(&strategy) pipeline.
This would eliminate many lines with keeping support.rs as the single source of truth.
And for the fake path, it would be better to use {workspace_root}/untitled.{ext} rather than just untitled.{ext}.
There is a FormatFileStrategy::resolve_relative_path() (which may be needed to tailwind plugin work correctly).
It isn't called in the LSP path, but LSP already using absolute path, so that's not a concern though.
But config_resolver.resolve() and the external formatter's options.filepath both use the path — a workspace-rooted path ensures editorconfig/oxfmtrc overrides and Prettier plugin config resolution work
correctly.
This will be a problem because there is no real path. We do not know to which config is really should resolve. This why I did go with the "default" way :) |
bfe263c to
e4fa5ef
Compare
100f135 to
b54b409
Compare
Merging this PR will not alter performance
Comparing Footnotes
|
13b0123 to
30e4e0c
Compare
0000f48 to
293cc7c
Compare
There was a problem hiding this comment.
Pull request overview
This PR adds support for formatting unsaved documents using the untitled:// URI scheme in the oxfmt LSP server. This enables VS Code and other LSP clients to format in-memory documents that haven't been saved to disk yet.
Changes:
- Added
inner()method toLanguageIdfor accessing the underlying string value - Implemented in-memory formatting for
untitled://URIs using language ID to determine format strategy - Refactored test utilities to support both file-based and in-memory formatting tests
- Added comprehensive test coverage for unsaved documents across multiple file types
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
crates/oxc_language_server/src/language_id.rs |
Added inner() accessor method to expose the underlying language ID string |
apps/oxfmt/src/lsp/mod.rs |
Added language ID conversion functions to map language IDs to file extensions, parser names, and format strategies |
apps/oxfmt/src/lsp/server_formatter.rs |
Split formatting logic into format_file() and format_in_memory() methods to handle both file-based and untitled URIs |
apps/oxfmt/test/lsp/utils.ts |
Extracted formatFixtureContent() function to support testing with custom URIs |
apps/oxfmt/test/lsp/format/format.test.ts |
Added test suite for unsaved documents covering TypeScript, JSON, Vue, TOML, and plaintext files |
apps/oxfmt/test/lsp/format/__snapshots__/format.test.ts.snap |
Added expected output snapshots for all unsaved document test cases |
293cc7c to
ce9f087
Compare
e4fa5ef to
001e002
Compare
ce9f087 to
46a0b1a
Compare
001e002 to
5d5aa58
Compare
46a0b1a to
85e51f8
Compare
Merge activity
|
related oxc-project/oxc-vscode#25 > This PR adds support for formatting unsaved documents using the untitled:// URI scheme in the oxfmt LSP server. This enables VS Code and other LSP clients to format in-memory documents that haven't been saved to disk yet. Angular is not supported for the moment, could not find a VS Code extension which defines a language ID for it :/
5d5aa58 to
0eb9a2d
Compare
85e51f8 to
652c346
Compare
related oxc-project/oxc-vscode#25 > This PR adds support for formatting unsaved documents using the untitled:// URI scheme in the oxfmt LSP server. This enables VS Code and other LSP clients to format in-memory documents that haven't been saved to disk yet. Angular is not supported for the moment, could not find a VS Code extension which defines a language ID for it :/
# Oxlint ### 💥 BREAKING CHANGES - 4315594 oxlint: [**BREAKING**] Deprecate `"always"` and `"as-needed"` options of the radix rule (#19408) (Sysix) - d4c7af3 linter: [**BREAKING**] Remove `allowRuleToRunWithoutStrictNullChecksIKnowWhatIAmDoing` option (#19451) (camc314) ### 🚀 Features - 82ca5c3 linter: Add typescript/dot-notation rule (#19442) (camc314) - 6db0811 linter: Implement eslint-plugin-vitest/no-importing-vitest-globals (#18694) (Said Atrahouch) - c7fe8ae linter: Implement eslint-plugin-vitest/prefer-import-in-mock (#17966) (Said Atrahouch) - 0abb39a linter: Implement eslint-vitest-jest-plugin/prefer-mock-return-shorthand (#18002) (Said Atrahouch) - 2b95537 linter: Implement `n/no-path-concat` rule (#19502) (Mikhail Baev) - 735d0e4 linter: Implement typescript/no-useless-default-assignment (#19488) (camc314) - 31c3a93 linter: Add typescript/no-unnecessary-type-parameters rule (#19450) (camc314) - c948090 linter: Add typescript/consistent-return rule (#19449) (camc314) - 9f87df0 linter: Add typescript/prefer-string-starts-ends-with rule (#19448) (camc314) - 04536be linter: Add typescript/prefer-regexp-exec rule (#19447) (camc314) - 56a7feb linter: Add typescript/prefer-readonly rule (#19446) (camc314) - a1cea63 linter: Add typescript/no-unnecessary-qualifier rule (#19445) (camc314) - e3144d2 linter: Add typescript/prefer-find rule (#19444) (camc314) - 13c7408 linter: Add typescript/prefer-readonly-parameter-types rule (#19443) (camc314) - 9b17d44 linter: Add typescript/strict-void-return rule (#19441) (camc314) - ed821b4 linter: Add typescript/consistent-type-exports rule (#19440) (camc314) ### 🐛 Bug Fixes - daad7bc linter/array-callback-return: Check `allowVoid` option (#19506) (Said Atrahouch) - 638cf94 linter: Add help text to eslint rule diagnostics (#19508) (Kyle Tse) - 79fc6d7 linter: Move no-use-before-define to eslint plugin (#19438) (camc314) - c832a9f linter: Add `onScrollEnd` and `onScrollEndCapture` to `react/no-unknown-property`. (#19536) (connorshea) - 999a0db linter: Add help text to `symbol-description` diagnostics (#19538) (Anthony Amaro) - f064482 linter: Add help text to eslint rule diagnostics (#19539) (Anthony Amaro) - fd11073 linter/react/no-unknown-property: Add missing `fetchPriority` prop (#19525) (João Pedro Schmitz) - a9bb604 linter/no-shadow: Align initializer shadow handling with typescript-eslint (#19462) (camc314) - 32e6eb9 linter: Handle typed arrays/array buffers in `prefer-spread` rule. (#19478) (connorshea) - e309f84 linter: Handle additional cases in `typescript/consistent-generic-constructors` rule. (#19477) (connorshea) - 71db91a linter/array-callback-return: Check `fromAsync`, update test cases (#19483) (Said Atrahouch) - 2a12d74 linter: Handle optional chaining in `no-array-method-this-argument` rule. (#19476) (connorshea) - f65310b linter: Handle optional chaining in `prefer-object-from-entries` rule. (#19475) (connorshea) - 840acf4 linter: Handle optional chain in `no-unnecessary-array-flat-depth` rule. (#19471) (connorshea) - 85a19e9 linter: Skip string literal imports in `consistent-assert` rule. (#19474) (connorshea) ### ⚡ Performance - 6155ac4 linter/constructor-super: Use node_id over nodes loop (#19489) (camc314) - a02496d linter/consistent-index-object-style: Resolve circular type refs semantically (#19490) (camc314) # Oxfmt ### 🚀 Features - 652c346 oxfmt/lsp: Support `untitled://` schema (#19287) (Sysix) ### 🐛 Bug Fixes - 6c61b70 oxfmt: Fix outdated `sortImports.groups` doc comments (#19513) (leaysgur) Co-authored-by: camc314 <[email protected]>

related oxc-project/oxc-vscode#25
Angular is not supported for the moment, could not find a VS Code extension which defines a language ID for it :/