1use voile_util::{
2 level::Level,
3 loc::{Ident, Loc, ToLoc},
4 uid::GI,
5};
6
7use crate::syntax::abs::{Abs, AbsCopat, AbsTele};
8
9#[derive(Debug, PartialEq, Eq, Clone)]
10pub struct AbsConsInfo {
11 pub source: Loc,
12 pub name: Ident,
13 pub tele: AbsTele,
14 pub data_ix: GI,
16}
17
18#[derive(Debug, PartialEq, Eq, Clone)]
19pub struct AbsDefnInfo {
20 pub source: Loc,
21 pub name: Ident,
22 pub ty: Abs,
23}
24
25#[derive(Debug, PartialEq, Eq, Clone)]
26pub struct AbsProjInfo {
27 pub source: Loc,
28 pub name: Ident,
29 pub ty: Abs,
30 pub codata_ix: GI,
32}
33
34#[derive(Debug, PartialEq, Eq, Clone)]
35pub struct AbsCodataInfo {
36 pub source: Loc,
37 pub self_ref: Option<Ident>,
38 pub name: Ident,
39 pub fields: Vec<GI>,
40 pub level: Level,
41 pub tele: AbsTele,
42}
43
44#[derive(Debug, PartialEq, Eq, Clone)]
45pub struct AbsDataInfo {
46 pub source: Loc,
47 pub name: Ident,
48 pub level: Level,
49 pub tele: AbsTele,
50 pub conses: Vec<GI>,
51}
52
53#[derive(Debug, PartialEq, Eq, Clone)]
56pub enum AbsDecl {
57 Data(AbsDataInfo),
59 Cons(AbsConsInfo),
61 Proj(AbsProjInfo),
63 Defn(AbsDefnInfo),
65 Clause(AbsClause),
67 Codata(AbsCodataInfo),
69}
70
71impl AbsDecl {
72 pub fn decl_name(&self) -> &Ident {
73 use AbsDecl::*;
74 match self {
75 Defn(info) => &info.name,
76 Clause(info) => &info.name,
77 Data(info) => &info.name,
78 Cons(info) => &info.name,
79 Proj(info) => &info.name,
80 Codata(info) => &info.name,
81 }
82 }
83}
84
85impl ToLoc for AbsDecl {
86 fn loc(&self) -> Loc {
87 use AbsDecl::*;
88 match self {
89 Defn(i) => i.loc(),
90 Data(i) => i.loc(),
91 Cons(i) => i.loc(),
92 Clause(i) => i.loc(),
93 Codata(i) => i.loc(),
94 Proj(i) => i.loc(),
95 }
96 }
97}
98
99#[derive(Debug, PartialEq, Eq, Clone)]
102pub struct AbsClause {
103 pub source: Loc,
104 pub name: Ident,
106 pub patterns: Vec<AbsCopat>,
108 pub definition: GI,
110 pub body: Abs,
112}