ZIm/crates/project/src
Smit Barmase 4d79edc753
project: Fix extra } at the end of import on completion accept (#35494)
Closes #34094

Bug in https://github.com/zed-industries/zed/pull/11157

**Context:** 

In https://github.com/zed-industries/zed/pull/31872, we added logic to
avoid re-querying language server completions
(`textDocument/completion`) when possible. This means the list of
`lsp::CompletionItem` objects we have might be stale and not contain
accurate data like `text_edit`, which is only valid for the buffer at
the initial position when these completions were requested. We don't
really care about this because we already extract all the useful data we
need (like insert/replace ranges) into `Completion`, which converts
`text_edit` to anchors. This means further user edits simply push/move
those anchors, and our insert/replace ranges persist for completion
accept.

```jsonc
// on initial textDocument/completion
"textEdit":{"insert":{"start":{"line":2,"character":0},"end":{"line":2,"character":11}},"replace":{"start":{"line":2,"character":0},"end":{"line":2,"character":11}}
```

However, for showing documentation of visible `Completion` items, we
need to call resolve (`completionItem/resolve`) with the existing
`lsp::CompletionItem`, which returns the same `text_edit` and other
existing data along with additional new data that was previously
optional, like `documentation` and `detail`.

**Problem:** 

This new data like `documentation` and `detail` doesn't really change on
buffer edits for a given completion item, so we can use it. But
`text_edit` from this resolved `lsp::CompletionItem` was valid when the
the initial (`textDocument/completion`) was queried but now the
underlying buffer is different. Hence, creating anchors from this ends
up creating them in wrong places.

```jsonc
// calling completionItem/resolve on cached lsp::CompletionItem results into same textEdit, despite buffer edits
"textEdit":{"insert":{"start":{"line":2,"character":0},"end":{"line":2,"character":11}},"replace":{"start":{"line":2,"character":0},"end":{"line":2,"character":11}}
```

It looks like the only reason to override the new text and these ranges
was to handle an edge case with `typescript-language-server`, as
mentioned in the code comment. However, according to the LSP
specification for [Completion
Request](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_completion):

> All other properties (usually sortText, filterText, insertText and
textEdit) must be provided in the textDocument/completion response and
**must not be changed during resolve.**

If any language server responds with different `textEdit`, `insertText`,
etc. in `completionItem/resolve` than in `textDocument/completion`, they
should fix that. Bug in this case in `typescript-language-server`:
https://github.com/typescript-language-server/typescript-language-server/pull/303#discussion_r869102064

We don't really need to override these at all. Keeping the existing
Anchors results in correct replacement.

Release Notes:

- Fixed issue where in some cases there would be an extra `}` at the end
of imports when accepting completions.
2025-08-02 03:42:11 +05:30
..
context_server_store context_server: Change command string field to PathBuf (#34873) 2025-07-22 12:12:07 +02:00
debugger debugger: Send initialized event from fake server at a more realistic time (#35446) 2025-07-31 19:45:02 -04:00
git_store worktree: Improve performance with large # of repositories (#35052) 2025-07-25 13:18:19 +02:00
lsp_command lsp: Complete overloaded signature help implementation (#33199) 2025-07-02 20:51:08 +03:00
lsp_store keymap_ui: Auto complete action arguments (#34785) 2025-07-20 16:24:17 -04:00
manifest_tree lsp: Remove Attach enum, default to Shared behaviour (#35248) 2025-07-29 10:07:36 +00:00
buffer_store.rs Add language server control tool into the status bar (#32490) 2025-06-25 19:57:28 +03:00
color_extractor.rs Simplify static expression to a constant (#23193) 2025-01-15 19:31:21 +00:00
connection_manager.rs Finish removing git repository state and scanning logic from worktrees (#27568) 2025-04-01 17:41:20 -04:00
context_server_store.rs Ensure context servers are spawned in the workspace directory (#35271) 2025-07-29 18:03:43 +02:00
debounced_delay.rs chore: Bump Rust edition to 2024 (#27800) 2025-03-31 20:55:27 +02:00
debugger.rs debugger: Add memory view (#33955) 2025-07-14 16:32:06 +02:00
direnv.rs Fix parsing of direnv export json to support unset of environment variables + better logging (#32559) 2025-06-11 17:57:30 +00:00
environment.rs ACP (#34030) 2025-07-09 16:02:31 +00:00
git_store.rs git: Enable git stash in git panel (#32821) 2025-07-25 23:15:54 +00:00
image_store.rs zlog: Replace usages of env_logger in tests with zlog (#31436) 2025-05-26 11:48:50 -04:00
lsp_command.rs Fix panic with completion ranges and autoclose regions interop (#35408) 2025-07-31 16:18:26 +00:00
lsp_store.rs project: Fix extra } at the end of import on completion accept (#35494) 2025-08-02 03:42:11 +05:30
manifest_tree.rs python: Re-land usage of source file path in toolchain picker (#31893) 2025-06-02 16:29:06 +00:00
prettier_store.rs Fix language settings formatter regression - formatter list can be a single formatter not wrapped in an array (#33721) 2025-07-01 17:47:19 +00:00
project.rs Start separating authentication from connection to collab (#35471) 2025-08-01 17:37:38 +00:00
project_settings.rs context_server: Change command string field to PathBuf (#34873) 2025-07-22 12:12:07 +02:00
project_tests.rs debugger: Fix the JavaScript debug terminal scenario (#33924) 2025-07-05 19:48:55 -04:00
search.rs project: Fix search filter patterns on remote projects (#34748) 2025-07-23 00:18:45 -06:00
search_history.rs debugger: Fix debug console persist to history when reusing a previous item (#34893) 2025-07-22 15:40:11 -04:00
task_inventory.rs debugger: Debug sessions rerun build tasks by default when restarting (#33724) 2025-07-01 15:43:58 -04:00
task_store.rs Add initial package.json scripts task autodetection (#32497) 2025-06-10 22:16:27 +00:00
terminals.rs terminal: Support ~ in cwd field of task definitions (#35097) 2025-07-25 15:39:50 +00:00
toolchain_store.rs debugger: Fix running JS tests when worktree root and package root do not coincide (#32644) 2025-06-13 05:03:07 +00:00
worktree_store.rs windows: Add support for SSH (#29145) 2025-07-08 14:34:57 +00:00
yarn.rs Use read-only access methods for read-only entity operations (#31479) 2025-05-26 23:04:31 -04:00