From 0264534928864c7aed0466d670824ac0ce5ca1a8 Mon Sep 17 00:00:00 2001 From: "Said A." <47973576+Daaiid@users.noreply.github.com> Date: Thu, 10 Jul 2025 17:02:23 +0200 Subject: [PATCH] Fix regression in reference autocomplete (#6586) --- crates/typst-ide/src/complete.rs | 45 ++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/crates/typst-ide/src/complete.rs b/crates/typst-ide/src/complete.rs index 0a560eb53..5b6d6fd97 100644 --- a/crates/typst-ide/src/complete.rs +++ b/crates/typst-ide/src/complete.rs @@ -130,7 +130,14 @@ fn complete_markup(ctx: &mut CompletionContext) -> bool { return true; } - // Start of a reference: "@|" or "@he|". + // Start of a reference: "@|". + if ctx.leaf.kind() == SyntaxKind::Text && ctx.before.ends_with("@") { + ctx.from = ctx.cursor; + ctx.label_completions(); + return true; + } + + // An existing reference: "@he|". if ctx.leaf.kind() == SyntaxKind::RefMarker { ctx.from = ctx.leaf.offset() + 1; ctx.label_completions(); @@ -1644,6 +1651,19 @@ mod tests { test_with_doc(world, pos, doc.as_ref()) } + #[track_caller] + fn test_with_addition( + initial_text: &str, + addition: &str, + pos: impl FilePos, + ) -> Response { + let mut world = TestWorld::new(initial_text); + let doc = typst::compile(&world).output.ok(); + let end = world.main.text().len(); + world.main.edit(end..end, addition); + test_with_doc(&world, pos, doc.as_ref()) + } + #[track_caller] fn test_with_doc( world: impl WorldLike, @@ -1709,15 +1729,24 @@ mod tests { .must_exclude(["bib"]); } + #[test] + fn test_autocomplete_ref_function() { + test_with_addition("x", " #ref(<)", -2).must_include(["test"]); + } + + #[test] + fn test_autocomplete_ref_shorthand() { + test_with_addition("x", " @", -1).must_include(["test"]); + } + + #[test] + fn test_autocomplete_ref_shorthand_with_partial_identifier() { + test_with_addition("x", " @te", -1).must_include(["test"]); + } + #[test] fn test_autocomplete_ref_identical_labels_returns_single_completion() { - let mut world = TestWorld::new("x y"); - let doc = typst::compile(&world).output.ok(); - - let end = world.main.text().len(); - world.main.edit(end..end, " @t"); - - let result = test_with_doc(&world, -1, doc.as_ref()); + let result = test_with_addition("x y", " @t", -1); let completions = result.completions(); let label_count = completions.iter().filter(|c| c.kind == CompletionKind::Label).count();