summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/typst-syntax/src/parser.rs17
-rw-r--r--tests/ref/bugs/2044-invalid-parsed-ident.pngbin0 -> 603 bytes
-rw-r--r--tests/typ/bugs/2044-invalid-parsed-ident.typ6
3 files changed, 15 insertions, 8 deletions
diff --git a/crates/typst-syntax/src/parser.rs b/crates/typst-syntax/src/parser.rs
index 11bb4e8d..1d8875dd 100644
--- a/crates/typst-syntax/src/parser.rs
+++ b/crates/typst-syntax/src/parser.rs
@@ -4,7 +4,7 @@ use std::ops::Range;
use ecow::{eco_format, EcoString};
use unicode_math_class::MathClass;
-use crate::{ast, is_newline, LexMode, Lexer, SyntaxKind, SyntaxNode};
+use crate::{ast, is_ident, is_newline, LexMode, Lexer, SyntaxKind, SyntaxNode};
/// Parse a source file.
#[tracing::instrument(skip_all)]
@@ -258,13 +258,14 @@ fn math_expr_prec(p: &mut Parser, min_prec: usize, stop: SyntaxKind) {
SyntaxKind::MathIdent => {
continuable = true;
p.eat();
- while p.directly_at(SyntaxKind::Text)
- && p.current_text() == "."
- && matches!(
- p.lexer.clone().next(),
- SyntaxKind::MathIdent | SyntaxKind::Text
- )
- {
+ while p.directly_at(SyntaxKind::Text) && p.current_text() == "." && {
+ let mut copy = p.lexer.clone();
+ let start = copy.cursor();
+ let next = copy.next();
+ let end = copy.cursor();
+ matches!(next, SyntaxKind::MathIdent | SyntaxKind::Text)
+ && is_ident(&p.text[start..end])
+ } {
p.convert(SyntaxKind::Dot);
p.convert(SyntaxKind::Ident);
p.wrap(m, SyntaxKind::FieldAccess);
diff --git a/tests/ref/bugs/2044-invalid-parsed-ident.png b/tests/ref/bugs/2044-invalid-parsed-ident.png
new file mode 100644
index 00000000..327150e7
--- /dev/null
+++ b/tests/ref/bugs/2044-invalid-parsed-ident.png
Binary files differ
diff --git a/tests/typ/bugs/2044-invalid-parsed-ident.typ b/tests/typ/bugs/2044-invalid-parsed-ident.typ
new file mode 100644
index 00000000..5e4b560c
--- /dev/null
+++ b/tests/typ/bugs/2044-invalid-parsed-ident.typ
@@ -0,0 +1,6 @@
+// In this bug, the dot at the end was causing the right parenthesis to be
+// parsed as an identifier instead of the closing right parenthesis.
+// Issue: https://github.com/typst/typst/issues/2044
+
+$floor(phi.alt.)$
+$floor(phi.alt. )$