LSP: Add support for custom file extensions#24463
Conversation
MichaReiser
left a comment
There was a problem hiding this comment.
Thanks for looking into this. I think we need the same handling for linting (and possibly other code paths) too.
| .expect("time went backwards") | ||
| .as_nanos(); | ||
| std::env::temp_dir().join(format!("ruff-server-{name}-{nanos}")) | ||
| } |
There was a problem hiding this comment.
You can add tempdir as a dev-only dependency. It's what we use in all other tests.
|
Thanks! I broadened the fix so it isn’t formatting-only anymore. I moved the extension-mapping handling into the shared server request path so it now applies to:
Concretely, I also added coverage for the expanded scope:
Reran:
The branch is updated now. |
|
Good catch, thank you. I removed the The updated shape is:
That makes the control flow explicit and avoids assuming that I pushed that cleanup in
Still green. |
|
Can you confirm that you read our AI policy (https://github.com/astral-sh/.github/blob/main/AI_POLICY.md). I'm asking because I'm getting the impression that I'm chatting with an agent |
|
I hadn't, sorry about that Micha! I did have codex help me clean up my reply so it was clearer. I'm a real person, so happy to clean anything up if you need. |
4e42250 to
1414235
Compare
|
5e70205 to
701b4ad
Compare
Co-authored-by: Micha Reiser <micha@reiser.io>
##### [\`v0.15.10\`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#01510) Released on 2026-04-09. ##### Preview features - \[`flake8-logging`] Allow closures in except handlers (`LOG004`) ([#24464](astral-sh/ruff#24464)) - \[`flake8-self`] Make `SLF` diagnostics robust to non-self-named variables ([#24281](astral-sh/ruff#24281)) - \[`flake8-simplify`] Make the fix for `collapsible-if` safe in `preview` (`SIM102`) ([#24371](astral-sh/ruff#24371)) ##### Bug fixes - Avoid emitting multi-line f-string elements before Python 3.12 ([#24377](astral-sh/ruff#24377)) - Avoid syntax error from `E502` fixes in f-strings and t-strings ([#24410](astral-sh/ruff#24410)) - Strip form feeds from indent passed to `dedent_to` ([#24381](astral-sh/ruff#24381)) - \[`pyupgrade`] Fix panic caused by handling of octals (`UP012`) ([#24390](astral-sh/ruff#24390)) - Reject multi-line f-string elements before Python 3.12 ([#24355](astral-sh/ruff#24355)) ##### Rule changes - \[`ruff`] Treat f-string interpolation as potential side effect (`RUF019`) ([#24426](astral-sh/ruff#24426)) ##### Server - Add support for custom file extensions ([#24463](astral-sh/ruff#24463)) ##### Documentation - Document adding fixes in CONTRIBUTING.md ([#24393](astral-sh/ruff#24393)) - Fix JSON typo in settings example ([#24517](astral-sh/ruff#24517)) ##### Contributors - [@charliermarsh](https://github.com/charliermarsh) - [@dylwil3](https://github.com/dylwil3) - [@silverstein](https://github.com/silverstein) - [@anishgirianish](https://github.com/anishgirianish) - [@shizukushq](https://github.com/shizukushq) - [@zanieb](https://github.com/zanieb) - [@AlexWaygood](https://github.com/AlexWaygood) ##### [\`v0.15.9\`](https://github.com/astral-sh/ruff/blob/HEAD/CHANGELOG.md#0159) Released on 2026-04-02. ##### Preview features - \[`pyflakes`] Flag annotated variable redeclarations as `F811` in preview mode ([#24244](astral-sh/ruff#24244)) - \[`ruff`] Allow dunder-named assignments in non-strict mode for `RUF067` ([#24089](astral-sh/ruff#24089)) ##### Bug fixes - \[`flake8-errmsg`] Avoid shadowing existing `msg` in fix for `EM101` ([#24363](astral-sh/ruff#24363)) - \[`flake8-simplify`] Ignore pre-initialization references in `SIM113` ([#24235](astral-sh/ruff#24235)) - \[`pycodestyle`] Fix `W391` fixes for consecutive empty notebook cells ([#24236](astral-sh/ruff#24236)) - \[`pyupgrade`] Fix `UP008` nested class matching ([#24273](astral-sh/ruff#24273)) - \[`pyupgrade`] Ignore strings with string-only escapes (`UP012`) ([#16058](astral-sh/ruff#16058)) - \[`ruff`] `RUF072`: skip formfeeds on dedent ([#24308](astral-sh/ruff#24308)) - \[`ruff`] Avoid re-using symbol in `RUF024` fix ([#24316](astral-sh/ruff#24316)) - \[`ruff`] Parenthesize expression in `RUF050` fix ([#24234](astral-sh/ruff#24234)) - Disallow starred expressions as values of starred expressions ([#24280](astral-sh/ruff#24280)) ##### Rule changes - \[`flake8-simplify`] Suppress `SIM105` for `except*` before Python 3.12 ([#23869](astral-sh/ruff#23869)) - \[`pyflakes`] Extend `F507` to flag `%`-format strings with zero placeholders ([#24215](astral-sh/ruff#24215)) - \[`pyupgrade`] `UP018` should detect more unnecessarily wrapped literals (UP018) ([#24093](astral-sh/ruff#24093)) - \[`pyupgrade`] Fix `UP008` callable scope handling to support lambdas ([#24274](astral-sh/ruff#24274)) - \[`ruff`] `RUF010`: Mark fix as unsafe when it deletes a comment ([#24270](astral-sh/ruff#24270)) ##### Formatter - Add `nested-string-quote-style` formatting option ([#24312](astral-sh/ruff#24312)) ##### Documentation - \[`flake8-bugbear`] Clarify RUF071 fix safety for non-path string comparisons ([#24149](astral-sh/ruff#24149)) - \[`flake8-type-checking`] Clarify import cycle wording for `TC001`/`TC002`/`TC003` ([#24322](astral-sh/ruff#24322)) ##### Other changes - Avoid rendering fix lines with trailing whitespace after `|` ([#24343](astral-sh/ruff#24343)) ##### Contributors - [@charliermarsh](https://github.com/charliermarsh) - [@MichaReiser](https://github.com/MichaReiser) - [@tranhoangtu-it](https://github.com/tranhoangtu-it) - [@dylwil3](https://github.com/dylwil3) - [@zsol](https://github.com/zsol) - [@renovate](https://github.com/renovate) - [@bitloi](https://github.com/bitloi) - [@danparizher](https://github.com/danparizher) - [@chinar-amrutkar](https://github.com/chinar-amrutkar) - [@second-ed](https://github.com/second-ed) - [@getehen](https://github.com/getehen) - [@Redovo1](https://github.com/Redovo1) - [@matthewlloyd](https://github.com/matthewlloyd) - [@zanieb](https://github.com/zanieb) - [@InSyncWithFoo](https://github.com/InSyncWithFoo) - [@RenzoMXD](https://github.com/RenzoMXD) Renovate-Branch: renovate/2024.6-ruff-0.15.x Change-Id: Id4bd542d4f128b509284d9dcda312f2b39c29964 Priv-Id: 28ebcacdeffa50cec7a52eee59091a75ca5e9539
Summary
Honor the configured extension mapping when handling formatting requests in
ruff server.This fixes a case where a client sends a formatting request for a document whose file extension is mapped via Ruff configuration, e.g.:
For a file like
foo.thing, the CLI already formats correctly as Markdown, butruff serverwas still deriving the source type from the raw file path and treating the document like Python during formatting.Related: astral-sh/ruff-vscode#974
Root cause
The formatting request path was using
query.source_type(), which derives the source type from the virtual file path alone.That bypassed the configured extension mapping already available in
settings.formatter.extension.As a result, a
markdowndocument with a custom mapped extension could be parsed as Python during a formatting request, which leads to warnings like:Changes
settings.formatter.extension.get_source_type(&file_path).extension = { thing = "markdown" }, openstest.thingas a markdown document, and verifies that the formatting request returns edits instead ofNone.Test plan
cargo test -p ruff_server custom_extension_mapped_to_markdowncargo test -p ruff_servercargo fmt --all --checkAI assistance
I used AI assistance for implementation and drafting, then reviewed the patch manually, reproduced the bug through both the VS Code extension path and a direct LSP request to
ruff server, and ran the verification above.