1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct TypeScriptRoot {
7 pub statements: Vec<Statement>,
8 #[serde(with = "oak_core::serde_range")]
9 pub span: Range<usize>,
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
13pub enum Statement {
14 VariableDeclaration(VariableDeclaration),
15 FunctionDeclaration(FunctionDeclaration),
16 ClassDeclaration(ClassDeclaration),
17 ExpressionStatement(Expression),
18 ImportDeclaration(ImportDeclaration),
19 ExportDeclaration(ExportDeclaration),
20 ReturnStatement(Option<Expression>),
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct ClassDeclaration {
25 pub name: String,
26 pub extends: Option<String>,
27 pub body: Vec<ClassMember>,
28 #[serde(with = "oak_core::serde_range")]
29 pub span: Range<usize>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub enum ClassMember {
34 Property {
35 name: String,
36 ty: Option<String>,
37 initializer: Option<Expression>,
38 #[serde(with = "oak_core::serde_range")]
39 span: Range<usize>,
40 },
41 Method {
42 name: String,
43 params: Vec<String>,
44 body: Vec<Statement>,
45 #[serde(with = "oak_core::serde_range")]
46 span: Range<usize>,
47 },
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct ImportDeclaration {
52 pub module_specifier: String,
53 pub imports: Vec<String>,
54 #[serde(with = "oak_core::serde_range")]
55 pub span: core::range::Range<usize>,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct ExportDeclaration {
60 pub declaration: Box<Statement>,
61 #[serde(with = "oak_core::serde_range")]
62 pub span: core::range::Range<usize>,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct VariableDeclaration {
67 pub name: String,
68 pub value: Option<Expression>,
69 #[serde(with = "oak_core::serde_range")]
70 pub span: Range<usize>,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct FunctionDeclaration {
75 pub name: String,
76 pub params: Vec<String>,
77 pub body: Vec<Statement>,
78 #[serde(with = "oak_core::serde_range")]
79 pub span: Range<usize>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub enum Expression {
84 Identifier(String),
85 NumericLiteral(f64),
86 StringLiteral(String),
87 BigIntLiteral(String),
88 BooleanLiteral(bool),
89 NullLiteral,
90 RegexLiteral(String),
91 TemplateString(String),
92 UnaryExpression { operator: String, argument: Box<Expression> },
93 BinaryExpression { left: Box<Expression>, operator: String, right: Box<Expression> },
94 ConditionalExpression { test: Box<Expression>, consequent: Box<Expression>, alternate: Box<Expression> },
95 MemberExpression { object: Box<Expression>, property: Box<Expression>, computed: bool, optional: bool },
96 CallExpression { func: Box<Expression>, args: Vec<Expression> },
97 NewExpression { func: Box<Expression>, args: Vec<Expression> },
98 AssignmentExpression { left: Box<Expression>, operator: String, right: Box<Expression> },
99 AsExpression { expression: Box<Expression>, type_annotation: String },
100}
101
102impl TypeScriptRoot {
103 pub fn new(span: Range<usize>) -> Self {
104 Self { statements: vec![], span }
105 }
106}