1#![doc = include_str!("readme.md")]
2
3use core::range::Range;
4
5#[derive(Debug, Clone, PartialEq)]
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8pub struct CSharpRoot {
9 pub items: Vec<Item>,
11}
12
13#[derive(Debug, Clone, PartialEq)]
15#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
16pub enum Item {
17 Namespace(NamespaceDeclaration),
19 Using(UsingDirective),
21 Class(ClassDeclaration),
23 Interface(InterfaceDeclaration),
25 Struct(StructDeclaration),
27 Enum(EnumDeclaration),
29 Record(RecordDeclaration),
31 Delegate(DelegateDeclaration),
33}
34
35#[derive(Debug, Clone, PartialEq)]
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::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)]
58#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59pub struct UsingDirective {
60 pub path: String,
62 pub is_static: bool,
64 pub alias: Option<String>,
66 pub is_global: bool,
68 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70 pub span: Range<usize>,
71}
72
73#[derive(Debug, Clone, PartialEq)]
78#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
79pub struct ClassDeclaration {
80 pub name: String,
82 pub attributes: Vec<Attribute>,
84 pub modifiers: Vec<String>,
86 pub base_types: Vec<String>,
88 pub type_parameters: Vec<TypeParameter>,
90 pub constraints: Vec<TypeParameterConstraint>,
92 pub members: Vec<Member>,
94 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
96 pub span: Range<usize>,
97}
98
99#[derive(Debug, Clone, PartialEq)]
104#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
105pub struct StructDeclaration {
106 pub name: String,
108 pub attributes: Vec<Attribute>,
110 pub modifiers: Vec<String>,
112 pub members: Vec<Member>,
114 pub type_parameters: Vec<TypeParameter>,
116 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118 pub span: Range<usize>,
119}
120
121#[derive(Debug, Clone, PartialEq)]
126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
127pub struct InterfaceDeclaration {
128 pub name: String,
130 pub attributes: Vec<Attribute>,
132 pub modifiers: Vec<String>,
134 pub members: Vec<Member>,
136 pub type_parameters: Vec<TypeParameter>,
138 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
140 pub span: Range<usize>,
141}
142
143#[derive(Debug, Clone, PartialEq)]
148#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
149pub struct EnumDeclaration {
150 pub name: String,
152 pub attributes: Vec<Attribute>,
154 pub modifiers: Vec<String>,
156 pub members: Vec<EnumMember>,
158 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
160 pub span: Range<usize>,
161}
162
163#[derive(Debug, Clone, PartialEq)]
165#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
166pub struct EnumMember {
167 pub name: String,
169 pub attributes: Vec<Attribute>,
171 pub value: Option<Expression>,
173}
174
175#[derive(Debug, Clone, PartialEq)]
180#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
181pub struct RecordDeclaration {
182 pub name: String,
184 pub attributes: Vec<Attribute>,
186 pub modifiers: Vec<String>,
188 pub members: Vec<Member>,
190 pub type_parameters: Vec<TypeParameter>,
192 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
194 pub span: Range<usize>,
195}
196
197#[derive(Debug, Clone, PartialEq)]
202#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
203pub struct DelegateDeclaration {
204 pub name: String,
206 pub attributes: Vec<Attribute>,
208 pub modifiers: Vec<String>,
210 pub return_type: String,
212 pub type_parameters: Vec<TypeParameter>,
214 pub parameters: Vec<Parameter>,
216 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
218 pub span: Range<usize>,
219}
220
221#[derive(Debug, Clone, PartialEq)]
226#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
227pub enum Member {
228 Method(MethodDeclaration),
230 Field(FieldDeclaration),
232 Property(PropertyDeclaration),
234 Indexer(IndexerDeclaration),
236 Constructor(MethodDeclaration),
238 Event(EventDeclaration),
240}
241
242#[derive(Debug, Clone, PartialEq)]
247#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
248pub struct MethodDeclaration {
249 pub name: String,
251 pub attributes: Vec<Attribute>,
253 pub modifiers: Vec<String>,
255 pub return_type: String,
257 pub type_parameters: Vec<TypeParameter>,
259 pub parameters: Vec<Parameter>,
261 pub body: Option<Vec<Statement>>,
263 pub is_async: bool,
265 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
267 pub span: Range<usize>,
268}
269
270#[derive(Debug, Clone, PartialEq)]
274#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
275pub struct PropertyDeclaration {
276 pub name: String,
278 pub attributes: Vec<Attribute>,
280 pub r#type: String,
282 pub modifiers: Vec<String>,
284 pub get_accessor: Option<Accessor>,
286 pub set_accessor: Option<Accessor>,
288 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
290 pub span: Range<usize>,
291}
292
293#[derive(Debug, Clone, PartialEq)]
298#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
299pub struct Accessor {
300 pub attributes: Vec<Attribute>,
302 pub body: Option<Vec<Statement>>,
304 pub modifiers: Vec<String>,
306}
307
308#[derive(Debug, Clone, PartialEq)]
313#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
314pub struct IndexerDeclaration {
315 pub attributes: Vec<Attribute>,
317 pub r#type: String,
319 pub parameters: Vec<Parameter>,
321 pub get_accessor: Option<Accessor>,
323 pub set_accessor: Option<Accessor>,
325 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
327 pub span: Range<usize>,
328}
329
330#[derive(Debug, Clone, PartialEq)]
335#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
336pub struct EventDeclaration {
337 pub name: String,
339 pub attributes: Vec<Attribute>,
341 pub r#type: String,
343 pub modifiers: Vec<String>,
345 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
347 pub span: Range<usize>,
348}
349
350#[derive(Debug, Clone, PartialEq)]
354#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
355pub struct Parameter {
356 pub attributes: Vec<Attribute>,
358 pub name: String,
360 pub r#type: String,
362 pub modifiers: Vec<String>,
364 pub default_value: Option<Expression>,
366}
367
368#[derive(Debug, Clone, PartialEq)]
372#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
373pub struct FieldDeclaration {
374 pub name: String,
376 pub attributes: Vec<Attribute>,
378 pub r#type: String,
380 pub modifiers: Vec<String>,
382 pub initializer: Option<Expression>,
384 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
386 pub span: Range<usize>,
387}
388
389#[derive(Debug, Clone, PartialEq)]
393#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
394pub struct Attribute {
395 pub name: String,
397 pub arguments: Vec<Expression>,
399 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
401 pub span: Range<usize>,
402}
403
404#[derive(Debug, Clone, PartialEq)]
408#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
409pub struct TypeParameter {
410 pub name: String,
412 pub attributes: Vec<Attribute>,
414 pub variance: Option<String>,
416}
417
418#[derive(Debug, Clone, PartialEq)]
422#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
423pub struct TypeParameterConstraint {
424 pub parameter_name: String,
426 pub constraints: Vec<String>,
428}
429
430#[derive(Debug, Clone, PartialEq)]
434#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
435pub enum Statement {
436 Expression(Expression),
438 Return(Option<Expression>),
440 Block(Vec<Statement>),
442 If {
444 condition: Expression,
446 then_branch: Box<Statement>,
448 else_branch: Option<Box<Statement>>,
450 },
451 While {
453 condition: Expression,
455 body: Box<Statement>,
457 },
458 For {
460 init: Option<Box<Statement>>,
462 condition: Option<Expression>,
464 update: Option<Expression>,
466 body: Box<Statement>,
468 },
469 Foreach {
471 item_type: String,
473 item_name: String,
475 iterable: Expression,
477 body: Box<Statement>,
479 },
480 LocalVariable {
482 r#type: String,
484 name: String,
486 initializer: Option<Expression>,
488 },
489 Break,
491 Continue,
493}
494
495#[derive(Debug, Clone, PartialEq)]
499#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
500pub enum Expression {
501 Literal(Literal),
503 Identifier(String),
505 MethodCall(MethodCall),
507 MemberAccess(MemberAccess),
509 ElementAccess(ElementAccess),
511 New(NewExpression),
513 This,
515 Base,
517 Binary {
519 left: Box<Expression>,
521 op: String,
523 right: Box<Expression>,
525 },
526 Unary {
528 op: String,
530 expression: Box<Expression>,
532 },
533 Assignment {
535 left: Box<Expression>,
537 op: String,
539 right: Box<Expression>,
541 },
542 Await(Box<Expression>),
544 Query(Box<QueryExpression>),
546}
547
548#[derive(Debug, Clone, PartialEq)]
552#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
553pub struct QueryExpression {
554 pub from_clause: FromClause,
556 pub body: QueryBody,
558}
559
560#[derive(Debug, Clone, PartialEq)]
564#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
565pub struct FromClause {
566 pub identifier: String,
568 pub expression: Box<Expression>,
570}
571
572#[derive(Debug, Clone, PartialEq)]
576#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
577pub struct QueryBody {
578 pub clauses: Vec<QueryClause>,
580 pub select_or_group: SelectOrGroupClause,
582 pub continuation: Option<String>,
584}
585
586#[derive(Debug, Clone, PartialEq)]
590#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
591pub enum QueryClause {
592 From(FromClause),
594 Let(LetClause),
596 Where(Expression),
598 Join(JoinClause),
600 OrderBy(Vec<Ordering>),
602}
603
604#[derive(Debug, Clone, PartialEq)]
606#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
607pub enum QueryClauseExt {
608 GroupBy(Expression),
610}
611
612#[derive(Debug, Clone, PartialEq)]
616#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
617pub struct LetClause {
618 pub identifier: String,
620 pub expression: Expression,
622}
623
624#[derive(Debug, Clone, PartialEq)]
628#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
629pub struct JoinClause {
630 pub identifier: String,
632 pub in_expression: Expression,
634 pub on_expression: Expression,
636 pub equals_expression: Expression,
638 pub into_identifier: Option<String>,
640}
641
642#[derive(Debug, Clone, PartialEq)]
646#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
647pub struct Ordering {
648 pub expression: Expression,
650 pub ascending: bool,
652}
653
654#[derive(Debug, Clone, PartialEq)]
658#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
659pub enum SelectOrGroupClause {
660 Select(Expression),
662 Group {
664 expression: Expression,
666 by_expression: Expression,
668 },
669}
670
671#[derive(Debug, Clone, PartialEq)]
675#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
676pub struct NewExpression {
677 pub r#type: String,
679 pub arguments: Vec<Expression>,
681}
682
683#[derive(Debug, Clone, PartialEq)]
687#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
688pub enum Literal {
689 Integer(i64),
691 String(String),
693 Boolean(bool),
695 Null,
697}
698
699#[derive(Debug, Clone, PartialEq)]
703#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
704pub struct MemberAccess {
705 pub target: Box<Expression>,
707 pub name: String,
709}
710
711#[derive(Debug, Clone, PartialEq)]
715#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
716pub struct MethodCall {
717 pub target: Option<Box<Expression>>,
719 pub name: String,
721 pub arguments: Vec<Expression>,
723}
724
725#[derive(Debug, Clone, PartialEq)]
729#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
730pub struct ElementAccess {
731 pub target: Box<Expression>,
733 pub arguments: Vec<Expression>,
735}