Skip to content

Add textDocument/foldingRange LSP support - #48611

Merged
SomeoneToIgnore merged 2 commits into
mainfrom
kb/lsp-folds
Feb 6, 2026
Merged

Add textDocument/foldingRange LSP support#48611
SomeoneToIgnore merged 2 commits into
mainfrom
kb/lsp-folds

Conversation

@SomeoneToIgnore

@SomeoneToIgnore SomeoneToIgnore commented Feb 6, 2026

Copy link
Copy Markdown
Contributor

Closes #28091

Off in language settings by default: "document_folding_ranges": "off",, when enabled, disables tree-sitter indent-based folding and enables fetching of LSP ones instead.
Falls back to tree-sitter if LSP-based one brings no results.

Release Notes:

  • Added textDocument/foldingRange LSP support, use "document_folding_ranges": "on", language settings to fetch and prefer the LSP folds

@cla-bot cla-bot Bot added the cla-signed The user has signed the Contributor License Agreement label Feb 6, 2026
@zed-community-bot zed-community-bot Bot added the staff Pull requests authored by a current member of Zed staff label Feb 6, 2026
@SomeoneToIgnore SomeoneToIgnore self-assigned this Feb 6, 2026
@SomeoneToIgnore
SomeoneToIgnore force-pushed the kb/lsp-folds branch 2 times, most recently from 4ac4b0d to 3be0dcd Compare February 6, 2026 17:53
@SomeoneToIgnore
SomeoneToIgnore enabled auto-merge (squash) February 6, 2026 17:58
@SomeoneToIgnore
SomeoneToIgnore enabled auto-merge (squash) February 6, 2026 17:59
@SomeoneToIgnore
SomeoneToIgnore merged commit 6c253a7 into main Feb 6, 2026
28 checks passed
@SomeoneToIgnore
SomeoneToIgnore deleted the kb/lsp-folds branch February 6, 2026 18:06
@xdBronch

xdBronch commented Feb 6, 2026

Copy link
Copy Markdown
Contributor

do you have any plans to support the collapsedText field? i saw your comment on the old PR, how difficult do you think it would be?

@SomeoneToIgnore

Copy link
Copy Markdown
Contributor Author

I would not mind tackling it with some help — do you have any way to reproduce this scenario?

@xdBronch

xdBronch commented Feb 6, 2026

Copy link
Copy Markdown
Contributor

unfortunately im not aware of any servers that actually send collapsedText currently, probably because not even vscode supports it afaik 😬. rust-analyzer has an open pr that uses it and i have a patch locally for ZLS, would either of those be ok for testing?

@SomeoneToIgnore

Copy link
Copy Markdown
Contributor Author

Such an odd request for a feature you have no use case for...

Anyway, I have a PR, as seems that's not too hard to try and implement: #48624
Yet I have not tried to set up the real test env to verify it.

@xdBronch

xdBronch commented Feb 6, 2026

Copy link
Copy Markdown
Contributor

Such an odd request for a feature you have no use case for...

sorry if it was rude to ask for when almost nothing has support, I'd like to see it used by more servers and I'm hoping that editors implementing it will help adoption. Thank you for working on this, I can test out your pr soon. I'll upstream my ZLS patch if that helps my case of wanting this 😄

SomeoneToIgnore added a commit that referenced this pull request Feb 6, 2026
Follow-up of #48611

Release Notes:

- N/A
SomeoneToIgnore added a commit that referenced this pull request Feb 6, 2026
SomeoneToIgnore added a commit that referenced this pull request Feb 8, 2026
Follow-up of #48611

Release Notes:

- N/A
SomeoneToIgnore added a commit that referenced this pull request Feb 13, 2026
Follow-up of #48611

Despite Zed not declaring such support in its capabilities,


https://github.com/zed-industries/zed/blob/a0eb63d1affb6e7b7991e477c7e05824d0250255/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"
src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly
github-actions Bot pushed a commit that referenced this pull request Feb 13, 2026
Follow-up of #48611

Despite Zed not declaring such support in its capabilities,


https://github.com/zed-industries/zed/blob/a0eb63d1affb6e7b7991e477c7e05824d0250255/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"
src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly
zed-zippy Bot added a commit that referenced this pull request Feb 14, 2026
Cherry-pick of #49151 to preview

----
Follow-up of #48611

Despite Zed not declaring such support in its capabilities,



https://github.com/zed-industries/zed/blob/a0eb63d1affb6e7b7991e477c7e05824d0250255/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"

src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:

https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly

Co-authored-by: Kirill Bulatov <kirill@zed.dev>
@injust

injust commented Feb 14, 2026

Copy link
Copy Markdown
Contributor

@SomeoneToIgnore Heads up that the release notes say lsp_folding_ranges when the setting is actually named document_folding_ranges.

