Skip to main content

oak_haskell/ast/
mod.rs

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