mir-analyzer 0.18.0

Analysis engine for the mir PHP static analyzer
Documentation
use mir_types::{Atomic, Union};
use php_ast::ast::ExprKind;

pub(crate) fn analyze<'arena, 'src>(kind: &ExprKind<'arena, 'src>) -> Union {
    match kind {
        ExprKind::Int(n) => Union::single(Atomic::TLiteralInt(*n)),
        ExprKind::Float(f) => {
            let bits = f.to_bits();
            Union::single(Atomic::TLiteralFloat(
                (bits >> 32) as i64,
                (bits & 0xFFFF_FFFF) as i64,
            ))
        }
        ExprKind::String(s) => Union::single(Atomic::TLiteralString((*s).into())),
        ExprKind::Bool(b) => {
            if *b {
                Union::single(Atomic::TTrue)
            } else {
                Union::single(Atomic::TFalse)
            }
        }
        ExprKind::Null => Union::single(Atomic::TNull),
        _ => Union::mixed(),
    }
}