From 4ef1096ad99059fd86526ed819bf8a7abd3aef2b Mon Sep 17 00:00:00 2001 From: Laurenz Date: Tue, 1 Oct 2024 09:59:43 +0200 Subject: [PATCH] Hint for `show par: set block(spacing: ..)` (#5076) --- crates/typst/src/eval/rules.rs | 36 +++++++++++++++++++++----- crates/typst/src/foundations/styles.rs | 5 ++++ tests/suite/model/par.typ | 6 +++++ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/crates/typst/src/eval/rules.rs b/crates/typst/src/eval/rules.rs index 61fee84a1..1748bbd72 100644 --- a/crates/typst/src/eval/rules.rs +++ b/crates/typst/src/eval/rules.rs @@ -1,6 +1,10 @@ -use crate::diag::{At, SourceResult}; +use crate::diag::{warning, At, SourceResult}; use crate::eval::{Eval, Vm}; -use crate::foundations::{Func, Recipe, ShowableSelector, Styles, Transformation}; +use crate::foundations::{ + Element, Fields, Func, Recipe, Selector, ShowableSelector, Styles, Transformation, +}; +use crate::layout::BlockElem; +use crate::model::ParElem; use crate::syntax::ast::{self, AstNode}; impl Eval for ast::SetRule<'_> { @@ -39,13 +43,33 @@ impl Eval for ast::ShowRule<'_> { .map(|selector| selector.0); let transform = self.transform(); - let span = transform.span(); - let transform = match transform { ast::Expr::Set(set) => Transformation::Style(set.eval(vm)?), - expr => expr.eval(vm)?.cast::().at(span)?, + expr => expr.eval(vm)?.cast::().at(transform.span())?, }; - Ok(Recipe::new(selector, transform, span)) + let recipe = Recipe::new(selector, transform, self.span()); + check_show_par_set_block(vm, &recipe); + + Ok(recipe) + } +} + +/// Migration hint for `show par: set block(spacing: ..)`. +fn check_show_par_set_block(vm: &mut Vm, recipe: &Recipe) { + if_chain::if_chain! { + if let Some(Selector::Elem(elem, _)) = recipe.selector(); + if *elem == Element::of::(); + if let Transformation::Style(styles) = recipe.transform(); + if styles.has::(::Enum::Above as _) || + styles.has::(::Enum::Below as _); + then { + vm.engine.sink.warn(warning!( + recipe.span(), + "`show par: set block(spacing: ..)` has no effect anymore"; + hint: "write `set par(spacing: ..)` instead"; + hint: "this is specific to paragraphs as they are not considered blocks anymore" + )) + } } } diff --git a/crates/typst/src/foundations/styles.rs b/crates/typst/src/foundations/styles.rs index e297db7d7..a3c8e0c40 100644 --- a/crates/typst/src/foundations/styles.rs +++ b/crates/typst/src/foundations/styles.rs @@ -488,6 +488,11 @@ impl Recipe { &self.transform } + /// The recipe's span. + pub fn span(&self) -> Span { + self.span + } + /// Apply the recipe to the given content. pub fn apply( &self, diff --git a/tests/suite/model/par.typ b/tests/suite/model/par.typ index b2e400fcc..0c2b5cb54 100644 --- a/tests/suite/model/par.typ +++ b/tests/suite/model/par.typ @@ -106,3 +106,9 @@ Lorem ipsum dolor #metadata(none) nonumy eirmod tempor. #h(0pt) #box[] #context test(query().len(), 1) + +--- show-par-set-block-hint --- +// Warning: 2-36 `show par: set block(spacing: ..)` has no effect anymore +// Hint: 2-36 this is specific to paragraphs as they are not considered blocks anymore +// Hint: 2-36 write `set par(spacing: ..)` instead +#show par: set block(spacing: 12pt)