Skip to main content

oak_fsharp/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2//! F# AST definitions
3
4use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8/// The root node of an F# program
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct FSharpRoot {
12    /// Items in the compilation unit
13    pub items: Vec<Item>,
14}
15
16/// Top-level items in an F# program
17#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub enum Item {
20    /// Namespace declaration
21    Namespace(NamespaceDeclaration),
22    /// Module declaration
23    Module(ModuleDeclaration),
24    /// Open directive (open)
25    Open(OpenDirective),
26    /// Binding (let)
27    Binding(Binding),
28}
29
30/// Namespace declaration
31#[derive(Debug, Clone, PartialEq)]
32#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
33pub struct NamespaceDeclaration {
34    /// Namespace name
35    pub name: String,
36    /// Members
37    pub items: Vec<Item>,
38    /// Source span
39    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
40    pub span: Range<usize>,
41}
42
43/// Module declaration
44#[derive(Debug, Clone, PartialEq)]
45#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
46pub struct ModuleDeclaration {
47    /// Module name
48    pub name: String,
49    /// Whether it is a top-level module
50    pub is_top_level: bool,
51    /// Members
52    pub items: Vec<Item>,
53    /// Source span
54    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55    pub span: Range<usize>,
56}
57
58/// Open directive (open)
59#[derive(Debug, Clone, PartialEq)]
60#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
61pub struct OpenDirective {
62    /// Import path
63    pub path: String,
64    /// Source span
65    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
66    pub span: Range<usize>,
67}
68
69/// Binding (let)
70#[derive(Debug, Clone, PartialEq)]
71#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72pub struct Binding {
73    /// Binding name
74    pub name: String,
75    /// Whether it is a recursive binding (rec)
76    pub is_rec: bool,
77    /// Parameter list
78    pub parameters: Vec<String>,
79    /// Bound expression
80    pub expression: Expression,
81    /// Source span
82    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83    pub span: Range<usize>,
84}
85
86/// F# expression
87#[derive(Debug, Clone, PartialEq)]
88#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
89pub enum Expression {
90    /// Literal or identifier
91    Simple(String),
92    /// If expression
93    If {
94        /// Condition expression
95        condition: Box<Expression>,
96        /// Then branch
97        then_branch: Box<Expression>,
98        /// Else branch
99        else_branch: Option<Box<Expression>>,
100    },
101}