spade_typeinference/
testutil.rs

1use spade_common::location_info::WithLocation;
2use spade_common::num_ext::InfallibleToBigInt;
3use spade_hir::symbol_table::SymbolTable;
4use spade_types::KnownType;
5
6use crate::fixed_types::t_int;
7use crate::TypeVar as TVar;
8
9#[cfg(test)]
10use crate::traits::TraitList;
11use crate::TypeState;
12#[cfg(test)]
13use spade_types::meta_types::MetaType;
14
15pub fn sized_int(size: u128, symtab: &SymbolTable, type_state: &mut TypeState) -> TVar {
16    TVar::Known(
17        ().nowhere(),
18        t_int(symtab),
19        vec![
20            TVar::Known(().nowhere(), KnownType::Integer(size.to_bigint()), vec![])
21                .insert(type_state),
22        ],
23    )
24}
25
26#[cfg(test)]
27pub fn unsized_int(id: u64, symtab: &SymbolTable, type_state: &mut TypeState) -> TVar {
28    TVar::Known(
29        ().nowhere(),
30        t_int(symtab),
31        vec![
32            TVar::Unknown(().nowhere(), id, TraitList::empty(), MetaType::Uint).insert(type_state),
33        ],
34    )
35}
36
37#[macro_export]
38macro_rules! get_type {
39    ($state:ident, $e:expr) => {
40        if let Ok(t) = $state.type_of($e) {
41            t
42        } else {
43            println!("{}", format_trace_stack(&$state));
44            panic!("Failed to get type of {:?}", $e)
45        }
46    };
47}
48
49#[macro_export]
50macro_rules! ensure_same_type {
51    ($state:ident, $t1:expr, $t2:expr) => {
52        // These let bindings are required for the values returned by
53        // get_type to live long enough
54        let t1 = $t1;
55        let t2 = $t2;
56        let _t1 = t1.get_type(&$state);
57        let _t2 = t2.get_type(&$state);
58        if _t1 != _t2 {
59            println!("{}", format_trace_stack(&$state));
60            $state.print_equations();
61
62            if let (Ok(t1), Ok(t2)) = (&_t1, &_t2) {
63                println!("Types were OK and have values {}, {}", t1, t2);
64                println!("Raw: {:?}, {:?}", t1, t2);
65            } else {
66                println!("{:?}\n!=\n{:?}", _t1, _t2);
67            }
68            panic!("Types are not the same")
69        }
70    };
71}
72
73/// Shorthand macro for constructing TypeVar::Known
74#[macro_export]
75macro_rules! kvar {
76    ($base:expr $(; ( $( $params:expr ),* ) )? ) => {
77        TypeVar::Known(().nowhere(), $base, vec![ $( $($params),* )? ])
78    }
79}