Warn if layout doesn't stabilize (#1684)

This commit is contained in:
bluebear94 2023-08-02 18:24:25 -04:00 committed by GitHub
parent 77cc05b121
commit 3c94e05ced
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 6 deletions

View File

@ -28,7 +28,7 @@ use std::mem::ManuallyDrop;
use comemo::{Track, Tracked, TrackedMut, Validate};
use crate::diag::{SourceDiagnostic, SourceResult};
use crate::diag::{warning, SourceDiagnostic, SourceResult};
use crate::doc::Document;
use crate::eval::Tracer;
use crate::World;
@ -82,7 +82,20 @@ pub fn typeset(
introspector = ManuallyDrop::new(Introspector::new(&document.pages));
iter += 1;
if iter >= 5 || introspector.validate(&constraint) {
if introspector.validate(&constraint) {
break;
}
if iter >= 5 {
tracer.warn(
warning!(
world.main().root().span(),
"layout did not converge within 5 attempts",
)
.with_hint(
"check if any states or queries are updating themselves".into(),
),
);
break;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -670,8 +670,14 @@ fn parse_part_metadata(source: &Source) -> TestPartMetadata {
compare_ref = get_flag_metadata(line, "Ref").or(compare_ref);
validate_hints = get_flag_metadata(line, "Hints").or(validate_hints);
fn num(s: &mut Scanner) -> usize {
s.eat_while(char::is_numeric).parse().unwrap()
fn num(s: &mut Scanner) -> isize {
let mut first = true;
let n = &s.eat_while(|c: char| {
let valid = first && c == '-' || c.is_numeric();
first = false;
valid
});
n.parse().unwrap_or_else(|e| panic!("{n} is not a number ({e})"))
}
let comments_until_code =
@ -681,8 +687,15 @@ fn parse_part_metadata(source: &Source) -> TestPartMetadata {
let first = num(s) - 1;
let (delta, column) =
if s.eat_if(':') { (first, num(s) - 1) } else { (0, first) };
let line = (i + comments_until_code) + delta;
source.line_column_to_byte(line, column).unwrap()
let line = (i + comments_until_code)
.checked_add_signed(delta)
.expect("line number overflowed limits");
source
.line_column_to_byte(
line,
usize::try_from(column).expect("column number overflowed limits"),
)
.unwrap()
};
let error_factory: fn(Range<usize>, String) -> UserOutput = UserOutput::error;

View File

@ -46,3 +46,13 @@ Was: #locate(location => {
#trait[Adventure]
#trait[Fear]
#trait[Anger]
---
// Make sure that a warning is produced if the layout fails to converge.
// Warning: -3:1-6:1 layout did not converge within 5 attempts
// Hint: -3:1-6:1 check if any states or queries are updating themselves
#let s = state("x", 1)
#locate(loc => {
s.update(s.final(loc) + 1)
})
#s.display()