Move delayed errors into tracer
This commit is contained in:
parent
7eebafa783
commit
704bec64ae
@ -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(),
|
||||
};
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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(),
|
||||
};
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
|
||||
/// 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.
|
||||
pub fn values(self) -> EcoVec<Value> {
|
||||
self.values
|
||||
/// 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 inspected span.
|
||||
pub fn values(self) -> EcoVec<Value> {
|
||||
self.values
|
||||
}
|
||||
}
|
||||
|
||||
#[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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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()];
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user