1#![doc = include_str!("readme.md")]
2use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct CSharpRoot {
12 pub items: Vec<Item>,
14}
15
16#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub enum Item {
20 Namespace(NamespaceDeclaration),
22 Using(UsingDirective),
24 Class(ClassDeclaration),
26 Interface(InterfaceDeclaration),
28 Struct(StructDeclaration),
30 Enum(EnumDeclaration),
32 Record(RecordDeclaration),
34 Delegate(DelegateDeclaration),
36}
37
38#[derive(Debug, Clone, PartialEq)]
40#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
41pub struct NamespaceDeclaration {
42 pub name: String,
44 pub attributes: Vec<Attribute>,
46 pub items: Vec<Item>,
48 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
50 pub span: Range<usize>,
51}
52
53#[derive(Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct UsingDirective {
57 pub path: String,
59 pub is_static: bool,
61 pub alias: Option<String>,
63 pub is_global: bool,
65 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
67 pub span: Range<usize>,
68}
69
70#[derive(Debug, Clone, PartialEq)]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73pub struct ClassDeclaration {
74 pub name: String,
76 pub attributes: Vec<Attribute>,
78 pub modifiers: Vec<String>,
80 pub base_types: Vec<String>,
82 pub type_parameters: Vec<TypeParameter>,
84 pub constraints: Vec<TypeParameterConstraint>,
86 pub members: Vec<Member>,
88 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
90 pub span: Range<usize>,
91}
92
93#[derive(Debug, Clone, PartialEq)]
95#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96pub struct StructDeclaration {
97 pub name: String,
98 pub attributes: Vec<Attribute>,
99 pub modifiers: Vec<String>,
100 pub members: Vec<Member>,
101 pub type_parameters: Vec<TypeParameter>,
102 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
103 pub span: Range<usize>,
104}
105
106#[derive(Debug, Clone, PartialEq)]
108#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
109pub struct InterfaceDeclaration {
110 pub name: String,
111 pub attributes: Vec<Attribute>,
112 pub modifiers: Vec<String>,
113 pub members: Vec<Member>,
114 pub type_parameters: Vec<TypeParameter>,
115 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
116 pub span: Range<usize>,
117}
118
119#[derive(Debug, Clone, PartialEq)]
121#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
122pub struct EnumDeclaration {
123 pub name: String,
124 pub attributes: Vec<Attribute>,
125 pub modifiers: Vec<String>,
126 pub members: Vec<EnumMember>,
127 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
128 pub span: Range<usize>,
129}
130
131#[derive(Debug, Clone, PartialEq)]
133#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
134pub struct EnumMember {
135 pub name: String,
136 pub attributes: Vec<Attribute>,
137 pub value: Option<Expression>,
138}
139
140#[derive(Debug, Clone, PartialEq)]
142#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
143pub struct RecordDeclaration {
144 pub name: String,
145 pub attributes: Vec<Attribute>,
146 pub modifiers: Vec<String>,
147 pub members: Vec<Member>,
148 pub type_parameters: Vec<TypeParameter>,
149 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
150 pub span: Range<usize>,
151}
152
153#[derive(Debug, Clone, PartialEq)]
155#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
156pub struct DelegateDeclaration {
157 pub name: String,
158 pub attributes: Vec<Attribute>,
159 pub modifiers: Vec<String>,
160 pub return_type: String,
161 pub type_parameters: Vec<TypeParameter>,
162 pub parameters: Vec<Parameter>,
163 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
164 pub span: Range<usize>,
165}
166
167#[derive(Debug, Clone, PartialEq)]
169#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
170pub enum Member {
171 Method(MethodDeclaration),
173 Field(FieldDeclaration),
175 Property(PropertyDeclaration),
177 Indexer(IndexerDeclaration),
179 Constructor(MethodDeclaration),
181 Event(EventDeclaration),
183}
184
185#[derive(Debug, Clone, PartialEq)]
187#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
188pub struct MethodDeclaration {
189 pub name: String,
191 pub attributes: Vec<Attribute>,
193 pub modifiers: Vec<String>,
195 pub return_type: String,
197 pub type_parameters: Vec<TypeParameter>,
199 pub parameters: Vec<Parameter>,
201 pub body: Option<Vec<Statement>>,
203 pub is_async: bool,
205 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
207 pub span: Range<usize>,
208}
209
210#[derive(Debug, Clone, PartialEq)]
212#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
213pub struct PropertyDeclaration {
214 pub name: String,
215 pub attributes: Vec<Attribute>,
216 pub r#type: String,
217 pub modifiers: Vec<String>,
218 pub get_accessor: Option<Accessor>,
219 pub set_accessor: Option<Accessor>,
220 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
221 pub span: Range<usize>,
222}
223
224#[derive(Debug, Clone, PartialEq)]
226#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
227pub struct Accessor {
228 pub attributes: Vec<Attribute>,
229 pub body: Option<Vec<Statement>>,
230 pub modifiers: Vec<String>,
231}
232
233#[derive(Debug, Clone, PartialEq)]
235#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
236pub struct IndexerDeclaration {
237 pub attributes: Vec<Attribute>,
238 pub r#type: String,
239 pub parameters: Vec<Parameter>,
240 pub get_accessor: Option<Accessor>,
241 pub set_accessor: Option<Accessor>,
242 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
243 pub span: Range<usize>,
244}
245
246#[derive(Debug, Clone, PartialEq)]
248#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
249pub struct EventDeclaration {
250 pub name: String,
251 pub attributes: Vec<Attribute>,
252 pub r#type: String,
253 pub modifiers: Vec<String>,
254 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
255 pub span: Range<usize>,
256}
257
258#[derive(Debug, Clone, PartialEq)]
260#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
261pub struct Parameter {
262 pub attributes: Vec<Attribute>,
264 pub name: String,
266 pub r#type: String,
268 pub modifiers: Vec<String>,
270 pub default_value: Option<Expression>,
272}
273
274#[derive(Debug, Clone, PartialEq)]
276#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
277pub struct FieldDeclaration {
278 pub name: String,
279 pub attributes: Vec<Attribute>,
280 pub r#type: String,
281 pub modifiers: Vec<String>,
282 pub initializer: Option<Expression>,
283 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
284 pub span: Range<usize>,
285}
286
287#[derive(Debug, Clone, PartialEq)]
289#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
290pub struct Attribute {
291 pub name: String,
292 pub arguments: Vec<Expression>,
293}
294
295#[derive(Debug, Clone, PartialEq)]
297#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
298pub struct TypeParameter {
299 pub name: String,
300 pub attributes: Vec<Attribute>,
301 pub variance: Option<String>, }
303
304#[derive(Debug, Clone, PartialEq)]
306#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
307pub struct TypeParameterConstraint {
308 pub parameter_name: String,
309 pub constraints: Vec<String>,
310}
311
312#[derive(Debug, Clone, PartialEq)]
314#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
315pub enum Statement {
316 Expression(Expression),
318 Return(Option<Expression>),
320 Block(Vec<Statement>),
322 If { condition: Expression, then_branch: Box<Statement>, else_branch: Option<Box<Statement>> },
324 While { condition: Expression, body: Box<Statement> },
326 For { init: Option<Box<Statement>>, condition: Option<Expression>, update: Option<Expression>, body: Box<Statement> },
328 Foreach { item_type: String, item_name: String, iterable: Expression, body: Box<Statement> },
330 LocalVariable { r#type: String, name: String, initializer: Option<Expression> },
332 Break,
334 Continue,
336}
337
338#[derive(Debug, Clone, PartialEq)]
340#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
341pub enum Expression {
342 Literal(Literal),
344 Identifier(String),
346 MethodCall(MethodCall),
348 MemberAccess(MemberAccess),
350 ElementAccess(ElementAccess),
352 New(NewExpression),
354 This,
356 Base,
358 Binary { left: Box<Expression>, op: String, right: Box<Expression> },
360 Unary { op: String, expression: Box<Expression> },
362 Assignment { left: Box<Expression>, op: String, right: Box<Expression> },
364 Await(Box<Expression>),
366 Query(Box<QueryExpression>),
368}
369
370#[derive(Debug, Clone, PartialEq)]
372#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
373pub struct QueryExpression {
374 pub from_clause: FromClause,
375 pub body: QueryBody,
376}
377
378#[derive(Debug, Clone, PartialEq)]
379#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
380pub struct FromClause {
381 pub identifier: String,
382 pub expression: Box<Expression>,
383}
384
385#[derive(Debug, Clone, PartialEq)]
386#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
387pub struct QueryBody {
388 pub clauses: Vec<QueryClause>,
389 pub select_or_group: SelectOrGroupClause,
390 pub continuation: Option<String>,
391}
392
393#[derive(Debug, Clone, PartialEq)]
394#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
395pub enum QueryClause {
396 From(FromClause),
397 Let(LetClause),
398 Where(Expression),
399 Join(JoinClause),
400 OrderBy(Vec<Ordering>),
401}
402
403#[derive(Debug, Clone, PartialEq)]
404#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
405pub enum QueryClauseExt {
406 GroupBy(Expression),
407}
408
409#[derive(Debug, Clone, PartialEq)]
410#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
411pub struct LetClause {
412 pub identifier: String,
413 pub expression: Expression,
414}
415
416#[derive(Debug, Clone, PartialEq)]
417#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
418pub struct JoinClause {
419 pub identifier: String,
420 pub in_expression: Expression,
421 pub on_expression: Expression,
422 pub equals_expression: Expression,
423 pub into_identifier: Option<String>,
424}
425
426#[derive(Debug, Clone, PartialEq)]
427#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
428pub struct Ordering {
429 pub expression: Expression,
430 pub ascending: bool,
431}
432
433#[derive(Debug, Clone, PartialEq)]
434#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
435pub enum SelectOrGroupClause {
436 Select(Expression),
437 Group { expression: Expression, by_expression: Expression },
438}
439
440#[derive(Debug, Clone, PartialEq)]
442#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
443pub struct NewExpression {
444 pub r#type: String,
445 pub arguments: Vec<Expression>,
446}
447
448#[derive(Debug, Clone, PartialEq)]
450#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
451pub enum Literal {
452 Integer(i64),
453 String(String),
454 Boolean(bool),
455 Null,
456}
457
458#[derive(Debug, Clone, PartialEq)]
460#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
461pub struct MemberAccess {
462 pub target: Box<Expression>,
463 pub name: String,
464}
465
466#[derive(Debug, Clone, PartialEq)]
468#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
469pub struct MethodCall {
470 pub target: Option<Box<Expression>>,
471 pub name: String,
472 pub arguments: Vec<Expression>,
473}
474
475#[derive(Debug, Clone, PartialEq)]
477#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
478pub struct ElementAccess {
479 pub target: Box<Expression>,
480 pub arguments: Vec<Expression>,
481}