diff options
| -rw-r--r-- | crates/typst-ide/src/analyze.rs | 3 | ||||
| -rw-r--r-- | crates/typst/src/diag.rs | 19 | ||||
| -rw-r--r-- | crates/typst/src/eval/call.rs | 13 | ||||
| -rw-r--r-- | crates/typst/src/eval/mod.rs | 6 | ||||
| -rw-r--r-- | crates/typst/src/eval/tracer.rs | 43 | ||||
| -rw-r--r-- | crates/typst/src/foundations/func.rs | 2 | ||||
| -rw-r--r-- | crates/typst/src/introspection/counter.rs | 12 | ||||
| -rw-r--r-- | crates/typst/src/introspection/state.rs | 12 | ||||
| -rw-r--r-- | crates/typst/src/layout/inline/mod.rs | 12 | ||||
| -rw-r--r-- | crates/typst/src/layout/mod.rs | 22 | ||||
| -rw-r--r-- | crates/typst/src/layout/vt.rs | 8 | ||||
| -rw-r--r-- | crates/typst/src/lib.rs | 11 |
12 files changed, 45 insertions, 118 deletions
diff --git a/crates/typst-ide/src/analyze.rs b/crates/typst-ide/src/analyze.rs index 2d48039b..f3e417d5 100644 --- a/crates/typst-ide/src/analyze.rs +++ b/crates/typst-ide/src/analyze.rs @@ -1,6 +1,5 @@ use comemo::Track; use ecow::{eco_vec, EcoString, EcoVec}; -use typst::diag::DelayedErrors; use typst::eval::{Route, Tracer, Vm}; use typst::foundations::{Label, Scopes, Value}; use typst::introspection::{Introspector, Locator}; @@ -55,13 +54,11 @@ pub fn analyze_import(world: &dyn World, source: &LinkedNode) -> Option<Value> { let mut locator = Locator::default(); let introspector = Introspector::default(); - let mut delayed = DelayedErrors::new(); let mut tracer = Tracer::new(); let vt = Vt { world: world.track(), introspector: introspector.track(), locator: &mut locator, - delayed: delayed.track_mut(), tracer: tracer.track_mut(), }; diff --git a/crates/typst/src/diag.rs b/crates/typst/src/diag.rs index c0106b6a..4634f41e 100644 --- a/crates/typst/src/diag.rs +++ b/crates/typst/src/diag.rs @@ -165,25 +165,6 @@ impl From<SyntaxError> for SourceDiagnostic { } } -/// Holds delayed errors. -#[derive(Default, Clone)] -pub struct DelayedErrors(pub EcoVec<SourceDiagnostic>); - -impl DelayedErrors { - /// Create an empty list of delayed errors. - pub fn new() -> Self { - Self::default() - } -} - -#[comemo::track] -impl DelayedErrors { - /// Push a delayed error. - pub fn push(&mut self, error: SourceDiagnostic) { - self.0.push(error); - } -} - /// A part of a diagnostic's [trace](SourceDiagnostic::trace). #[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] pub enum Tracepoint { diff --git a/crates/typst/src/eval/call.rs b/crates/typst/src/eval/call.rs index f87ac771..7ccebe85 100644 --- a/crates/typst/src/eval/call.rs +++ b/crates/typst/src/eval/call.rs @@ -1,9 +1,7 @@ use comemo::{Prehashed, Tracked, TrackedMut}; use ecow::EcoVec; -use crate::diag::{ - bail, error, At, DelayedErrors, HintedStrResult, SourceResult, Trace, Tracepoint, -}; +use crate::diag::{bail, error, At, HintedStrResult, SourceResult, Trace, Tracepoint}; use crate::eval::{Access, Eval, FlowEvent, Route, Tracer, Vm}; use crate::foundations::{ call_method_mut, is_mutating_method, Arg, Args, Bytes, Closure, Content, Func, @@ -251,7 +249,6 @@ pub(crate) fn call_closure( route: Tracked<Route>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, depth: usize, mut args: Args, @@ -265,13 +262,7 @@ pub(crate) fn call_closure( // Prepare VT. let mut locator = Locator::chained(locator); - let vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let vt = Vt { world, introspector, locator: &mut locator, tracer }; // Prepare VM. let mut vm = Vm::new(vt, route, closure.file, scopes); diff --git a/crates/typst/src/eval/mod.rs b/crates/typst/src/eval/mod.rs index f1bd691b..eaba69e0 100644 --- a/crates/typst/src/eval/mod.rs +++ b/crates/typst/src/eval/mod.rs @@ -25,7 +25,7 @@ pub(crate) use self::flow::*; use comemo::{Track, Tracked, TrackedMut}; -use crate::diag::{bail, DelayedErrors, SourceResult}; +use crate::diag::{bail, SourceResult}; use crate::foundations::{Cast, Module, NativeElement, Scope, Scopes, Value}; use crate::introspection::{Introspector, Locator}; use crate::layout::Vt; @@ -51,12 +51,10 @@ pub fn eval( // Prepare VT. let mut locator = Locator::new(); let introspector = Introspector::default(); - let mut delayed = DelayedErrors::new(); let vt = Vt { world, introspector: introspector.track(), locator: &mut locator, - delayed: delayed.track_mut(), tracer, }; @@ -118,13 +116,11 @@ pub fn eval_string( // Prepare VT. let mut tracer = Tracer::new(); let mut locator = Locator::new(); - let mut delayed = DelayedErrors::new(); let introspector = Introspector::default(); let vt = Vt { world, introspector: introspector.track(), locator: &mut locator, - delayed: delayed.track_mut(), tracer: tracer.track_mut(), }; diff --git a/crates/typst/src/eval/tracer.rs b/crates/typst/src/eval/tracer.rs index af53a945..53494895 100644 --- a/crates/typst/src/eval/tracer.rs +++ b/crates/typst/src/eval/tracer.rs @@ -11,9 +11,10 @@ use crate::util::hash128; #[derive(Default, Clone)] pub struct Tracer { inspected: Option<Span>, - values: EcoVec<Value>, warnings: EcoVec<SourceDiagnostic>, warnings_set: HashSet<u128>, + delayed: EcoVec<SourceDiagnostic>, + values: EcoVec<Value>, } impl Tracer { @@ -25,25 +26,44 @@ impl Tracer { Self::default() } + /// Get the stored delayed errors. + pub fn delayed(&mut self) -> EcoVec<SourceDiagnostic> { + std::mem::take(&mut self.delayed) + } + + /// Get the stored warnings. + pub fn warnings(self) -> EcoVec<SourceDiagnostic> { + self.warnings + } + /// Mark a span as inspected. All values observed for this span can be /// retrieved via `values` later. pub fn inspect(&mut self, span: Span) { self.inspected = Some(span); } - /// Get the values for the inspeted span. + /// Get the values for the inspected span. pub fn values(self) -> EcoVec<Value> { self.values } - - /// Get the stored warnings. - pub fn warnings(self) -> EcoVec<SourceDiagnostic> { - self.warnings - } } #[comemo::track] impl Tracer { + /// Push delayed errors. + pub fn delay(&mut self, errors: EcoVec<SourceDiagnostic>) { + self.delayed.extend(errors); + } + + /// Add a warning. + pub fn warn(&mut self, warning: SourceDiagnostic) { + // Check if warning is a duplicate. + let hash = hash128(&(&warning.span, &warning.message)); + if self.warnings_set.insert(hash) { + self.warnings.push(warning); + } + } + /// The inspected span if it is part of the given source file. pub fn inspected(&self, id: FileId) -> Option<Span> { if self.inspected.and_then(Span::id) == Some(id) { @@ -59,13 +79,4 @@ impl Tracer { self.values.push(v); } } - - /// Add a warning. - pub fn warn(&mut self, warning: SourceDiagnostic) { - // Check if warning is a duplicate. - let hash = hash128(&(&warning.span, &warning.message)); - if self.warnings_set.insert(hash) { - self.warnings.push(warning); - } - } } diff --git a/crates/typst/src/foundations/func.rs b/crates/typst/src/foundations/func.rs index 7d6b94ba..f1da6e37 100644 --- a/crates/typst/src/foundations/func.rs +++ b/crates/typst/src/foundations/func.rs @@ -281,7 +281,6 @@ impl Func { route, vm.vt.introspector, vm.vt.locator.track(), - TrackedMut::reborrow_mut(&mut vm.vt.delayed), TrackedMut::reborrow_mut(&mut vm.vt.tracer), vm.depth + 1, args, @@ -308,7 +307,6 @@ impl Func { world: vt.world, introspector: vt.introspector, locator: &mut locator, - delayed: TrackedMut::reborrow_mut(&mut vt.delayed), tracer: TrackedMut::reborrow_mut(&mut vt.tracer), }; let mut vm = Vm::new(vt, route.track(), None, scopes); diff --git a/crates/typst/src/introspection/counter.rs b/crates/typst/src/introspection/counter.rs index 0af65563..16403320 100644 --- a/crates/typst/src/introspection/counter.rs +++ b/crates/typst/src/introspection/counter.rs @@ -5,7 +5,7 @@ use comemo::{Tracked, TrackedMut}; use ecow::{eco_format, eco_vec, EcoString, EcoVec}; use smallvec::{smallvec, SmallVec}; -use crate::diag::{At, DelayedErrors, SourceResult, StrResult}; +use crate::diag::{At, SourceResult, StrResult}; use crate::eval::Tracer; use crate::foundations::{ cast, elem, func, scope, select_where, ty, Array, Content, Element, Func, IntoValue, @@ -253,7 +253,6 @@ impl Counter { vt.world, vt.introspector, vt.locator.track(), - TrackedMut::reborrow_mut(&mut vt.delayed), TrackedMut::reborrow_mut(&mut vt.tracer), ) } @@ -265,17 +264,10 @@ impl Counter { world: Tracked<dyn World + '_>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, ) -> SourceResult<EcoVec<(CounterState, NonZeroUsize)>> { let mut locator = Locator::chained(locator); - let mut vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let mut vt = Vt { world, introspector, locator: &mut locator, tracer }; let mut state = CounterState::init(&self.0); let mut page = NonZeroUsize::ONE; diff --git a/crates/typst/src/introspection/state.rs b/crates/typst/src/introspection/state.rs index 4b559b3e..af6d7933 100644 --- a/crates/typst/src/introspection/state.rs +++ b/crates/typst/src/introspection/state.rs @@ -1,7 +1,7 @@ use comemo::{Tracked, TrackedMut}; use ecow::{eco_format, eco_vec, EcoString, EcoVec}; -use crate::diag::{DelayedErrors, SourceResult}; +use crate::diag::SourceResult; use crate::eval::Tracer; use crate::foundations::{ cast, elem, func, scope, select_where, ty, Content, Func, NativeElement, Repr, @@ -209,7 +209,6 @@ impl State { vt.world, vt.introspector, vt.locator.track(), - TrackedMut::reborrow_mut(&mut vt.delayed), TrackedMut::reborrow_mut(&mut vt.tracer), ) } @@ -221,17 +220,10 @@ impl State { world: Tracked<dyn World + '_>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, ) -> SourceResult<EcoVec<Value>> { let mut locator = Locator::chained(locator); - let mut vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let mut vt = Vt { world, introspector, locator: &mut locator, tracer }; let mut state = self.init.clone(); let mut stops = eco_vec![state.clone()]; diff --git a/crates/typst/src/layout/inline/mod.rs b/crates/typst/src/layout/inline/mod.rs index 35d332d6..44b2e113 100644 --- a/crates/typst/src/layout/inline/mod.rs +++ b/crates/typst/src/layout/inline/mod.rs @@ -10,7 +10,7 @@ use self::shaping::{ is_gb_style, is_of_cjk_script, shape, ShapedGlyph, ShapedText, BEGIN_PUNCT_PAT, END_PUNCT_PAT, }; -use crate::diag::{bail, DelayedErrors, SourceResult}; +use crate::diag::{bail, SourceResult}; use crate::eval::Tracer; use crate::foundations::{Content, Resolve, Smart, StyleChain}; use crate::introspection::{Introspector, Locator, MetaElem}; @@ -43,7 +43,6 @@ pub(crate) fn layout_inline( world: Tracked<dyn World + '_>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, styles: StyleChain, consecutive: bool, @@ -51,13 +50,7 @@ pub(crate) fn layout_inline( expand: bool, ) -> SourceResult<Fragment> { let mut locator = Locator::chained(locator); - let mut vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let mut vt = Vt { world, introspector, locator: &mut locator, tracer }; // Collect all text into one string for BiDi analysis. let (text, segments, spans) = collect(children, &styles, consecutive)?; @@ -79,7 +72,6 @@ pub(crate) fn layout_inline( vt.world, vt.introspector, vt.locator.track(), - TrackedMut::reborrow_mut(&mut vt.delayed), TrackedMut::reborrow_mut(&mut vt.tracer), styles, consecutive, diff --git a/crates/typst/src/layout/mod.rs b/crates/typst/src/layout/mod.rs index 1627b8e7..f291cfe9 100644 --- a/crates/typst/src/layout/mod.rs +++ b/crates/typst/src/layout/mod.rs @@ -73,7 +73,6 @@ pub(crate) use self::inline::*; use comemo::{Tracked, TrackedMut}; -use crate::diag::DelayedErrors; use crate::diag::SourceResult; use crate::eval::Tracer; use crate::foundations::{category, Category, Content, Scope, StyleChain}; @@ -153,7 +152,6 @@ pub trait Layout { introspector: vt.introspector, locator: &mut locator, tracer: TrackedMut::reborrow_mut(&mut vt.tracer), - delayed: TrackedMut::reborrow_mut(&mut vt.delayed), }; self.layout(&mut vt, styles, regions) } @@ -168,18 +166,11 @@ impl LayoutRoot for Content { world: Tracked<dyn World + '_>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, styles: StyleChain, ) -> SourceResult<Document> { let mut locator = Locator::chained(locator); - let mut vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let mut vt = Vt { world, introspector, locator: &mut locator, tracer }; let scratch = Scratch::default(); let (realized, styles) = realize_root(&mut vt, &scratch, content, styles)?; realized @@ -194,7 +185,6 @@ impl LayoutRoot for Content { vt.world, vt.introspector, vt.locator.track(), - TrackedMut::reborrow_mut(&mut vt.delayed), TrackedMut::reborrow_mut(&mut vt.tracer), styles, ) @@ -216,19 +206,12 @@ impl Layout for Content { world: Tracked<dyn World + '_>, introspector: Tracked<Introspector>, locator: Tracked<Locator>, - delayed: TrackedMut<DelayedErrors>, tracer: TrackedMut<Tracer>, styles: StyleChain, regions: Regions, ) -> SourceResult<Fragment> { let mut locator = Locator::chained(locator); - let mut vt = Vt { - world, - introspector, - locator: &mut locator, - delayed, - tracer, - }; + let mut vt = Vt { world, introspector, locator: &mut locator, tracer }; let scratch = Scratch::default(); let (realized, styles) = realize_block(&mut vt, &scratch, content, styles)?; realized @@ -244,7 +227,6 @@ impl Layout for Content { vt.world, vt.introspector, vt.locator.track(), - TrackedMut::reborrow_mut(&mut vt.delayed), TrackedMut::reborrow_mut(&mut vt.tracer), styles, regions, diff --git a/crates/typst/src/layout/vt.rs b/crates/typst/src/layout/vt.rs index 7b316a28..78b8c511 100644 --- a/crates/typst/src/layout/vt.rs +++ b/crates/typst/src/layout/vt.rs @@ -1,6 +1,6 @@ use comemo::{Tracked, TrackedMut}; -use crate::diag::{DelayedErrors, SourceResult}; +use crate::diag::SourceResult; use crate::eval::Tracer; use crate::introspection::{Introspector, Locator}; use crate::World; @@ -15,8 +15,6 @@ pub struct Vt<'a> { pub introspector: Tracked<'a, Introspector>, /// Provides stable identities to elements. pub locator: &'a mut Locator<'a>, - /// Delayed errors that do not immediately terminate execution. - pub delayed: TrackedMut<'a, DelayedErrors>, /// The tracer for inspection of the values an expression produces. pub tracer: TrackedMut<'a, Tracer>, } @@ -33,9 +31,7 @@ impl Vt<'_> { match f(self) { Ok(value) => value, Err(errors) => { - for error in errors { - self.delayed.push(error); - } + self.tracer.delay(errors); T::default() } } diff --git a/crates/typst/src/lib.rs b/crates/typst/src/lib.rs index 92f82492..8d0001c8 100644 --- a/crates/typst/src/lib.rs +++ b/crates/typst/src/lib.rs @@ -61,7 +61,7 @@ use std::ops::Range; use comemo::{Prehashed, Track, Tracked, Validate}; use ecow::{EcoString, EcoVec}; -use crate::diag::{warning, DelayedErrors, FileResult, SourceDiagnostic, SourceResult}; +use crate::diag::{warning, FileResult, SourceDiagnostic, SourceResult}; use crate::eval::{Route, Tracer}; use crate::foundations::{ Array, Bytes, Content, Datetime, Module, Scope, StyleChain, Styles, @@ -110,7 +110,6 @@ fn typeset( let mut iter = 0; let mut document; - let mut delayed; let mut introspector = Introspector::new(&[]); // Relayout until all introspections stabilize. @@ -119,7 +118,7 @@ fn typeset( tracing::info!("Layout iteration {iter}"); // Clear delayed errors. - delayed = DelayedErrors::new(); + tracer.delayed(); let constraint = <Introspector as Validate>::Constraint::new(); let mut locator = Locator::new(); @@ -127,7 +126,6 @@ fn typeset( world, tracer: tracer.track_mut(), locator: &mut locator, - delayed: delayed.track_mut(), introspector: introspector.track_with(&constraint), }; @@ -150,8 +148,9 @@ fn typeset( } // Promote delayed errors. - if !delayed.0.is_empty() { - return Err(delayed.0); + let delayed = tracer.delayed(); + if !delayed.is_empty() { + return Err(delayed); } Ok(document) |
