diff options
Diffstat (limited to 'crates')
| -rw-r--r-- | crates/typst/src/engine.rs | 7 | ||||
| -rw-r--r-- | crates/typst/src/lib.rs | 10 |
2 files changed, 12 insertions, 5 deletions
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<Styles>)> { 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<SourceDiagnostic>, 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 = <Introspector as Validate>::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() { |
