1#![doc = include_str!("readme.md")]
2
3use core::range::Range;
4
5#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct FSharpRoot {
9 pub items: Vec<Item>,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16pub enum Item {
17 Namespace(NamespaceDeclaration),
19 Module(ModuleDeclaration),
21 Open(OpenDirective),
23 Binding(Binding),
25 Type(TypeDefinition),
27 Class(ClassDefinition),
29 Interface(InterfaceDefinition),
31 Exception(ExceptionDefinition),
33}
34
35#[derive(Debug, Clone, PartialEq)]
37#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
38pub struct NamespaceDeclaration {
39 pub name: String,
41 pub items: Vec<Item>,
43 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
45 pub span: Range<usize>,
46}
47
48#[derive(Debug, Clone, PartialEq)]
50#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
51pub struct ModuleDeclaration {
52 pub name: String,
54 pub is_top_level: bool,
56 pub is_nested: bool,
58 pub items: Vec<Item>,
60 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
62 pub span: Range<usize>,
63}
64
65#[derive(Debug, Clone, PartialEq)]
67#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
68pub struct OpenDirective {
69 pub path: String,
71 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
73 pub span: Range<usize>,
74}
75
76#[derive(Debug, Clone, PartialEq)]
78#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
79pub struct Binding {
80 pub name: String,
82 pub is_rec: bool,
84 pub is_mutable: bool,
86 pub parameters: Vec<Parameter>,
88 pub type_annotation: Option<String>,
90 pub expression: Expression,
92 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
94 pub span: Range<usize>,
95}
96
97#[derive(Debug, Clone, PartialEq)]
99#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
100pub struct Parameter {
101 pub name: String,
103 pub type_annotation: Option<String>,
105}
106
107#[derive(Debug, Clone, PartialEq)]
109#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
110pub struct TypeDefinition {
111 pub name: String,
113 pub type_parameters: Vec<String>,
115 pub body: TypeBody,
117 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
119 pub span: Range<usize>,
120}
121
122#[derive(Debug, Clone, PartialEq)]
124#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
125pub enum TypeBody {
126 Record(Vec<RecordField>),
128 Union(Vec<UnionCase>),
130 Alias(String),
132 Struct(Vec<RecordField>),
134}
135
136#[derive(Debug, Clone, PartialEq)]
138#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
139pub struct RecordField {
140 pub name: String,
142 pub field_type: String,
144}
145
146#[derive(Debug, Clone, PartialEq)]
148#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
149pub struct UnionCase {
150 pub name: String,
152 pub fields: Vec<RecordField>,
154}
155
156#[derive(Debug, Clone, PartialEq)]
158#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
159pub struct ClassDefinition {
160 pub name: String,
162 pub type_parameters: Vec<String>,
164 pub base_class: Option<String>,
166 pub interfaces: Vec<String>,
168 pub members: Vec<ClassMember>,
170 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
172 pub span: Range<usize>,
173}
174
175#[derive(Debug, Clone, PartialEq)]
177#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
178pub enum ClassMember {
179 Constructor(Constructor),
181 Method(Method),
183 Property(Property),
185 Field(Field),
187}
188
189#[derive(Debug, Clone, PartialEq)]
191#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
192pub struct Constructor {
193 pub parameters: Vec<Parameter>,
195 pub body: Expression,
197}
198
199#[derive(Debug, Clone, PartialEq)]
201#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
202pub struct Method {
203 pub name: String,
205 pub parameters: Vec<Parameter>,
207 pub return_type: Option<String>,
209 pub body: Expression,
211}
212
213#[derive(Debug, Clone, PartialEq)]
215#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
216pub struct Property {
217 pub name: String,
219 pub property_type: String,
221 pub getter: Option<Expression>,
223 pub setter: Option<Expression>,
225}
226
227#[derive(Debug, Clone, PartialEq)]
229#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
230pub struct Field {
231 pub name: String,
233 pub field_type: String,
235 pub initial_value: Option<Expression>,
237}
238
239#[derive(Debug, Clone, PartialEq)]
241#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
242pub struct InterfaceDefinition {
243 pub name: String,
245 pub type_parameters: Vec<String>,
247 pub base_interfaces: Vec<String>,
249 pub members: Vec<InterfaceMember>,
251 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
253 pub span: Range<usize>,
254}
255
256#[derive(Debug, Clone, PartialEq)]
258#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
259pub enum InterfaceMember {
260 MethodSignature(Method),
262 PropertySignature(Property),
264}
265
266#[derive(Debug, Clone, PartialEq)]
268#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
269pub struct ExceptionDefinition {
270 pub name: String,
272 pub fields: Vec<RecordField>,
274 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
276 pub span: Range<usize>,
277}
278
279#[derive(Debug, Clone, PartialEq)]
281#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
282pub enum Expression {
283 Literal(Literal),
285 Identifier(String),
287 If {
289 condition: Box<Expression>,
291 then_branch: Box<Expression>,
293 else_branch: Option<Box<Expression>>,
295 },
296 Match {
298 expression: Box<Expression>,
300 cases: Vec<MatchCase>,
302 },
303 Lambda {
305 parameters: Vec<Parameter>,
307 body: Box<Expression>,
309 },
310 Application {
312 function: Box<Expression>,
314 argument: Box<Expression>,
316 },
317 Binary {
319 left: Box<Expression>,
321 op: String,
323 right: Box<Expression>,
325 },
326 Unary {
328 op: String,
330 operand: Box<Expression>,
332 },
333 Let {
335 bindings: Vec<Binding>,
337 body: Box<Expression>,
339 },
340 PipeForward {
342 expression: Box<Expression>,
344 function: Box<Expression>,
346 },
347 PipeBackward {
349 function: Box<Expression>,
351 expression: Box<Expression>,
353 },
354 Tuple(Vec<Expression>),
356 List(Vec<Expression>),
358 Array(Vec<Expression>),
360 Record {
362 type_name: Option<String>,
364 fields: Vec<(String, Expression)>,
366 },
367 UnionCase {
369 case_name: String,
371 arguments: Vec<Expression>,
373 },
374 Sequential(Vec<Expression>),
376 Parenthesized(Box<Expression>),
378 Async(Box<Expression>),
380 Computation {
382 builder: String,
384 body: Vec<ComputationItem>,
386 },
387}
388
389#[derive(Debug, Clone, PartialEq)]
391#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
392pub enum Literal {
393 Integer(i64),
395 Float(f64),
397 String(String),
399 Char(char),
401 Boolean(bool),
403 Unit,
405}
406
407#[derive(Debug, Clone, PartialEq)]
409#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
410pub struct MatchCase {
411 pub pattern: Pattern,
413 pub guard: Option<Expression>,
415 pub body: Expression,
417}
418
419#[derive(Debug, Clone, PartialEq)]
421#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
422pub enum Pattern {
423 Wildcard,
425 Identifier(String),
427 Literal(Literal),
429 Tuple(Vec<Pattern>),
431 List(Vec<Pattern>),
433 UnionCase {
435 case_name: String,
437 patterns: Vec<Pattern>,
439 },
440 Record(Vec<String>),
442 As {
444 pattern: Box<Pattern>,
446 identifier: String,
448 },
449 Or(Box<Pattern>, Box<Pattern>),
451}
452
453#[derive(Debug, Clone, PartialEq)]
455#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
456pub enum ComputationItem {
457 Let(Binding),
459 Yield(Expression),
461 Return(Expression),
463 Expression(Expression),
465 CustomOperation {
467 name: String,
469 arguments: Vec<Expression>,
471 },
472}