summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-02-11 11:30:30 +0100
committerGitHub <noreply@github.com>2025-02-11 10:30:30 +0000
commita0cd89b478437e53ece754a901ccfc035b4f2acf (patch)
tree956feb0c8ddd08607fc39fc2d61d1340e3f0181e /crates
parent81021fa1a277b04e8726d82fdf8f5fe11aeacab6 (diff)
Fix autocomplete and jumps in math (#5849)
Diffstat (limited to 'crates')
-rw-r--r--crates/typst-ide/src/complete.rs17
-rw-r--r--crates/typst-ide/src/jump.rs17
2 files changed, 30 insertions, 4 deletions
diff --git a/crates/typst-ide/src/complete.rs b/crates/typst-ide/src/complete.rs
index 7df788dc..564b97bd 100644
--- a/crates/typst-ide/src/complete.rs
+++ b/crates/typst-ide/src/complete.rs
@@ -306,7 +306,10 @@ fn complete_math(ctx: &mut CompletionContext) -> bool {
}
// Behind existing atom or identifier: "$a|$" or "$abc|$".
- if matches!(ctx.leaf.kind(), SyntaxKind::Text | SyntaxKind::MathIdent) {
+ if matches!(
+ ctx.leaf.kind(),
+ SyntaxKind::Text | SyntaxKind::MathText | SyntaxKind::MathIdent
+ ) {
ctx.from = ctx.leaf.offset();
math_completions(ctx);
return true;
@@ -358,7 +361,7 @@ fn complete_field_accesses(ctx: &mut CompletionContext) -> bool {
// Behind an expression plus dot: "emoji.|".
if_chain! {
if ctx.leaf.kind() == SyntaxKind::Dot
- || (ctx.leaf.kind() == SyntaxKind::Text
+ || (matches!(ctx.leaf.kind(), SyntaxKind::Text | SyntaxKind::MathText)
&& ctx.leaf.text() == ".");
if ctx.leaf.range().end == ctx.cursor;
if let Some(prev) = ctx.leaf.prev_sibling();
@@ -1768,4 +1771,14 @@ mod tests {
test("#show outline.entry: it => it.\n#outline()\n= Hi", 30)
.must_include(["indented", "body", "page"]);
}
+
+ #[test]
+ fn test_autocomplete_symbol_variants() {
+ test("#sym.arrow.", -1)
+ .must_include(["r", "dashed"])
+ .must_exclude(["cases"]);
+ test("$ arrow. $", -3)
+ .must_include(["r", "dashed"])
+ .must_exclude(["cases"]);
+ }
}
diff --git a/crates/typst-ide/src/jump.rs b/crates/typst-ide/src/jump.rs
index ed74df22..42833542 100644
--- a/crates/typst-ide/src/jump.rs
+++ b/crates/typst-ide/src/jump.rs
@@ -73,7 +73,10 @@ pub fn jump_from_click(
let Some(id) = span.id() else { continue };
let source = world.source(id).ok()?;
let node = source.find(span)?;
- let pos = if node.kind() == SyntaxKind::Text {
+ let pos = if matches!(
+ node.kind(),
+ SyntaxKind::Text | SyntaxKind::MathText
+ ) {
let range = node.range();
let mut offset = range.start + usize::from(span_offset);
if (click.x - pos.x) > width / 2.0 {
@@ -115,7 +118,7 @@ pub fn jump_from_cursor(
cursor: usize,
) -> Vec<Position> {
fn is_text(node: &LinkedNode) -> bool {
- node.get().kind() == SyntaxKind::Text
+ matches!(node.kind(), SyntaxKind::Text | SyntaxKind::MathText)
}
let root = LinkedNode::new(source.root());
@@ -262,6 +265,11 @@ mod tests {
}
#[test]
+ fn test_jump_from_click_math() {
+ test_click("$a + b$", point(28.0, 14.0), cursor(5));
+ }
+
+ #[test]
fn test_jump_from_cursor() {
let s = "*Hello* #box[ABC] World";
test_cursor(s, 12, None);
@@ -269,6 +277,11 @@ mod tests {
}
#[test]
+ fn test_jump_from_cursor_math() {
+ test_cursor("$a + b$", -3, pos(1, 27.51, 16.83));
+ }
+
+ #[test]
fn test_backlink() {
let s = "#footnote[Hi]";
test_click(s, point(10.0, 10.0), pos(1, 18.5, 37.1).map(Jump::Position));