From ea145ff33bb6c3babb9765b5d0059612b2ea54f0 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 16 Sep 2024 18:17:24 +0200 Subject: Do not surface warnings from non-last layout iterations (#4970) --- crates/typst/src/engine.rs | 7 ++++++- crates/typst/src/lib.rs | 10 ++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) (limited to 'crates') diff --git a/crates/typst/src/engine.rs b/crates/typst/src/engine.rs index 9e4d9d70..c3a862f8 100644 --- a/crates/typst/src/engine.rs +++ b/crates/typst/src/engine.rs @@ -156,6 +156,11 @@ impl Sink { pub fn values(self) -> EcoVec<(Value, Option)> { self.values } + + /// Extend from another sink. + pub fn extend_from_sink(&mut self, other: Sink) { + self.extend(other.delayed, other.warnings, other.values); + } } #[comemo::track] @@ -181,7 +186,7 @@ impl Sink { } } - /// Extend from another sink. + /// Extend from parts of another sink. fn extend( &mut self, delayed: EcoVec, diff --git a/crates/typst/src/lib.rs b/crates/typst/src/lib.rs index 69c8dad8..9888e4e4 100644 --- a/crates/typst/src/lib.rs +++ b/crates/typst/src/lib.rs @@ -128,6 +128,7 @@ fn compile_impl( .content(); let mut iter = 0; + let mut subsink; let mut document = Document::default(); // Relayout until all introspections stabilize. @@ -138,15 +139,14 @@ fn compile_impl( &["layout (1)", "layout (2)", "layout (3)", "layout (4)", "layout (5)"]; let _scope = TimingScope::new(ITER_NAMES[iter], None); - // Clear delayed errors. - sink.delayed(); + subsink = Sink::new(); let constraint = ::Constraint::new(); let mut engine = Engine { world, introspector: document.introspector.track_with(&constraint), traced, - sink: sink.track_mut(), + sink: subsink.track_mut(), route: Route::default(), }; @@ -160,7 +160,7 @@ fn compile_impl( } if iter >= 5 { - sink.warn(warning!( + subsink.warn(warning!( Span::detached(), "layout did not converge within 5 attempts"; hint: "check if any states or queries are updating themselves" )); @@ -168,6 +168,8 @@ fn compile_impl( } } + sink.extend_from_sink(subsink); + // Promote delayed errors. let delayed = sink.delayed(); if !delayed.is_empty() { -- cgit v1.2.3