naaiyy added a commit to Glass-HQ/Glass that referenced this pull request Feb 16, 2026
Key changes:
- LSP folding ranges support (zed-industries#48611) - textDocument/foldingRange with custom fold text
- LSP refactoring (zed-industries#48604) - extracted document_colors, code_lens, folding_ranges into modules
- Crate graph restructuring (zed-industries#48602) - terminal moved closer to editor
- Side-by-side diff searching (zed-industries#48539) and OpenExcerpts for LHS (zed-industries#48438)
- SplittableEditor: sync custom blocks between RHS/LHS (zed-industries#48575)
- Thinking effort for Zed/OpenAI providers (zed-industries#48545, zed-industries#48605)
- Agent default_model.enable_thinking setting (zed-industries#48536)
- Configurable LSP timeout setting (zed-industries#44745)
- PaneSearchBarCallbacks global (search bar setup extracted from vim)
- Settings migrations for nested platform/channel/profile keys (zed-industries#48550)
- Shell parser: I/O redirects, here-documents, compound commands (zed-industries#48635)
- Hardened tool authorization: sensitive settings, deferred ops (zed-industries#48641)
- rm security bypass fixes (zed-industries#48640, zed-industries#48647)
- MCP tool name parsing fix: newline delimiter (zed-industries#48636)
- Canonicalize --user-data-dir path (zed-industries#48470)
- Fix text_threads_dir XDG spec compliance (zed-industries#45771)
- Buffer font for folds (zed-industries#48652)
- Multibuffer toolbar layout shift fix (zed-industries#48472)
- Editor: tabs bitmask syncing (zed-industries#48366)

Conflict resolution:
- collab tests: deleted (collab removed)
- util/archive.rs, util/shell.rs: deleted (extracted to Obsydian)
- copilot_ui/sign_in.rs: kept native_button style
- editor_tests.rs: merged imports (kept MoveItemToPaneInDirection, added ViewId/FollowEvent)
- lsp_store.rs: took upstream refactored imports, added FoldingRangeData, removed collab imports
- main.rs: added PaneSearchBarCallbacks, removed vim::init

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
rtfeldman pushed a commit that referenced this pull request Feb 17, 2026
Follow-up of #48611

Despite Zed not declaring such support in its capabilities,


https://github.com/zed-industries/zed/blob/a0eb63d1affb6e7b7991e477c7e05824d0250255/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"
src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly
@anilzeybek

Copy link
Copy Markdown
Contributor

While this setting works as expected for local projects, it doesn't seem to apply to my remote projects.

jasonsmithio pushed a commit to paddleboarddev/paddleboard that referenced this pull request May 31, 2026
jasonsmithio pushed a commit to paddleboarddev/paddleboard that referenced this pull request May 31, 2026
jasonsmithio pushed a commit to paddleboarddev/paddleboard that referenced this pull request May 31, 2026
jasonsmithio pushed a commit to paddleboarddev/paddleboard that referenced this pull request May 31, 2026
Follow-up of zed-industries/zed#48611

Despite Zed not declaring such support in its capabilities,


https://github.com/zed-industries/zed/blob/219b612f63da6698b321e3b741d46954b566eb37/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"
src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
Closes zed-industries#28091

Off in language settings by default: ` "lsp_folding_ranges": "off",`,
when enabled, disables tree-sitter indent-based folding and enables
fetching of LSP ones instead.
Falls back to tree-sitter if LSP-based one brings no results.

Release Notes:

- Added `textDocument/foldingRange` LSP support, use `
"lsp_folding_ranges": "on",` language settings to fetch and prefer the
LSP folds
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
jonx pushed a commit to jonx/zed-aros that referenced this pull request Jul 17, 2026
Follow-up of zed-industries#48611

Despite Zed not declaring such support in its capabilities,


https://github.com/zed-industries/zed/blob/a0eb63d1affb6e7b7991e477c7e05824d0250255/crates/lsp/src/lsp.rs#L1010-L1016

`json-language-server` returns `object` as a folding range kind:

<img width="1728" height="720" alt="bad"
src="https://github.com/user-attachments/assets/ee574879-8657-41c8-ab12-562f3882f057"
/>

The spec, even 3.18, does not really seem to allow it explicitly:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#foldingRangeKind

but mentions that the real type

> The type is a string since the value set is extensible

The PR adds a capture enum variant for such cases, to get the folds in
instead of failing on deserialization.

See also: zed-industries/lsp-types#10

Release Notes:

- Fixed `json-language-server` document folds not being parsed correctly
jolutz pushed a commit to jolutz/zed that referenced this pull request Aug 8, 2026
Closes zed-industries#28091

Off in language settings by default: ` "lsp_folding_ranges": "off",`,
when enabled, disables tree-sitter indent-based folding and enables
fetching of LSP ones instead.
Falls back to tree-sitter if LSP-based one brings no results.

Release Notes:

- Added `textDocument/foldingRange` LSP support, use `
"lsp_folding_ranges": "on",` language settings to fetch and prefer the
LSP folds
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed The user has signed the Contributor License Agreement staff Pull requests authored by a current member of Zed staff

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support textDocument/foldingRange for LSP

4 participants