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)]
43#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
44pub struct NamespaceDeclaration {
45 pub name: String,
47 pub attributes: Vec<Attribute>,
49 pub items: Vec<Item>,
51 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
53 pub span: Range<usize>,
54}
55
56#[derive(Debug, Clone, PartialEq)]
61#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
62pub struct UsingDirective {
63 pub path: String,
65 pub is_static: bool,
67 pub alias: Option<String>,
69 pub is_global: bool,
71 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
73 pub span: Range<usize>,
74}
75
76#[derive(Debug, Clone, PartialEq)]
81#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
82pub struct ClassDeclaration {
83 pub name: String,
85 pub attributes: Vec<Attribute>,
87 pub modifiers: Vec<String>,
89 pub base_types: Vec<String>,
91 pub type_parameters: Vec<TypeParameter>,
93 pub constraints: Vec<TypeParameterConstraint>,
95 pub members: Vec<Member>,
97 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
99 pub span: Range<usize>,
100}
101
102#[derive(Debug, Clone, PartialEq)]
107#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
108pub struct StructDeclaration {
109 pub name: String,
111 pub attributes: Vec<Attribute>,
113 pub modifiers: Vec<String>,
115 pub members: Vec<Member>,
117 pub type_parameters: Vec<TypeParameter>,
119 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
121 pub span: Range<usize>,
122}
123
124#[derive(Debug, Clone, PartialEq)]
129#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
130pub struct InterfaceDeclaration {
131 pub name: String,
133 pub attributes: Vec<Attribute>,
135 pub modifiers: Vec<String>,
137 pub members: Vec<Member>,
139 pub type_parameters: Vec<TypeParameter>,
141 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
143 pub span: Range<usize>,
144}
145
146#[derive(Debug, Clone, PartialEq)]
151#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
152pub struct EnumDeclaration {
153 pub name: String,
155 pub attributes: Vec<Attribute>,
157 pub modifiers: Vec<String>,
159 pub members: Vec<EnumMember>,
161 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
163 pub span: Range<usize>,
164}
165
166#[derive(Debug, Clone, PartialEq)]
168#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
169pub struct EnumMember {
170 pub name: String,
172 pub attributes: Vec<Attribute>,
174 pub value: Option<Expression>,
176}
177
178#[derive(Debug, Clone, PartialEq)]
183#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
184pub struct RecordDeclaration {
185 pub name: String,
187 pub attributes: Vec<Attribute>,
189 pub modifiers: Vec<String>,
191 pub members: Vec<Member>,
193 pub type_parameters: Vec<TypeParameter>,
195 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
197 pub span: Range<usize>,
198}
199
200#[derive(Debug, Clone, PartialEq)]
205#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
206pub struct DelegateDeclaration {
207 pub name: String,
209 pub attributes: Vec<Attribute>,
211 pub modifiers: Vec<String>,
213 pub return_type: String,
215 pub type_parameters: Vec<TypeParameter>,
217 pub parameters: Vec<Parameter>,
219 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
221 pub span: Range<usize>,
222}
223
224#[derive(Debug, Clone, PartialEq)]
229#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
230pub enum Member {
231 Method(MethodDeclaration),
233 Field(FieldDeclaration),
235 Property(PropertyDeclaration),
237 Indexer(IndexerDeclaration),
239 Constructor(MethodDeclaration),
241 Event(EventDeclaration),
243}
244
245#[derive(Debug, Clone, PartialEq)]
250#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
251pub struct MethodDeclaration {
252 pub name: String,
254 pub attributes: Vec<Attribute>,
256 pub modifiers: Vec<String>,
258 pub return_type: String,
260 pub type_parameters: Vec<TypeParameter>,
262 pub parameters: Vec<Parameter>,
264 pub body: Option<Vec<Statement>>,
266 pub is_async: bool,
268 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
270 pub span: Range<usize>,
271}
272
273#[derive(Debug, Clone, PartialEq)]
277#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
278pub struct PropertyDeclaration {
279 pub name: String,
281 pub attributes: Vec<Attribute>,
283 pub r#type: String,
285 pub modifiers: Vec<String>,
287 pub get_accessor: Option<Accessor>,
289 pub set_accessor: Option<Accessor>,
291 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
293 pub span: Range<usize>,
294}
295
296#[derive(Debug, Clone, PartialEq)]
301#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
302pub struct Accessor {
303 pub attributes: Vec<Attribute>,
305 pub body: Option<Vec<Statement>>,
307 pub modifiers: Vec<String>,
309}
310
311#[derive(Debug, Clone, PartialEq)]
316#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
317pub struct IndexerDeclaration {
318 pub attributes: Vec<Attribute>,
320 pub r#type: String,
322 pub parameters: Vec<Parameter>,
324 pub get_accessor: Option<Accessor>,
326 pub set_accessor: Option<Accessor>,
328 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
330 pub span: Range<usize>,
331}
332
333#[derive(Debug, Clone, PartialEq)]
338#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
339pub struct EventDeclaration {
340 pub name: String,
342 pub attributes: Vec<Attribute>,
344 pub r#type: String,
346 pub modifiers: Vec<String>,
348 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
350 pub span: Range<usize>,
351}
352
353#[derive(Debug, Clone, PartialEq)]
357#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
358pub struct Parameter {
359 pub attributes: Vec<Attribute>,
361 pub name: String,
363 pub r#type: String,
365 pub modifiers: Vec<String>,
367 pub default_value: Option<Expression>,
369}
370
371#[derive(Debug, Clone, PartialEq)]
375#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
376pub struct FieldDeclaration {
377 pub name: String,
379 pub attributes: Vec<Attribute>,
381 pub r#type: String,
383 pub modifiers: Vec<String>,
385 pub initializer: Option<Expression>,
387 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
389 pub span: Range<usize>,
390}
391
392#[derive(Debug, Clone, PartialEq)]
396#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
397pub struct Attribute {
398 pub name: String,
400 pub arguments: Vec<Expression>,
402 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
404 pub span: Range<usize>,
405}
406
407#[derive(Debug, Clone, PartialEq)]
411#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
412pub struct TypeParameter {
413 pub name: String,
415 pub attributes: Vec<Attribute>,
417 pub variance: Option<String>,
419}
420
421#[derive(Debug, Clone, PartialEq)]
425#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
426pub struct TypeParameterConstraint {
427 pub parameter_name: String,
429 pub constraints: Vec<String>,
431}
432
433#[derive(Debug, Clone, PartialEq)]
437#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
438pub enum Statement {
439 Expression(Expression),
441 Return(Option<Expression>),
443 Block(Vec<Statement>),
445 If {
447 condition: Expression,
449 then_branch: Box<Statement>,
451 else_branch: Option<Box<Statement>>,
453 },
454 While {
456 condition: Expression,
458 body: Box<Statement>,
460 },
461 For {
463 init: Option<Box<Statement>>,
465 condition: Option<Expression>,
467 update: Option<Expression>,
469 body: Box<Statement>,
471 },
472 Foreach {
474 item_type: String,
476 item_name: String,
478 iterable: Expression,
480 body: Box<Statement>,
482 },
483 LocalVariable {
485 r#type: String,
487 name: String,
489 initializer: Option<Expression>,
491 },
492 Break,
494 Continue,
496}
497
498#[derive(Debug, Clone, PartialEq)]
502#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
503pub enum Expression {
504 Literal(Literal),
506 Identifier(String),
508 MethodCall(MethodCall),
510 MemberAccess(MemberAccess),
512 ElementAccess(ElementAccess),
514 New(NewExpression),
516 This,
518 Base,
520 Binary {
522 left: Box<Expression>,
524 op: String,
526 right: Box<Expression>,
528 },
529 Unary {
531 op: String,
533 expression: Box<Expression>,
535 },
536 Assignment {
538 left: Box<Expression>,
540 op: String,
542 right: Box<Expression>,
544 },
545 Await(Box<Expression>),
547 Query(Box<QueryExpression>),
549}
550
551#[derive(Debug, Clone, PartialEq)]
555#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
556pub struct QueryExpression {
557 pub from_clause: FromClause,
559 pub body: QueryBody,
561}
562
563#[derive(Debug, Clone, PartialEq)]
567#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
568pub struct FromClause {
569 pub identifier: String,
571 pub expression: Box<Expression>,
573}
574
575#[derive(Debug, Clone, PartialEq)]
579#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
580pub struct QueryBody {
581 pub clauses: Vec<QueryClause>,
583 pub select_or_group: SelectOrGroupClause,
585 pub continuation: Option<String>,
587}
588
589#[derive(Debug, Clone, PartialEq)]
593#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
594pub enum QueryClause {
595 From(FromClause),
597 Let(LetClause),
599 Where(Expression),
601 Join(JoinClause),
603 OrderBy(Vec<Ordering>),
605}
606
607#[derive(Debug, Clone, PartialEq)]
609#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
610pub enum QueryClauseExt {
611 GroupBy(Expression),
613}
614
615#[derive(Debug, Clone, PartialEq)]
619#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
620pub struct LetClause {
621 pub identifier: String,
623 pub expression: Expression,
625}
626
627#[derive(Debug, Clone, PartialEq)]
631#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
632pub struct JoinClause {
633 pub identifier: String,
635 pub in_expression: Expression,
637 pub on_expression: Expression,
639 pub equals_expression: Expression,
641 pub into_identifier: Option<String>,
643}
644
645#[derive(Debug, Clone, PartialEq)]
649#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
650pub struct Ordering {
651 pub expression: Expression,
653 pub ascending: bool,
655}
656
657#[derive(Debug, Clone, PartialEq)]
661#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
662pub enum SelectOrGroupClause {
663 Select(Expression),
665 Group {
667 expression: Expression,
669 by_expression: Expression,
671 },
672}
673
674#[derive(Debug, Clone, PartialEq)]
678#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
679pub struct NewExpression {
680 pub r#type: String,
682 pub arguments: Vec<Expression>,
684}
685
686#[derive(Debug, Clone, PartialEq)]
690#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
691pub enum Literal {
692 Integer(i64),
694 String(String),
696 Boolean(bool),
698 Null,
700}
701
702#[derive(Debug, Clone, PartialEq)]
706#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
707pub struct MemberAccess {
708 pub target: Box<Expression>,
710 pub name: String,
712}
713
714#[derive(Debug, Clone, PartialEq)]
718#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
719pub struct MethodCall {
720 pub target: Option<Box<Expression>>,
722 pub name: String,
724 pub arguments: Vec<Expression>,
726}
727
728#[derive(Debug, Clone, PartialEq)]
732#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
733pub struct ElementAccess {
734 pub target: Box<Expression>,
736 pub arguments: Vec<Expression>,
738}