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 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#[macro_export]
75macro_rules! kvar {
76 ($base:expr $(; ( $( $params:expr ),* ) )? ) => {
77 TypeVar::Known(().nowhere(), $base, vec![ $( $($params),* )? ])
78 }
79}