tsz-solver 0.1.0

TypeScript type solver for the tsz compiler
Documentation
use crate::{
    TypeDatabase, TypeId, TypeInterner, fallback_compound_assignment_result,
    is_compound_assignment_operator, map_compound_assignment_to_binary,
};
use tsz_scanner::SyntaxKind;

#[test]
fn recognizes_compound_assignment_tokens() {
    assert!(is_compound_assignment_operator(
        SyntaxKind::PlusEqualsToken as u16
    ));
    assert!(is_compound_assignment_operator(
        SyntaxKind::QuestionQuestionEqualsToken as u16
    ));
    assert!(!is_compound_assignment_operator(
        SyntaxKind::EqualsToken as u16
    ));
}

#[test]
fn maps_compound_assignment_to_binary_operator() {
    assert_eq!(
        map_compound_assignment_to_binary(SyntaxKind::AsteriskAsteriskEqualsToken as u16),
        Some("**")
    );
    assert_eq!(
        map_compound_assignment_to_binary(SyntaxKind::BarBarEqualsToken as u16),
        Some("||")
    );
    assert_eq!(
        map_compound_assignment_to_binary(SyntaxKind::EqualsToken as u16),
        None
    );
}

#[test]
fn fallback_result_keeps_plus_equals_unknown_unless_numeric_rhs() {
    let interner = TypeInterner::new();
    let db: &dyn TypeDatabase = &interner;

    assert_eq!(
        fallback_compound_assignment_result(db, SyntaxKind::PlusEqualsToken as u16, None),
        None
    );
    assert_eq!(
        fallback_compound_assignment_result(
            db,
            SyntaxKind::PlusEqualsToken as u16,
            Some(interner.literal_number(1.0)),
        ),
        Some(TypeId::NUMBER)
    );
}

#[test]
fn fallback_result_numeric_operators_return_number() {
    let interner = TypeInterner::new();
    let db: &dyn TypeDatabase = &interner;

    assert_eq!(
        fallback_compound_assignment_result(db, SyntaxKind::MinusEqualsToken as u16, None),
        Some(TypeId::NUMBER)
    );
    assert_eq!(
        fallback_compound_assignment_result(db, SyntaxKind::BarBarEqualsToken as u16, None),
        None
    );
}