Compare commits

...

10 Commits

Author SHA1 Message Date
T0mstone
04ac75f798
Merge 01f73c35ed279d26678fe9c991ef55a0e44a1b76 into e9f1b5825a9d37ca0c173a7b2830ba36a27ca9e0 2025-07-25 23:55:56 +08:00
Laurenz
e9f1b5825a
Lint for iterations over hash types (#6652) 2025-07-24 11:34:08 +00:00
Tobias Schmitz
7278d887cf
Fix bounding box computation for lines in curves (#6647)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
2025-07-23 14:17:03 +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
11 changed files with 58 additions and 18 deletions

View File

@ -159,6 +159,7 @@ strip = true
[workspace.lints.clippy]
blocks_in_conditions = "allow"
comparison_chain = "allow"
iter_over_hash_type = "warn"
manual_range_contains = "allow"
mutable_key_type = "allow"
uninlined_format_args = "warn"

View File

@ -139,6 +139,7 @@ impl Watcher {
fn update(&mut self, iter: impl IntoIterator<Item = PathBuf>) -> StrResult<()> {
// Mark all files as not "seen" so that we may unwatch them if they
// aren't in the dependency list.
#[allow(clippy::iter_over_hash_type, reason = "order does not matter")]
for seen in self.watched.values_mut() {
*seen = false;
}

View File

@ -173,6 +173,7 @@ impl SystemWorld {
/// Reset the compilation state in preparation of a new compilation.
pub fn reset(&mut self) {
#[allow(clippy::iter_over_hash_type, reason = "order does not matter")]
for slot in self.slots.get_mut().values_mut() {
slot.reset();
}

View File

@ -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<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();
let output = self.body().eval(vm)?;
let output = body.eval(vm)?;
vm.scopes.exit();
Ok(output)
}
@ -389,3 +401,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"
));
}

View File

@ -476,26 +476,18 @@ impl Curve {
/// Computes the size of the bounding box of this curve.
pub fn bbox_size(&self) -> Size {
let mut min_x = Abs::inf();
let mut min_y = Abs::inf();
let mut max_x = -Abs::inf();
let mut max_y = -Abs::inf();
let mut min = Point::splat(Abs::inf());
let mut max = Point::splat(-Abs::inf());
let mut cursor = Point::zero();
for item in self.0.iter() {
match item {
CurveItem::Move(to) => {
min_x = min_x.min(cursor.x);
min_y = min_y.min(cursor.y);
max_x = max_x.max(cursor.x);
max_y = max_y.max(cursor.y);
cursor = *to;
}
CurveItem::Line(to) => {
min_x = min_x.min(cursor.x);
min_y = min_y.min(cursor.y);
max_x = max_x.max(cursor.x);
max_y = max_y.max(cursor.y);
min = min.min(cursor).min(*to);
max = max.max(cursor).max(*to);
cursor = *to;
}
CurveItem::Cubic(c0, c1, end) => {
@ -507,17 +499,17 @@ impl Curve {
);
let bbox = cubic.bounding_box();
min_x = min_x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1));
min_y = min_y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1));
max_x = max_x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1));
max_y = max_y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1));
min.x = min.x.min(Abs::pt(bbox.x0)).min(Abs::pt(bbox.x1));
min.y = min.y.min(Abs::pt(bbox.y0)).min(Abs::pt(bbox.y1));
max.x = max.x.max(Abs::pt(bbox.x0)).max(Abs::pt(bbox.x1));
max.y = max.y.max(Abs::pt(bbox.y0)).max(Abs::pt(bbox.y1));
cursor = *end;
}
CurveItem::Close => (),
}
}
Size::new(max_x - min_x, max_y - min_y)
Size::new(max.x - min.x, max.y - min.y)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

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

View File

@ -51,4 +51,5 @@ Hello
#context {
set document(author: "Changed") if "Normal" in document.author
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)
}

View File

@ -130,6 +130,16 @@
down, up, down, up, down,
)
--- curve-stroke-gradient-sharp ---
#set page(width: auto)
#let down = curve.line((40pt, 40pt), relative: true)
#let up = curve.line((40pt, -40pt), relative: true)
#curve(
stroke: 4pt + gradient.linear(red, blue).sharp(3),
down, up, down, up, down,
)
--- curve-fill-rule ---
#stack(
dir: ltr,