vize_l2 0.440.0

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

#[test]
fn declaration_and_return_facts_are_minted_from_the_same_original_body() {
    let arena = Allocator::default();
    for (text, leading) in [
        ("var unused=0; $event.count++;", true),
        ("let unused=$event;", true),
        ("/*kept*/ const unused=0; $event.count++;", true),
        ("$event.count++; var unused=0;", false),
        ("'use strict'; var unused=0; $event.count++;", false),
    ] {
        let original = input(&arena, text);
        let body = original.body();
        let resolution = resolve_handler(original, &Outer(&[])).unwrap();
        assert!(core::ptr::eq(resolution.input().body(), body));
        assert_eq!(resolution.syntax().leading_declaration(), leading);
        assert_eq!(resolution.syntax().first_return(), None);
    }
}

#[test]
fn the_original_first_nested_return_keeps_its_exact_source_window() {
    let arena = Allocator::default();
    let text = "var x="雪";{return $event && 1;}return 0;";
    let resolution = resolve_handler(input(&arena, text), &Outer(&[])).unwrap();
    assert!(resolution.syntax().leading_declaration());
    let returned = resolution.syntax().first_return().unwrap();
    assert_eq!(
        returned.slice(resolution.input().operand().syntax().source().text()),
        "return $event && 1;"
    );
    let authored = resolution.authored_span(returned).unwrap();
    assert_eq!(
        authored.slice(
            resolution
                .input()
                .operand()
                .syntax()
                .source()
                .authored_root()
        ),
        "return $event && 1;"
    );
}

#[test]
fn late_refusal_rolls_back_statement_facts_with_the_original_scope_tables() {
    let arena = Allocator::default();
    let original = input(&arena, "var unused=0; return $event; while(true){}");
    let mut pending = super::super::sink::Pending::new();
    let source = original.references();
    assert!(crate::resolution::walk::handler_body(&source, &mut pending).is_err());
    let tables = pending.finish(&Outer(&[])).unwrap();
    assert!(!tables.syntax.leading_declaration());
    assert_eq!(tables.syntax.first_return(), None);
    assert_eq!(tables.scopes.len(), 1);
    assert_eq!(tables.bindings.len(), 1);
    assert_eq!(tables.declarations, []);
    assert_eq!(tables.references, []);
    assert_eq!(
        original.operand().syntax().source().text(),
        "var unused=0; return $event; while(true){}"
    );
    assert_eq!(
        original
            .operand()
            .syntax()
            .source()
            .span()
            .slice(original.operand().syntax().source().authored_root()),
        "var unused=0; return $event; while(true){}"
    );
}