Compare commits

...

10 Commits

Author SHA1 Message Date
T0mstone
22b7af6795
Merge 01f73c35ed279d26678fe9c991ef55a0e44a1b76 into 36ecbb2c8dccc1a31c43fee1466f1425844d8607 2025-07-08 10:54:49 +08:00
Robin
36ecbb2c8d
Refer to json function instead of deprecated json.decode in groups docs (#6552) 2025-07-07 14:15:32 +00:00
Robin
51ab5b815c
Fix minor typo in function docs (#6542) 2025-07-07 14:15:10 +00:00
T0mstone
01f73c35ed Fix test spans for real
Haste is the enemy of correctness
2025-06-11 16:42:00 +02:00
T0mstone
fb0b01d45c Fix test spans 2025-06-11 16:37:03 +02:00
T0mstone
801b689dae Apply suggestions
Co-authored-by: Laurenz <laurmaedje@gmail.com>
2025-06-11 16:33:26 +02:00
T0mstone
d799a4207b Change test fix to empty content 2025-06-11 14:36:09 +02:00
T0mstone
72c219d24a Suppress warning in tests 2025-06-11 14:26:23 +02:00
T0mstone
ea3ca30a65 Merge branch 'main' into warn-last-show 2025-06-11 14:16:42 +02:00
T0mstone
a517a08d2f Warn on last show/set rule in block 2025-03-22 22:31:51 +01:00
6 changed files with 38 additions and 3 deletions

View File

@ -7,6 +7,7 @@ use typst_library::foundations::{
}; };
use typst_library::introspection::{Counter, State}; use typst_library::introspection::{Counter, State};
use typst_syntax::ast::{self, AstNode}; use typst_syntax::ast::{self, AstNode};
use typst_syntax::Span;
use typst_utils::singleton; use typst_utils::singleton;
use crate::{CapturesVisitor, Eval, FlowEvent, Vm}; use crate::{CapturesVisitor, Eval, FlowEvent, Vm};
@ -284,8 +285,19 @@ impl Eval for ast::CodeBlock<'_> {
type Output = Value; type Output = Value;
fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> { fn eval(self, vm: &mut Vm) -> SourceResult<Self::Output> {
let body = self.body();
match body.exprs().next_back() {
Some(expr @ ast::Expr::ShowRule(_)) => {
warn_for_useless_rule(&mut vm.engine, expr.span(), "show")
}
Some(expr @ ast::Expr::SetRule(_)) => {
warn_for_useless_rule(&mut vm.engine, expr.span(), "set")
}
_ => {}
}
vm.scopes.enter(); vm.scopes.enter();
let output = self.body().eval(vm)?; let output = body.eval(vm)?;
vm.scopes.exit(); vm.scopes.exit();
Ok(output) Ok(output)
} }
@ -393,3 +405,12 @@ fn warn_for_discarded_content(engine: &mut Engine, event: &FlowEvent, joined: &V
engine.sink.warn(warning); engine.sink.warn(warning);
} }
/// Emits a warning when a set or show rule has no effect.
fn warn_for_useless_rule(engine: &mut Engine, span: Span, kind: &str) {
engine.sink.warn(warning!(
span,
"{kind} rule has no effect";
hint: "a {kind} rule is only in effect until the end of the surrounding code block"
));
}

View File

@ -20,7 +20,7 @@ use crate::foundations::{
/// ///
/// You can call a function by writing a comma-separated list of function /// You can call a function by writing a comma-separated list of function
/// _arguments_ enclosed in parentheses directly after the function name. /// _arguments_ enclosed in parentheses directly after the function name.
/// Additionally, you can pass any number of trailing content blocks arguments /// Additionally, you can pass any number of trailing content block arguments
/// to a function _after_ the normal argument list. If the normal argument list /// to a function _after_ the normal argument list. If the normal argument list
/// would become empty, it can be omitted. Typst supports positional and named /// would become empty, it can be omitted. Typst supports positional and named
/// arguments. The former are identified by position and type, while the latter /// arguments. The former are identified by position and type, while the latter

View File

@ -205,7 +205,7 @@
single or double quotes. single or double quotes.
The value is always of type [string]($str). More complex data The value is always of type [string]($str). More complex data
may be parsed manually using functions like [`json.decode`]($json.decode). may be parsed manually using functions like [`json`]($json).
- name: sym - name: sym
title: General title: General

View File

@ -48,4 +48,5 @@
let n = query(<a>).len() let n = query(<a>).len()
let fonts = ("nope", "Roboto") let fonts = ("nope", "Roboto")
set text(font: fonts.at(n)) set text(font: fonts.at(n))
[]
} }

View File

@ -51,4 +51,5 @@ Hello
#context { #context {
set document(author: "Changed") if "Normal" in document.author set document(author: "Changed") if "Normal" in document.author
set document(title: "Changed") if document.title == "Normal" set document(title: "Changed") if document.title == "Normal"
[]
} }

View File

@ -0,0 +1,12 @@
--- warn-show-set-last-in-block ---
#{
// Warning: 3-16 show rule has no effect
// Hint: 3-16 a show rule is only in effect until the end of the surrounding code block
show "a": "b"
}
#{
// Warning: 3-17 set rule has no effect
// Hint: 3-17 a set rule is only in effect until the end of the surrounding code block
set text(blue)
}