
As reported [in Discord](https://discord.com/channels/869392257814519848/1106226198494859355/1398470747227426948) C projects with `"` as "brackets" that autoclose, may invoke panics when edited at the end of the file. With a single selection-caret (`ˇ`), at the end of the file, ```c ifndef BAR_H int fn_branch(bool do_branch1, bool do_branch2); ``` gets an LSP response from clangd ```jsonc { "filterText": "AGL/", "insertText": "AGL/", "insertTextFormat": 1, "kind": 17, "label": " AGL/", "labelDetails": {}, "score": 0.78725427389144897, "sortText": "40b67681AGL/", "textEdit": { "newText": "AGL/", "range": { "end": { "character": 11, "line": 8 }, "start": { "character": 10, "line": 8 } } } } ``` which replaces `"` after the caret (character/column 11, 0-indexed). This is reasonable, as regular follow-up (proposed in further completions), is a suffix + a closing `"`: <img width="842" height="259" alt="image" src="https://github.com/user-attachments/assets/ea56f621-7008-4ce2-99ba-87344ddf33d2" /> Yet when Zed handles user input of `"`, it panics due to multiple reasons: * after applying any snippet text edit, Zed did a selection change:5537987630/crates/editor/src/editor.rs (L9539-L9545)
which caused eventual autoclose region invalidation:5537987630/crates/editor/src/editor.rs (L2970)
This covers all cases that insert the `include""` text. * after applying any user input and "plain" text edit, Zed did not invalidate any autoclose regions at all, relying on the "bracket" (which includes `"`) autoclose logic to rule edge cases out * bracket autoclose logic detects previous `"` and considers the new user input as a valid closure, hence no autoclose region needed. But there is an autoclose bracket data after the plaintext completion insertion (`AGL/`) really, and it's not invalidated after `"` handling * in addition to that, `Anchor::is_valid` method in `text` panicked, and required `fn try_fragment_id_for_anchor` to handle "pointing at odd, after the end of the file, offset" cases as `false` A test reproducing the feedback and 2 fixes added: proper, autoclose region invalidation call which required the invalidation logic tweaked a bit, and "superficial", "do not apply bad selections that cause panics" fix in the editor to be more robust Release Notes: - Fixed panic with completion ranges and autoclose regions interop --------- Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
120 lines
3.4 KiB
TOML
120 lines
3.4 KiB
TOML
[package]
|
|
name = "editor"
|
|
version = "0.1.0"
|
|
edition.workspace = true
|
|
publish.workspace = true
|
|
license = "GPL-3.0-or-later"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[lib]
|
|
path = "src/editor.rs"
|
|
doctest = false
|
|
|
|
[features]
|
|
test-support = [
|
|
"text/test-support",
|
|
"language/test-support",
|
|
"gpui/test-support",
|
|
"multi_buffer/test-support",
|
|
"project/test-support",
|
|
"theme/test-support",
|
|
"util/test-support",
|
|
"workspace/test-support",
|
|
"tree-sitter-c",
|
|
"tree-sitter-rust",
|
|
"tree-sitter-typescript",
|
|
"tree-sitter-html",
|
|
"unindent",
|
|
]
|
|
|
|
[dependencies]
|
|
aho-corasick.workspace = true
|
|
anyhow.workspace = true
|
|
assets.workspace = true
|
|
client.workspace = true
|
|
clock.workspace = true
|
|
collections.workspace = true
|
|
convert_case.workspace = true
|
|
dap.workspace = true
|
|
db.workspace = true
|
|
buffer_diff.workspace = true
|
|
emojis.workspace = true
|
|
file_icons.workspace = true
|
|
futures.workspace = true
|
|
fuzzy.workspace = true
|
|
fs.workspace = true
|
|
git.workspace = true
|
|
gpui.workspace = true
|
|
indoc.workspace = true
|
|
inline_completion.workspace = true
|
|
itertools.workspace = true
|
|
language.workspace = true
|
|
linkify.workspace = true
|
|
log.workspace = true
|
|
lsp.workspace = true
|
|
markdown.workspace = true
|
|
menu.workspace = true
|
|
multi_buffer.workspace = true
|
|
ordered-float.workspace = true
|
|
parking_lot.workspace = true
|
|
pretty_assertions.workspace = true
|
|
project.workspace = true
|
|
rand.workspace = true
|
|
regex.workspace = true
|
|
rpc.workspace = true
|
|
schemars.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
settings.workspace = true
|
|
smallvec.workspace = true
|
|
smol.workspace = true
|
|
snippet.workspace = true
|
|
sum_tree.workspace = true
|
|
task.workspace = true
|
|
telemetry.workspace = true
|
|
text.workspace = true
|
|
time.workspace = true
|
|
theme.workspace = true
|
|
tree-sitter-c = { workspace = true, optional = true }
|
|
tree-sitter-html = { workspace = true, optional = true }
|
|
tree-sitter-rust = { workspace = true, optional = true }
|
|
tree-sitter-typescript = { workspace = true, optional = true }
|
|
tree-sitter-python = { workspace = true, optional = true }
|
|
unicode-segmentation.workspace = true
|
|
unicode-script.workspace = true
|
|
unindent = { workspace = true, optional = true }
|
|
ui.workspace = true
|
|
url.workspace = true
|
|
util.workspace = true
|
|
uuid.workspace = true
|
|
workspace.workspace = true
|
|
zed_actions.workspace = true
|
|
workspace-hack.workspace = true
|
|
|
|
[dev-dependencies]
|
|
ctor.workspace = true
|
|
gpui = { workspace = true, features = ["test-support"] }
|
|
language = { workspace = true, features = ["test-support"] }
|
|
languages = {workspace = true, features = ["test-support"] }
|
|
lsp = { workspace = true, features = ["test-support"] }
|
|
markdown = { workspace = true, features = ["test-support"] }
|
|
multi_buffer = { workspace = true, features = ["test-support"] }
|
|
project = { workspace = true, features = ["test-support"] }
|
|
release_channel.workspace = true
|
|
rand.workspace = true
|
|
settings = { workspace = true, features = ["test-support"] }
|
|
tempfile.workspace = true
|
|
text = { workspace = true, features = ["test-support"] }
|
|
theme = { workspace = true, features = ["test-support"] }
|
|
tree-sitter-c.workspace = true
|
|
tree-sitter-html.workspace = true
|
|
tree-sitter-rust.workspace = true
|
|
tree-sitter-typescript.workspace = true
|
|
tree-sitter-yaml.workspace = true
|
|
unindent.workspace = true
|
|
util = { workspace = true, features = ["test-support"] }
|
|
workspace = { workspace = true, features = ["test-support"] }
|
|
http_client = { workspace = true, features = ["test-support"] }
|
|
zlog.workspace = true
|