spade_typeinference/
fixed_types.rs1use spade_common::{
2 location_info::{Loc, WithLocation},
3 name::Path,
4};
5use spade_hir::symbol_table::SymbolTable;
6use spade_types::KnownType;
7
8use crate::{
9 equation::{TypeVar, TypeVarID},
10 TypeState,
11};
12
13fn lookup(symtab: &SymbolTable, name: &[&str]) -> KnownType {
14 let path = Path::from_strs(name);
15 KnownType::Named(
16 symtab
17 .lookup_type_symbol(&path.clone().nowhere())
18 .unwrap_or_else(|_| {
19 panic!(
20 "{} not found. Was the symtab not populated with externs?",
21 path
22 )
23 })
24 .0,
25 )
26}
27
28impl TypeState {
29 pub fn t_int(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
30 self.add_type_var(TypeVar::Known(loc, t_int(symtab), vec![]))
31 }
32 pub fn t_uint(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
33 self.add_type_var(TypeVar::Known(loc, t_uint(symtab), vec![]))
34 }
35 pub fn t_tri(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
36 self.add_type_var(TypeVar::Known(loc, t_tri(symtab), vec![]))
37 }
38 pub fn t_bool(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
39 self.add_type_var(TypeVar::Known(loc, t_bool(symtab), vec![]))
40 }
41 pub fn t_clock(&mut self, loc: Loc<()>, symtab: &SymbolTable) -> TypeVarID {
42 self.add_type_var(TypeVar::Known(loc, t_clock(symtab), vec![]))
43 }
44
45 pub fn t_err(&mut self, loc: Loc<()>) -> TypeVarID {
46 self.add_type_var(TypeVar::Known(loc, KnownType::Error, vec![]))
47 }
48}
49
50pub fn t_int(symtab: &SymbolTable) -> KnownType {
51 lookup(symtab, &["int"])
52}
53pub fn t_uint(symtab: &SymbolTable) -> KnownType {
54 lookup(symtab, &["uint"])
55}
56pub fn t_tri(symtab: &SymbolTable) -> KnownType {
57 lookup(symtab, &["tri"])
58}
59pub fn t_bool(symtab: &SymbolTable) -> KnownType {
60 lookup(symtab, &["bool"])
61}
62pub fn t_clock(symtab: &SymbolTable) -> KnownType {
63 lookup(symtab, &["clock"])
64}