use alloc::vec::Vec;
use vize_l0::pass::{Fusability, NoRemarks, PassDesc, PassKind, Preserved, RemarkSink};
use vize_l0::side_table::SideTable;
use crate::op::{Namespace, Region};
use crate::provenance::ProvenanceRecord;
use crate::walk::{PageWalk, assert_accounting};
mod consts;
mod lattice;
mod remarks;
pub use super::constant_expression::is_self_bound_constant as constant_for_hoist;
pub use remarks::{STATIC_PROPS, STATIC_SUBTREE};
pub const NAME: &str = "hoist-static";
pub const DESC: PassDesc = PassDesc::new(
NAME,
PassKind::Optional,
Fusability::Fusable,
Preserved::ALL,
);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum StaticLevel {
NotStatic,
HasDynamicText,
FullyStatic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct StaticFacts {
pub level: StaticLevel,
pub props_hoistable: bool,
pub nested_static: bool,
pub native_descendants: bool,
pub foreign: bool,
}
const _: () = {
const fn assert_owned<T: 'static>() {}
assert_owned::<StaticFacts>();
};
const _: () = assert!(core::mem::size_of::<StaticFacts>() == 5);
#[must_use]
pub fn run(
root: &Region<'_>,
op_count: u32,
provenance: &mut Vec<ProvenanceRecord>,
) -> SideTable<StaticFacts> {
run_remarked(root, op_count, provenance, &mut NoRemarks)
}
#[must_use]
pub fn run_remarked<R: RemarkSink>(
root: &Region<'_>,
op_count: u32,
provenance: &mut Vec<ProvenanceRecord>,
remarks: &mut R,
) -> SideTable<StaticFacts> {
let mut facts = SideTable::new();
let mut walk = PageWalk::new();
lattice::visit_region(
&mut walk,
&root.ops,
Namespace::Html,
provenance,
&mut facts,
remarks,
);
assert_accounting(&walk, op_count, NAME);
facts
}
#[cfg(test)]
mod tests;