vize_l2 0.490.0

L2 - the Davinci semantic IR (codename Disegno): the neutral op family every input dialect lowers into
Documentation
use super::{Allocator, Outer, Span, Usage, input, resolve_handler};

#[test]
fn once_decoded_entities_unicode_and_original_source_spans_stay_exact() {
    let allocator = Allocator::default();
    let original = input(&allocator, "return α && β");
    let source = original.operand().syntax().source();
    let map = source.decode_map().unwrap().segments().as_ptr();
    let body = original.body();
    let resolution = resolve_handler(original, &Outer(&[("α", 1), ("β", 2)])).unwrap();
    assert!(core::ptr::eq(resolution.input().body(), body));
    assert_eq!(
        resolution
            .input()
            .operand()
            .syntax()
            .source()
            .decode_map()
            .unwrap()
            .segments()
            .as_ptr(),
        map
    );
    let [left, right] = resolution.references() else {
        panic!("two original references")
    };
    assert_eq!(left.span, Span::new(7, 9));
    assert_eq!(right.span, Span::new(13, 15));
    let left = resolution.authored_span(left.span).unwrap();
    let right = resolution.authored_span(right.span).unwrap();
    assert_eq!(left, Span::new(28, 30));
    assert_eq!(right, Span::new(42, 44));
    assert_eq!(left.slice(source.authored_root()), "α");
    assert_eq!(right.slice(source.authored_root()), "β");
}

#[test]
fn escaped_shorthand_and_constructor_facts_come_from_original_descendants() {
    let allocator = Allocator::default();
    let resolution =
        resolve_handler(input(&allocator, r"({\u0061})"), &Outer(&[("a", 7)])).unwrap();
    let [reference] = resolution.references() else {
        panic!("one original shorthand")
    };
    assert_eq!(reference.name, "a");
    assert!(reference.shorthand);
    assert_eq!(reference.usage, Usage::Read);
    assert_eq!(reference.span, Span::new(2, 8));
    let source = resolution.input().operand().syntax().source();
    assert_eq!(
        resolution
            .authored_span(reference.span)
            .unwrap()
            .slice(source.authored_root()),
        r"\u0061"
    );
    let resolution = resolve_handler(
        input(&allocator, "new Box(arg)"),
        &Outer(&[("Box", 2), ("arg", 3)]),
    )
    .unwrap();
    assert!(resolution.references()[0].constructor);
    assert!(!resolution.references()[1].constructor);
}

#[test]
fn complete_statement_usage_distinguishes_member_reads_from_direct_target_writes() {
    let allocator = Allocator::default();
    for (text, expected) in [
        (
            "count=value",
            [("count", Usage::Write), ("value", Usage::Read)],
        ),
        (
            "state.key=count",
            [("state", Usage::Read), ("count", Usage::Read)],
        ),
        (
            "count+=value",
            [("count", Usage::ReadWrite), ("value", Usage::Read)],
        ),
    ] {
        let resolution = resolve_handler(
            input(&allocator, text),
            &Outer(&[("count", 1), ("value", 2), ("state", 3)]),
        )
        .unwrap();
        assert_eq!(
            resolution
                .references()
                .iter()
                .map(|row| (row.name, row.usage))
                .collect::<alloc::vec::Vec<_>>(),
            expected
        );
    }
}