vize_l3 0.594.0

L3 - the Davinci reactivity IR (codename Impeto): flat scheduled ops with explicit state and effect edges
Documentation
use vize_l0::{
    Allocator,
    config::{VueDialect, VueVersion},
};
use vize_l1::{container::vue::DescriptorOptions, markup::SurfaceParseOptions};
use vize_l1_to_l2::native_file::lower_selected_setup_sfc_native;
use vize_l2::file::{DeclarationKind, InitializerKind};
use vize_l3::decision::{
    dom::{ValueKind, vue::VueReadKind},
    native::build_native_selected_setup_dom_decisions,
    ssr::{SsrPart, SsrSetupReadKind, build_native_selected_setup_ssr_decisions},
};

#[test]
fn genuine_selected_dom_and_ssr_reads_preserve_all_original_primitive_classes() {
    for (literal, expected) in [
        (r#"'a\0b'"#, InitializerKind::PrimitiveStringWithNulOrCr),
        (r#"'a\rb'"#, InitializerKind::PrimitiveStringWithNulOrCr),
        (
            r#"'a\ud800b'"#,
            InitializerKind::PrimitiveStringWithLoneSurrogates,
        ),
        (
            r#"'a\udc00b'"#,
            InitializerKind::PrimitiveStringWithLoneSurrogates,
        ),
        (r#"'a\nb'"#, InitializerKind::PrimitiveLiteral),
        (r#"'a\ud83c\udf38b'"#, InitializerKind::PrimitiveLiteral),
        (r#"'a\ufffdb'"#, InitializerKind::PrimitiveLiteral),
    ] {
        for (keyword, kind, read_kind) in [
            ("const", DeclarationKind::Const, VueReadKind::SetupConst),
            ("let", DeclarationKind::Let, VueReadKind::SetupLet),
            ("var", DeclarationKind::Var, VueReadKind::SetupLet),
        ] {
            let arena = Allocator::default();
            let source = format!(
                "<script setup>{keyword} value={literal};</script><template>{{{{value}}}}</template>"
            );
            let observation = lower_selected_setup_sfc_native(
                &arena,
                &source,
                DescriptorOptions {
                    version: VueVersion::V3,
                    dialect: VueDialect::Vue,
                    template: SurfaceParseOptions::default(),
                },
            );
            assert!(observation.original().issues().is_empty(), "{source}");
            let selected = observation.admitted().unwrap();
            let setup = selected.setup();
            let analysis = build_native_selected_setup_dom_decisions(setup).unwrap();
            assert!(analysis.dom().unwrap().unsupported().is_empty(), "{source}");
            let expression = analysis.expression(vize_l0::id::NodeId::FIRST).unwrap();
            assert_eq!(
                expression.value(),
                if kind == DeclarationKind::Const {
                    ValueKind::LiteralConstant
                } else {
                    ValueKind::FileDependent
                }
            );
            let [read] = expression.reads() else {
                panic!("one original read")
            };
            assert_eq!(read.kind(), read_kind);
            let row = read.binding().declaration().unwrap();
            assert_eq!(row.initializer, expected);
            assert_eq!(row.kind, kind);
            assert_eq!(row.unit, setup.unit());
            assert_eq!(row.scope, setup.scope());
            assert!(setup.binding(read.binding()).is_ok());
            assert!(core::ptr::eq(read.binding().file(), setup.file()));

            let ssr = build_native_selected_setup_ssr_decisions(setup).unwrap();
            let facts = ssr.ssr().unwrap();
            assert!(facts.unsupported().is_empty(), "{source}");
            let [SsrPart::Interpolation { node, .. }] = facts.parts() else {
                panic!("one genuine SSR interpolation")
            };
            let [ssr_read] = ssr.expression(*node).unwrap().reads() else {
                panic!("one original SSR read")
            };
            assert_eq!(
                ssr_read.kind(),
                if kind == DeclarationKind::Const {
                    SsrSetupReadKind::SetupConst
                } else {
                    SsrSetupReadKind::SetupLet
                }
            );
            assert_eq!(ssr_read.binding().id(), read.binding().id());
            assert!(core::ptr::eq(ssr_read.binding().file(), setup.file()));
            assert!(setup.binding(ssr_read.binding()).is_ok());
            assert_eq!(
                ssr_read.binding().declaration().unwrap().initializer,
                expected
            );
        }
    }
}