mirror of
https://github.com/storytold/gridcraft.git
synced 2026-11-15 15:44:48 +00:00
* calc: linear dependency extraction for range-operator chains (#2183) precedents() handled a range operator with non-reference operands by recursing into both operands and then letting Expr::walk descend into them again, so a left-associative chain of k operands cost 2^k (a 60-operand INDEX(...):INDEX(...) chain would hang on open). It is now a hand-written collector that visits every node once, growing the per-sheet bounding boxes of the enclosing range operator as it goes. Past a depth (4096) or node (1,000,000) bound it marks the formula dynamic (always recalculated) instead of recursing further. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * calc: drop wall-clock timing from precedents tests (clippy) std::time::Instant::now is a disallowed method (clippy.toml: traps on wasm). The regression test only needs to finish; the old 2^k walk would never return. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * calc: bound precedents to 100 ms and box plain-reference range chains (#2183) - range_operator_chain_precedents_are_linear times the direct precedents call against the 100 ms bound in the issue. - A Range node with two plain Ref operands (A1:B2:C3, which the parser can't fold) now collects its bounding box like any other range node, so an edit to C1 recalculates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>