summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortingerrr <me@tinger.dev>2024-09-02 14:45:50 +0200
committerGitHub <noreply@github.com>2024-09-02 12:45:50 +0000
commit799eb8004eeafd758ed53c79c4e1ce34afb268dd (patch)
tree8744b8eedf9edba27bb876d6b019c42dc941d8f9
parent39b47060ccb214290d49d9767372231877e2921f (diff)
Improve unknown variable diagnostics (#4858)
-rw-r--r--crates/typst/src/foundations/scope.rs28
-rw-r--r--tests/suite/math/call.typ5
-rw-r--r--tests/suite/scripting/ops.typ4
3 files changed, 31 insertions, 6 deletions
diff --git a/crates/typst/src/foundations/scope.rs b/crates/typst/src/foundations/scope.rs
index b118540e..b64c478c 100644
--- a/crates/typst/src/foundations/scope.rs
+++ b/crates/typst/src/foundations/scope.rs
@@ -73,7 +73,12 @@ impl<'a> Scopes<'a> {
None => None,
})
})
- .ok_or_else(|| unknown_variable(var))
+ .ok_or_else(|| {
+ unknown_variable_math(
+ var,
+ self.base.is_some_and(|base| base.global.scope().get(var).is_some()),
+ )
+ })
}
/// Try to access a variable mutably.
@@ -109,13 +114,28 @@ fn cannot_mutate_constant(var: &str) -> HintedString {
fn unknown_variable(var: &str) -> HintedString {
let mut res = HintedString::new(eco_format!("unknown variable: {}", var));
+ if var.contains('-') {
+ res.hint(eco_format!(
+ "if you meant to use subtraction, try adding spaces around the minus sign{}: `{}`",
+ if var.matches('-').count() > 1 { "s" } else { "" },
+ var.replace('-', " - ")
+ ));
+ }
+
+ res
+}
+
+#[cold]
+fn unknown_variable_math(var: &str, in_global: bool) -> HintedString {
+ let mut res = HintedString::new(eco_format!("unknown variable: {}", var));
+
if matches!(var, "none" | "auto" | "false" | "true") {
res.hint(eco_format!(
- "if you meant to use a literal, try adding a hash before it"
+ "if you meant to use a literal, try adding a hash before it: `#{var}`",
));
- } else if var.contains('-') {
+ } else if in_global {
res.hint(eco_format!(
- "if you meant to use subtraction, try adding spaces around the minus sign",
+ "`{var}` is not available directly in math, try adding a hash before it: `#{var}`",
));
}
diff --git a/tests/suite/math/call.typ b/tests/suite/math/call.typ
index 9eef1613..03747f58 100644
--- a/tests/suite/math/call.typ
+++ b/tests/suite/math/call.typ
@@ -95,3 +95,8 @@ $ mat(
,1, ;
, ,1;
) $
+
+--- issue-2885-math-var-only-in-global ---
+// Error: 7-10 unknown variable: rgb
+// Hint: 7-10 `rgb` is not available directly in math, try adding a hash before it: `#rgb`
+$text(rgb(0, 0, 0), "foo")$
diff --git a/tests/suite/scripting/ops.typ b/tests/suite/scripting/ops.typ
index 1c957217..e0c94e02 100644
--- a/tests/suite/scripting/ops.typ
+++ b/tests/suite/scripting/ops.typ
@@ -414,7 +414,7 @@
--- ops-assign-unknown-var-lhs ---
#{
// Error: 3-6 unknown variable: a-1
- // Hint: 3-6 if you meant to use subtraction, try adding spaces around the minus sign
+ // Hint: 3-6 if you meant to use subtraction, try adding spaces around the minus sign: `a - 1`
a-1 = 2
}
@@ -425,7 +425,7 @@
a = a -1
// Error: 7-10 unknown variable: a-1
- // Hint: 7-10 if you meant to use subtraction, try adding spaces around the minus sign
+ // Hint: 7-10 if you meant to use subtraction, try adding spaces around the minus sign: `a - 1`
a = a-1
}