diff --git a/crates/typst-eval/src/code.rs b/crates/typst-eval/src/code.rs index 9078418e4..f42c9d730 100644 --- a/crates/typst-eval/src/code.rs +++ b/crates/typst-eval/src/code.rs @@ -7,6 +7,7 @@ use typst_library::foundations::{ }; use typst_library::introspection::{Counter, State}; use typst_syntax::ast::{self, AstNode}; +use typst_syntax::Span; use typst_utils::singleton; use crate::{CapturesVisitor, Eval, FlowEvent, Vm}; @@ -284,8 +285,19 @@ impl Eval for ast::CodeBlock<'_> { type Output = Value; fn eval(self, vm: &mut Vm) -> SourceResult { + 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(); - let output = self.body().eval(vm)?; + let output = body.eval(vm)?; vm.scopes.exit(); Ok(output) } @@ -393,3 +405,12 @@ fn warn_for_discarded_content(engine: &mut Engine, event: &FlowEvent, joined: &V 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" + )); +} diff --git a/tests/suite/foundations/context.typ b/tests/suite/foundations/context.typ index e506d50db..74905beeb 100644 --- a/tests/suite/foundations/context.typ +++ b/tests/suite/foundations/context.typ @@ -48,4 +48,5 @@ let n = query().len() let fonts = ("nope", "Roboto") set text(font: fonts.at(n)) + [] } diff --git a/tests/suite/model/document.typ b/tests/suite/model/document.typ index 2ed199fee..b8e9222ae 100644 --- a/tests/suite/model/document.typ +++ b/tests/suite/model/document.typ @@ -51,4 +51,5 @@ Hello #context { set document(author: "Changed") if "Normal" in document.author set document(title: "Changed") if document.title == "Normal" + [] } diff --git a/tests/suite/styling/in-block.typ b/tests/suite/styling/in-block.typ new file mode 100644 index 000000000..5ac8bde1c --- /dev/null +++ b/tests/suite/styling/in-block.typ @@ -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) +}