crisp-typeck 1.8.1

HM-style type inference and constraint solving (spec §3.4)
Documentation
//! Implicit `vec<T>` from `new`/`push` and `[ ]` literals (#119).

use crisp_typeck::{TypeChecker, TypeError, format_sig};
use std::path::PathBuf;

fn fixture(name: &str) -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("tests/fixtures")
        .join(name)
}

#[test]
fn issue_119_float_literal_and_push() {
    let typed = TypeChecker::check_crate(&fixture("vec_float")).expect("vec<T> #119");
    let floats = typed
        .signatures
        .values()
        .find(|s| s.name == "floats")
        .expect("floats");
    assert_eq!(format_sig(floats), "floats() -> vec<float>");
    let ints = typed
        .signatures
        .values()
        .find(|s| s.name == "ints")
        .expect("ints");
    assert_eq!(format_sig(ints), "ints() -> vec<int>");
    let empty_f = typed
        .signatures
        .values()
        .find(|s| s.name == "empty_f")
        .expect("empty_f");
    assert_eq!(format_sig(empty_f), "empty_f() -> vec<float>");
    let head = typed
        .signatures
        .values()
        .find(|s| s.name == "head")
        .expect("head");
    assert_eq!(format_sig(head), "head() -> float");
    let second = typed
        .signatures
        .values()
        .find(|s| s.name == "second")
        .expect("second");
    assert_eq!(format_sig(second), "second() -> float");
}

#[test]
fn issue_119_uninferred_new_is_e0088() {
    let err = TypeChecker::check_crate(&fixture("vec_uninferred")).expect_err("E0088");
    assert!(
        matches!(err, TypeError::UninferredVec { .. }) || err.to_string().contains("E0088"),
        "{err}"
    );
}