Skip to main content

oak_typescript/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3
4/// TypeScript AST 根节点
5#[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}