Skip to main content

oak_haskell/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct Identifier {
6    pub name: String,
7    #[serde(with = "oak_core::serde_range")]
8    pub span: Range<usize>,
9}
10
11#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12pub struct HaskellRoot {
13    pub module_name: Option<Identifier>,
14    pub items: Vec<Item>,
15}
16
17#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
18pub enum Item {
19    Function(Function),
20    DataDeclaration(DataDeclaration),
21    TypeAlias(TypeAlias),
22    Import(Import),
23}
24
25#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
26pub struct Function {
27    pub name: Identifier,
28    pub type_signature: Option<Type>,
29    pub equations: Vec<Equation>,
30    #[serde(with = "oak_core::serde_range")]
31    pub span: Range<usize>,
32}
33
34#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
35pub struct Equation {
36    pub patterns: Vec<Pattern>,
37    pub body: Expression,
38}
39
40#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
41pub enum Pattern {
42    Wildcard,
43    Variable(Identifier),
44    Constructor(Identifier, Vec<Pattern>),
45    Literal(Literal),
46}
47
48#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
49pub enum Expression {
50    Variable(Identifier),
51    Literal(Literal),
52    Application(Box<Expression>, Box<Expression>),
53    Lambda(Vec<Pattern>, Box<Expression>),
54    Let(Vec<Item>, Box<Expression>),
55    Case(Box<Expression>, Vec<CaseArm>),
56}
57
58#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
59pub struct CaseArm {
60    pub pattern: Pattern,
61    pub body: Expression,
62}
63
64#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
65pub enum Type {
66    Variable(Identifier),
67    Constructor(Identifier, Vec<Type>),
68    Function(Box<Type>, Box<Type>),
69}
70
71#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
72pub struct DataDeclaration {
73    pub name: Identifier,
74    pub type_params: Vec<Identifier>,
75    pub constructors: Vec<ConstructorDef>,
76}
77
78#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
79pub struct ConstructorDef {
80    pub name: Identifier,
81    pub fields: Vec<Type>,
82}
83
84#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
85pub struct TypeAlias {
86    pub name: Identifier,
87    pub type_params: Vec<Identifier>,
88    pub target: Type,
89}
90
91#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
92pub struct Import {
93    pub module: Identifier,
94    pub qualified: bool,
95    pub as_name: Option<Identifier>,
96}
97
98#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
99pub enum Literal {
100    Integer(i64),
101    Float(f64),
102    String(String),
103    Char(char),
104}