Skip to main content

oak_fsharp/language/
mod.rs

1#![doc = include_str!("readme.md")]
2use oak_core::{Language, LanguageCategory};
3
4/// F# language implementation.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct FSharpLanguage {
8    /// Whether to enable F# 4.0 features.
9    pub fsharp_4_0: bool,
10    /// Whether to enable F# 4.1 features.
11    pub fsharp_4_1: bool,
12    /// Whether to enable F# 4.5 features.
13    pub fsharp_4_5: bool,
14    /// Whether to enable F# 5.0 features.
15    pub fsharp_5_0: bool,
16    /// Whether to enable F# 6.0 features.
17    pub fsharp_6_0: bool,
18    /// Whether to enable F# 7.0 features.
19    pub fsharp_7_0: bool,
20    /// Whether to enable computation expressions.
21    pub computation_expressions: bool,
22    /// Whether to enable type providers.
23    pub type_providers: bool,
24    /// Whether to enable async workflows.
25    pub async_workflows: bool,
26    /// Whether to enable query expressions.
27    pub query_expressions: bool,
28}
29
30impl Default for FSharpLanguage {
31    fn default() -> Self {
32        Self { fsharp_4_0: true, fsharp_4_1: true, fsharp_4_5: true, fsharp_5_0: true, fsharp_6_0: true, fsharp_7_0: true, computation_expressions: true, type_providers: true, async_workflows: true, query_expressions: true }
33    }
34}
35
36impl FSharpLanguage {
37    /// Creates a new F# language configuration.
38    pub fn new() -> Self {
39        Self::default()
40    }
41
42    /// Enables all F# features.
43    pub fn with_all_features(mut self) -> Self {
44        self.fsharp_4_0 = true;
45        self.fsharp_4_1 = true;
46        self.fsharp_4_5 = true;
47        self.fsharp_5_0 = true;
48        self.fsharp_6_0 = true;
49        self.fsharp_7_0 = true;
50        self.computation_expressions = true;
51        self.type_providers = true;
52        self.async_workflows = true;
53        self.query_expressions = true;
54        self
55    }
56
57    /// Sets the F# version.
58    pub fn with_version(mut self, major: u8, minor: u8) -> Self {
59        match (major, minor) {
60            (4, 0) => self.fsharp_4_0 = true,
61            (4, 1) => {
62                self.fsharp_4_0 = true;
63                self.fsharp_4_1 = true
64            }
65            (4, 5) => {
66                self.fsharp_4_0 = true;
67                self.fsharp_4_1 = true;
68                self.fsharp_4_5 = true
69            }
70            (5, 0) => {
71                self.fsharp_4_0 = true;
72                self.fsharp_4_1 = true;
73                self.fsharp_4_5 = true;
74                self.fsharp_5_0 = true
75            }
76            (6, 0) => {
77                self.fsharp_4_0 = true;
78                self.fsharp_4_1 = true;
79                self.fsharp_4_5 = true;
80                self.fsharp_5_0 = true;
81                self.fsharp_6_0 = true
82            }
83            (7, 0) => {
84                self.fsharp_4_0 = true;
85                self.fsharp_4_1 = true;
86                self.fsharp_4_5 = true;
87                self.fsharp_5_0 = true;
88                self.fsharp_6_0 = true;
89                self.fsharp_7_0 = true
90            }
91            _ => {}
92        }
93        self
94    }
95
96    /// Enables or disables computation expressions.
97    pub fn with_computation_expressions(mut self, enabled: bool) -> Self {
98        self.computation_expressions = enabled;
99        self
100    }
101
102    /// Enables or disables type providers.
103    pub fn with_type_providers(mut self, enabled: bool) -> Self {
104        self.type_providers = enabled;
105        self
106    }
107
108    /// Enables or disables async workflows.
109    pub fn with_async_workflows(mut self, enabled: bool) -> Self {
110        self.async_workflows = enabled;
111        self
112    }
113
114    /// Enables or disables query expressions.
115    pub fn with_query_expressions(mut self, enabled: bool) -> Self {
116        self.query_expressions = enabled;
117        self
118    }
119}
120
121impl Language for FSharpLanguage {
122    const NAME: &'static str = "fsharp";
123    const CATEGORY: LanguageCategory = LanguageCategory::Programming;
124
125    type TokenType = crate::lexer::token_type::FSharpTokenType;
126    type ElementType = crate::parser::element_type::FSharpElementType;
127    type TypedRoot = crate::ast::FSharpRoot;
128}