From 562c3c31e1ab425afeba3e77675aec2c3db0f5f0 Mon Sep 17 00:00:00 2001 From: +merlan #flirora Date: Wed, 2 Apr 2025 11:21:16 -0400 Subject: [PATCH] Add TrackedMut as an argument --- crates/typst-cli/src/query.rs | 5 +++-- crates/typst-eval/src/lib.rs | 8 ++++---- crates/typst-library/src/foundations/mod.rs | 6 +++++- crates/typst-library/src/model/bibliography.rs | 9 +++++---- crates/typst-library/src/routines.rs | 3 ++- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/crates/typst-cli/src/query.rs b/crates/typst-cli/src/query.rs index e1cb0e455..2ed202ceb 100644 --- a/crates/typst-cli/src/query.rs +++ b/crates/typst-cli/src/query.rs @@ -2,6 +2,7 @@ use comemo::Track; use ecow::{eco_format, EcoString}; use serde::Serialize; use typst::diag::{bail, HintedStrResult, StrResult, Warned}; +use typst::engine::Sink; use typst::foundations::{Content, IntoValue, LocatableSelector, Scope}; use typst::layout::PagedDocument; use typst::syntax::Span; @@ -62,9 +63,9 @@ fn retrieve( Span::detached(), EvalMode::Code, Scope::default(), + // TODO: propagate warnings + Sink::new().track_mut(), ) - // TODO: propagate warnings - .map(|(result, _sink)| result) .map_err(|errors| { let mut message = EcoString::from("failed to evaluate selector"); for (i, error) in errors.into_iter().enumerate() { diff --git a/crates/typst-eval/src/lib.rs b/crates/typst-eval/src/lib.rs index 97bedf55e..7670bc911 100644 --- a/crates/typst-eval/src/lib.rs +++ b/crates/typst-eval/src/lib.rs @@ -105,7 +105,8 @@ pub fn eval_string( span: Span, mode: EvalMode, scope: Scope, -) -> SourceResult<(Value, Sink)> { + sink: TrackedMut, +) -> SourceResult { let mut root = match mode { EvalMode::Code => parse_code(string), EvalMode::Markup => parse(string), @@ -121,7 +122,6 @@ pub fn eval_string( } // Prepare the engine. - let mut sink = Sink::new(); let introspector = Introspector::default(); let traced = Traced::default(); let engine = Engine { @@ -129,7 +129,7 @@ pub fn eval_string( world, introspector: introspector.track(), traced: traced.track(), - sink: sink.track_mut(), + sink, route: Route::default(), }; @@ -158,7 +158,7 @@ pub fn eval_string( bail!(flow.forbidden()); } - Ok((output, sink)) + Ok(output) } /// Evaluate an expression. diff --git a/crates/typst-library/src/foundations/mod.rs b/crates/typst-library/src/foundations/mod.rs index 651fe1a62..2eebf1642 100644 --- a/crates/typst-library/src/foundations/mod.rs +++ b/crates/typst-library/src/foundations/mod.rs @@ -68,6 +68,7 @@ pub use self::target_::*; pub use self::ty::*; pub use self::value::*; pub use self::version::*; +use comemo::Track; pub use typst_macros::{scope, ty}; #[rustfmt::skip] @@ -82,6 +83,7 @@ use typst_syntax::Spanned; use crate::diag::{bail, SourceResult, StrResult}; use crate::engine::Engine; +use crate::engine::Sink; use crate::routines::EvalMode; use crate::{Feature, Features}; @@ -297,13 +299,15 @@ pub fn eval( for (key, value) in dict { scope.bind(key.into(), Binding::new(value, span)); } - let (result, sink) = (engine.routines.eval_string)( + let mut sink = Sink::new(); + let result = (engine.routines.eval_string)( engine.routines, engine.world, &text, span, mode, scope, + sink.track_mut(), )?; for warning in sink.warnings() { diff --git a/crates/typst-library/src/model/bibliography.rs b/crates/typst-library/src/model/bibliography.rs index 085d06c44..b6649caf5 100644 --- a/crates/typst-library/src/model/bibliography.rs +++ b/crates/typst-library/src/model/bibliography.rs @@ -6,7 +6,7 @@ use std::num::NonZeroUsize; use std::path::Path; use std::sync::{Arc, LazyLock}; -use comemo::Tracked; +use comemo::{Track, Tracked}; use ecow::{eco_format, EcoString, EcoVec}; use hayagriva::archive::ArchivedStyle; use hayagriva::io::BibLaTeXError; @@ -20,7 +20,7 @@ use typst_syntax::{Span, Spanned}; use typst_utils::{Get, ManuallyHash, NonZeroExt, PicoStr}; use crate::diag::{bail, error, At, FileError, HintedStrResult, SourceResult, StrResult}; -use crate::engine::Engine; +use crate::engine::{Engine, Sink}; use crate::foundations::{ elem, Bytes, CastInfo, Content, Derived, FromValue, IntoValue, Label, NativeElement, OneOrMultiple, Packed, Reflect, Scope, Show, ShowSet, Smart, StyleChain, Styles, @@ -1003,9 +1003,10 @@ impl ElemRenderer<'_> { self.span, EvalMode::Math, Scope::new(), + // TODO: propagate warnings + Sink::new().track_mut(), ) - // TODO: propagate warnings - .map(|(result, _sink)| Value::display(result)) + .map(Value::display) .unwrap_or_else(|_| TextElem::packed(math).spanned(self.span)) } diff --git a/crates/typst-library/src/routines.rs b/crates/typst-library/src/routines.rs index e7f1a1f15..58ca2250c 100644 --- a/crates/typst-library/src/routines.rs +++ b/crates/typst-library/src/routines.rs @@ -59,7 +59,8 @@ routines! { span: Span, mode: EvalMode, scope: Scope, - ) -> SourceResult<(Value, Sink)> + sink: TrackedMut, + ) -> SourceResult /// Call the closure in the context with the arguments. fn eval_closure(