oak_fsharp/language/
mod.rs1#![doc = include_str!("readme.md")]
2use oak_core::{Language, LanguageCategory};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct FSharpLanguage {
8 pub fsharp_4_0: bool,
10 pub fsharp_4_1: bool,
12 pub fsharp_4_5: bool,
14 pub fsharp_5_0: bool,
16 pub fsharp_6_0: bool,
18 pub fsharp_7_0: bool,
20 pub computation_expressions: bool,
22 pub type_providers: bool,
24 pub async_workflows: bool,
26 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 pub fn new() -> Self {
39 Self::default()
40 }
41
42 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 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 pub fn with_computation_expressions(mut self, enabled: bool) -> Self {
98 self.computation_expressions = enabled;
99 self
100 }
101
102 pub fn with_type_providers(mut self, enabled: bool) -> Self {
104 self.type_providers = enabled;
105 self
106 }
107
108 pub fn with_async_workflows(mut self, enabled: bool) -> Self {
110 self.async_workflows = enabled;
111 self
112 }
113
114 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}