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 VbNetRoot {
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 Imports(ImportsDirective),
21 Class(ClassDeclaration),
23 Interface(InterfaceDeclaration),
25 Structure(StructureDeclaration),
27 Enum(EnumDeclaration),
29 Module(ModuleDeclaration),
31 Delegate(DelegateDeclaration),
33 Event(EventDeclaration),
35 Function(FunctionDeclaration),
37 Sub(SubDeclaration),
39 Property(PropertyDeclaration),
41 Variable(VariableDeclaration),
43}
44
45#[derive(Debug, Clone, PartialEq)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
48pub struct NamespaceDeclaration {
49 pub name: String,
51 pub items: Vec<Item>,
53 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55 pub span: Range<usize>,
56}
57
58#[derive(Debug, Clone, PartialEq)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
61pub struct ImportsDirective {
62 pub path: String,
64 pub alias: Option<String>,
66 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
68 pub span: Range<usize>,
69}
70
71#[derive(Debug, Clone, PartialEq)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub struct ClassDeclaration {
75 pub name: String,
77 pub attributes: Vec<Attribute>,
79 pub modifiers: Vec<String>,
81 pub base_types: Vec<String>,
83 pub members: Vec<Member>,
85 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
87 pub span: Range<usize>,
88}
89
90#[derive(Debug, Clone, PartialEq)]
92#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
93pub struct InterfaceDeclaration {
94 pub name: String,
96 pub attributes: Vec<Attribute>,
98 pub modifiers: Vec<String>,
100 pub members: Vec<Member>,
102 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
104 pub span: Range<usize>,
105}
106
107#[derive(Debug, Clone, PartialEq)]
109#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
110pub struct StructureDeclaration {
111 pub name: String,
113 pub attributes: Vec<Attribute>,
115 pub modifiers: Vec<String>,
117 pub members: Vec<Member>,
119 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
121 pub span: Range<usize>,
122}
123
124#[derive(Debug, Clone, PartialEq)]
126#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
127pub struct EnumDeclaration {
128 pub name: String,
130 pub attributes: Vec<Attribute>,
132 pub modifiers: Vec<String>,
134 pub members: Vec<EnumMember>,
136 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138 pub span: Range<usize>,
139}
140
141#[derive(Debug, Clone, PartialEq)]
143#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
144pub struct EnumMember {
145 pub name: String,
147 pub attributes: Vec<Attribute>,
149 pub value: Option<Expression>,
151}
152
153#[derive(Debug, Clone, PartialEq)]
155#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
156pub struct ModuleDeclaration {
157 pub name: String,
159 pub attributes: Vec<Attribute>,
161 pub modifiers: Vec<String>,
163 pub members: Vec<Member>,
165 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
167 pub span: Range<usize>,
168}
169
170#[derive(Debug, Clone, PartialEq)]
172#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
173pub struct DelegateDeclaration {
174 pub name: String,
176 pub attributes: Vec<Attribute>,
178 pub modifiers: Vec<String>,
180 pub return_type: String,
182 pub parameters: Vec<Parameter>,
184 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
186 pub span: Range<usize>,
187}
188
189#[derive(Debug, Clone, PartialEq)]
191#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
192pub struct EventDeclaration {
193 pub name: String,
195 pub attributes: Vec<Attribute>,
197 pub event_type: String,
199 pub modifiers: Vec<String>,
201 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
203 pub span: Range<usize>,
204}
205
206#[derive(Debug, Clone, PartialEq)]
208#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
209pub struct FunctionDeclaration {
210 pub name: String,
212 pub attributes: Vec<Attribute>,
214 pub modifiers: Vec<String>,
216 pub return_type: String,
218 pub parameters: Vec<Parameter>,
220 pub body: Option<Vec<Statement>>,
222 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
224 pub span: Range<usize>,
225}
226
227#[derive(Debug, Clone, PartialEq)]
229#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
230pub struct SubDeclaration {
231 pub name: String,
233 pub attributes: Vec<Attribute>,
235 pub modifiers: Vec<String>,
237 pub parameters: Vec<Parameter>,
239 pub body: Option<Vec<Statement>>,
241 #[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(serde::Serialize, serde::Deserialize))]
249pub struct PropertyDeclaration {
250 pub name: String,
252 pub attributes: Vec<Attribute>,
254 pub property_type: String,
256 pub modifiers: Vec<String>,
258 pub get_accessor: Option<Accessor>,
260 pub set_accessor: Option<Accessor>,
262 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
264 pub span: Range<usize>,
265}
266
267#[derive(Debug, Clone, PartialEq)]
269#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
270pub struct VariableDeclaration {
271 pub name: String,
273 pub attributes: Vec<Attribute>,
275 pub variable_type: String,
277 pub modifiers: Vec<String>,
279 pub initializer: Option<Expression>,
281 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
283 pub span: Range<usize>,
284}
285
286#[derive(Debug, Clone, PartialEq)]
288#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
289pub enum Member {
290 Event(EventDeclaration),
292 Function(FunctionDeclaration),
294 Sub(SubDeclaration),
296 Property(PropertyDeclaration),
298 Variable(VariableDeclaration),
300}
301
302#[derive(Debug, Clone, PartialEq)]
304#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
305pub struct Accessor {
306 pub attributes: Vec<Attribute>,
308 pub body: Option<Vec<Statement>>,
310 pub modifiers: Vec<String>,
312}
313
314#[derive(Debug, Clone, PartialEq)]
316#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
317pub struct Parameter {
318 pub attributes: Vec<Attribute>,
320 pub name: String,
322 pub parameter_type: String,
324 pub modifiers: Vec<String>,
326 pub default_value: Option<Expression>,
328}
329
330#[derive(Debug, Clone, PartialEq)]
332#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
333pub struct Attribute {
334 pub name: String,
336 pub arguments: Vec<Expression>,
338 #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
340 pub span: Range<usize>,
341}
342
343#[derive(Debug, Clone, PartialEq)]
345#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
346pub enum Statement {
347 Expression(Expression),
349 Return(Option<Expression>),
351 If {
353 condition: Expression,
355 then_branch: Box<Statement>,
357 else_branch: Option<Box<Statement>>,
359 },
360 For {
362 variable: String,
364 start: Expression,
366 end: Expression,
368 step: Option<Expression>,
370 body: Box<Statement>,
372 },
373 ForEach {
375 variable: String,
377 iterable: Expression,
379 body: Box<Statement>,
381 },
382 While {
384 condition: Expression,
386 body: Box<Statement>,
388 },
389 DoWhile {
391 condition: Expression,
393 body: Box<Statement>,
395 check_at_end: bool,
397 },
398 SelectCase {
400 expression: Expression,
402 cases: Vec<CaseClause>,
404 default_case: Option<Box<Statement>>,
406 },
407 With {
409 target: Expression,
411 statements: Vec<Statement>,
413 },
414 Try {
416 try_block: Vec<Statement>,
418 catch_clauses: Vec<CatchClause>,
420 finally_block: Option<Vec<Statement>>,
422 },
423 Dim(VariableDeclaration),
425 Const {
427 name: String,
429 constant_type: String,
431 value: Expression,
433 },
434 Exit(String),
436 Continue(String),
438 Block(Vec<Statement>),
440}
441
442#[derive(Debug, Clone, PartialEq)]
444#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
445pub struct CaseClause {
446 expressions: Vec<Expression>,
448 body: Box<Statement>,
450}
451
452#[derive(Debug, Clone, PartialEq)]
454#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
455pub struct CatchClause {
456 variable: Option<String>,
458 exception_type: Option<String>,
460 body: Vec<Statement>,
462}
463
464#[derive(Debug, Clone, PartialEq)]
466#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
467pub enum Expression {
468 Literal(Literal),
470 Identifier(String),
472 MethodCall(MethodCall),
474 MemberAccess(MemberAccess),
476 ElementAccess(ElementAccess),
478 New(NewExpression),
480 Me,
482 MyBase,
484 MyClass,
486 Binary {
488 left: Box<Expression>,
490 op: String,
492 right: Box<Expression>,
494 },
495 Unary {
497 op: String,
499 expression: Box<Expression>,
501 },
502 Assignment {
504 left: Box<Expression>,
506 op: String,
508 right: Box<Expression>,
510 },
511 Array(Vec<Expression>),
513 Tuple(Vec<Expression>),
515 Parenthesized(Box<Expression>),
517 TypeOf(Box<Expression>, String),
519 Is(Box<Expression>, Box<Expression>),
521 Like(Box<Expression>, Box<Expression>),
523 If {
525 condition: Box<Expression>,
527 true_expression: Box<Expression>,
529 false_expression: Box<Expression>,
531 },
532}
533
534#[derive(Debug, Clone, PartialEq)]
536#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
537pub enum Literal {
538 Integer(i64),
540 String(String),
542 Boolean(bool),
544 Double(f64),
546 Date(String),
548 Nothing,
550}
551
552#[derive(Debug, Clone, PartialEq)]
554#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
555pub struct MemberAccess {
556 pub target: Box<Expression>,
558 pub name: String,
560}
561
562#[derive(Debug, Clone, PartialEq)]
564#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
565pub struct MethodCall {
566 pub target: Option<Box<Expression>>,
568 pub name: String,
570 pub arguments: Vec<Expression>,
572}
573
574#[derive(Debug, Clone, PartialEq)]
576#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
577pub struct ElementAccess {
578 pub target: Box<Expression>,
580 pub arguments: Vec<Expression>,
582}
583
584#[derive(Debug, Clone, PartialEq)]
586#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
587pub struct NewExpression {
588 pub r#type: String,
590 pub arguments: Vec<Expression>,
592}