pub struct SubtreeSkip { /* private fields */ }Expand description
A [Checker::should_skip_subtree] verdict, plus the following
nodes it also answers for.
Most verdicts are about one node and carry no reach. The exception
is a verdict a classifier can only reach by reading a run of
siblings: Rust’s #[…] rows all decorate the same item, so they all
get the same answer, and re-deriving it per row is O(run) work
done run times. A run of 3 * depth attributes under a parent
wide enough to stay inside the forward attribute-scan budget made
that quadratic — 5.2 s at depth 2 000, against 0.05 s with
exclude_tests off (#1446). Reporting the reach lets the walker ask
the classifier once per run.
§Soundness
The reach is a byte offset, and the walk visits nodes in
non-decreasing start_byte order, so “starts before it” is a state
the walker can test in O(1) and can never re-enter. A claim is
sound when every node the walk visits inside the reach genuinely
has the reported verdict.
“Visits” is the load-bearing word, and it cuts the obligation in
two. A SKIP reach need only hold for the nodes it skips, since a
skipped node’s descendants are never pushed. A RETAIN reach
carries the heavier claim: the members’ descendants are walked, so
it must be right for them too.
Implementations§
Source§impl SubtreeSkip
impl SubtreeSkip
Sourcepub const fn of(skipped: bool) -> Self
pub const fn of(skipped: bool) -> Self
Self::SKIP or Self::RETAIN, from a predicate’s answer.
Sourcepub const fn covering_through(self, byte: usize) -> Self
pub const fn covering_through(self, byte: usize) -> Self
Extend this verdict to every node that starts before byte.
The caller is asserting that it read far enough to answer for all of them — see the soundness note on the type.
Sourcepub const fn is_skipped(self) -> bool
pub const fn is_skipped(self) -> bool
Whether this node and its descendants are elided.
Sourcepub const fn answers_for(self, start_byte: usize) -> bool
pub const fn answers_for(self, start_byte: usize) -> bool
Whether this verdict already answers for a node starting at
start_byte, so the classifier need not be asked again.
Trait Implementations§
Source§impl Clone for SubtreeSkip
impl Clone for SubtreeSkip
impl Copy for SubtreeSkip
Source§impl Debug for SubtreeSkip
impl Debug for SubtreeSkip
impl Eq for SubtreeSkip
Source§impl PartialEq for SubtreeSkip
impl PartialEq for SubtreeSkip
impl StructuralPartialEq for SubtreeSkip
Auto Trait Implementations§
impl Freeze for SubtreeSkip
impl RefUnwindSafe for SubtreeSkip
impl Send for SubtreeSkip
impl Sync for SubtreeSkip
impl Unpin for SubtreeSkip
impl UnsafeUnpin for SubtreeSkip
impl UnwindSafe for SubtreeSkip
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.