1use std::collections::HashMap;
4
5use miette::Diagnostic;
6use thiserror::Error;
7
8use crate::{
9 raw_syntax::{PatternR, TermR, pattern::PatTensorR, term::TensorR},
10 text::{Name, Span},
11 typed_syntax::{PatternType, TermT, TermType},
12};
13
14#[derive(Error, Diagnostic, Debug, Clone)]
16pub enum TypeCheckError<S: Span> {
17 #[error("Type mismatch when composing")]
19 #[diagnostic(code("Type mismatch."))]
20 TypeMismatch {
21 #[label("Has type {ty1}")]
23 t1: TensorR<S>,
24 ty1: TermType,
26 #[label("Has type {ty2}")]
28 t2: TensorR<S>,
29 ty2: TermType,
31 },
32 #[error("Type mismatch between pattern and term in 'if let'")]
34 #[diagnostic(code("If let type mismatch."))]
35 IfTypeMismatch {
36 #[label("Has type {pty}")]
38 p: PatternR<S>,
39 pty: PatternType,
41 #[label("Has type {tty}")]
43 t: TensorR<S>,
44 tty: TermType,
46 },
47 #[error("Type mismatch when composing patterns")]
49 #[diagnostic(code("Pattern type mismatch."))]
50 PatternTypeMismatch {
51 #[label("Has type {ty1}")]
53 p1: PatTensorR<S>,
54 ty1: PatternType,
56 #[label("Has type {ty2}")]
58 p2: PatTensorR<S>,
59 ty2: PatternType,
61 },
62 #[error("Unrecognised top-level symbol {name}.")]
64 #[diagnostic(code("Unknown symbol."))]
65 UnknownSymbol {
66 name: Name,
68 #[label("Symbol used here")]
70 span: S,
71 },
72 #[error("Tried to root unrootable unitary term.")]
74 #[diagnostic(code("Invalid root."))]
75 TermNotRootable {
76 tm: TermR<S>,
78 #[label("This compostion prevents square rooting")]
79 #[label("Square root applied here")]
81 span_of_root: S,
82 },
83}
84
85#[derive(Default)]
87pub struct Env(pub(crate) HashMap<Name, TermT>);