Skip to main content

oak_java/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2//! Java AST definitions
3
4use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8/// Java 程序的根节点
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct JavaRoot {
12    /// 编译单元中的项目
13    pub items: Vec<Item>,
14}
15
16/// Java 程序中的顶级项目
17#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub enum Item {
20    /// 类声明
21    Class(ClassDeclaration),
22    /// 接口声明
23    Interface(InterfaceDeclaration),
24    /// 结构体声明
25    Struct(StructDeclaration),
26    /// 枚举声明
27    Enum(EnumDeclaration),
28    /// 记录声明
29    Record(RecordDeclaration),
30    /// 包声明
31    Package(PackageDeclaration),
32    /// 导入声明
33    Import(ImportDeclaration),
34}
35
36/// 类声明
37#[derive(Debug, Clone, PartialEq)]
38#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
39pub struct ClassDeclaration {
40    /// 类名
41    pub name: String,
42    /// 修饰符
43    pub modifiers: Vec<String>,
44    /// 父类
45    pub extends: Option<String>,
46    /// 实现的接口
47    pub implements: Vec<String>,
48    /// 成员
49    pub members: Vec<Member>,
50    /// 源码位置
51    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
52    pub span: Range<usize>,
53}
54
55/// 类成员
56#[derive(Debug, Clone, PartialEq)]
57#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
58pub enum Member {
59    /// 方法声明
60    Method(MethodDeclaration),
61    /// 字段声明
62    Field(FieldDeclaration),
63    /// 构造函数
64    Constructor(ConstructorDeclaration),
65}
66
67/// 构造函数声明
68#[derive(Debug, Clone, PartialEq)]
69#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
70pub struct ConstructorDeclaration {
71    /// 修饰符
72    pub modifiers: Vec<String>,
73    /// 名称 (应与类名一致)
74    pub name: String,
75    /// 参数列表
76    pub parameters: Vec<Parameter>,
77    /// 方法体
78    pub body: Vec<Statement>,
79    /// 源码位置
80    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
81    pub span: Range<usize>,
82}
83
84/// 方法声明
85#[derive(Debug, Clone, PartialEq)]
86#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
87pub struct MethodDeclaration {
88    /// 方法名
89    pub name: String,
90    /// 修饰符
91    pub modifiers: Vec<String>,
92    /// 返回类型
93    pub return_type: String,
94    /// 参数列表
95    pub parameters: Vec<Parameter>,
96    /// 方法体
97    pub body: Vec<Statement>,
98    /// 抛出的异常
99    pub throws: Vec<String>,
100    /// 是否为静态
101    pub is_static: bool,
102    /// 源码位置
103    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
104    pub span: Range<usize>,
105}
106
107/// 参数
108#[derive(Debug, Clone, PartialEq)]
109#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
110pub struct Parameter {
111    /// 参数名
112    pub name: String,
113    /// 参数类型
114    pub r#type: String,
115}
116
117/// 字段声明
118#[derive(Debug, Clone, PartialEq)]
119#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
120pub struct FieldDeclaration {
121    pub name: String,
122    pub r#type: String,
123    pub modifiers: Vec<String>,
124    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
125    pub span: Range<usize>,
126}
127
128/// 语句
129#[derive(Debug, Clone, PartialEq)]
130#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
131pub enum Statement {
132    /// 表达式语句
133    Expression(Expression),
134    /// 返回语句
135    Return(Option<Expression>),
136    /// 块语句
137    Block(Vec<Statement>),
138    /// Try 语句
139    Try(TryStatement),
140    /// Throw 语句
141    Throw(Expression),
142    /// 条件判断
143    If { condition: Expression, then_branch: Box<Statement>, else_branch: Option<Box<Statement>> },
144    /// While 循环
145    While { condition: Expression, body: Box<Statement> },
146    /// Do-While 循环
147    DoWhile { condition: Expression, body: Box<Statement> },
148    /// For 循环
149    For { init: Option<Box<Statement>>, condition: Option<Expression>, update: Option<Expression>, body: Box<Statement> },
150    /// For-Each 循环
151    ForEach { item_type: String, item_name: String, iterable: Expression, body: Box<Statement> },
152    /// Switch 语句
153    Switch { selector: Expression, cases: Vec<SwitchCase>, default: Option<Vec<Statement>> },
154    /// Break 语句
155    Break,
156    /// Continue 语句
157    Continue,
158    /// 变量声明语句
159    LocalVariable { r#type: String, name: String, initializer: Option<Expression> },
160}
161
162/// Switch 分支
163#[derive(Debug, Clone, PartialEq)]
164#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
165pub struct SwitchCase {
166    pub label: Expression,
167    pub body: Vec<Statement>,
168}
169
170/// Try 语句
171#[derive(Debug, Clone, PartialEq)]
172#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
173pub struct TryStatement {
174    pub block: Vec<Statement>,
175    pub catches: Vec<CatchClause>,
176    pub finally: Option<Vec<Statement>>,
177}
178
179/// Catch 子句
180#[derive(Debug, Clone, PartialEq)]
181#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
182pub struct CatchClause {
183    pub parameter: Parameter,
184    pub block: Vec<Statement>,
185}
186
187/// 表达式
188#[derive(Debug, Clone, PartialEq)]
189#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
190pub enum Expression {
191    /// 字面量
192    Literal(Literal),
193    /// 变量引用
194    Identifier(String),
195    /// 方法调用
196    MethodCall(MethodCall),
197    /// 字段访问
198    FieldAccess(FieldAccess),
199    /// 数组访问
200    ArrayAccess(ArrayAccess),
201    /// 数组创建
202    ArrayCreation(ArrayCreation),
203    /// New 表达式
204    New(NewExpression),
205    /// This 表达式
206    This,
207    /// Super 表达式
208    Super,
209    /// 二元运算
210    Binary { left: Box<Expression>, op: String, right: Box<Expression> },
211    /// 一元运算
212    Unary { op: String, expression: Box<Expression> },
213    /// 赋值运算
214    Assignment { left: Box<Expression>, op: String, right: Box<Expression> },
215    /// 自增自减运算
216    Update { expression: Box<Expression>, op: String, is_prefix: bool },
217    /// 三元运算
218    Ternary { condition: Box<Expression>, then_branch: Box<Expression>, else_branch: Box<Expression> },
219    /// 类型转换
220    Cast { target_type: String, expression: Box<Expression> },
221}
222
223/// New 表达式
224#[derive(Debug, Clone, PartialEq)]
225#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
226pub struct NewExpression {
227    pub r#type: String,
228    pub arguments: Vec<Expression>,
229}
230
231/// 字面量
232#[derive(Debug, Clone, PartialEq)]
233#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
234pub enum Literal {
235    Integer(i64),
236    Float(f64),
237    String(String),
238    Boolean(bool),
239}
240
241/// 字段访问
242#[derive(Debug, Clone, PartialEq)]
243#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
244pub struct FieldAccess {
245    /// 访问目标
246    pub target: Box<Expression>,
247    /// 字段名
248    pub name: String,
249}
250
251/// 方法调用
252#[derive(Debug, Clone, PartialEq)]
253#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
254pub struct MethodCall {
255    /// 调用目标 (可选,如 System.out)
256    pub target: Option<Box<Expression>>,
257    /// 方法名
258    pub name: String,
259    /// 参数
260    pub arguments: Vec<Expression>,
261}
262
263/// 数组访问
264#[derive(Debug, Clone, PartialEq)]
265#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
266pub struct ArrayAccess {
267    pub target: Box<Expression>,
268    pub index: Box<Expression>,
269}
270
271/// 数组创建
272#[derive(Debug, Clone, PartialEq)]
273#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
274pub struct ArrayCreation {
275    pub element_type: String,
276    pub dimensions: Vec<Expression>,
277}
278
279/// 接口声明
280#[derive(Debug, Clone, PartialEq)]
281#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
282pub struct InterfaceDeclaration {
283    /// 接口名
284    pub name: String,
285    /// 修饰符
286    pub modifiers: Vec<String>,
287    /// 继承的接口
288    pub extends: Vec<String>,
289    /// 成员
290    pub members: Vec<Member>,
291    /// 源码位置
292    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
293    pub span: Range<usize>,
294}
295
296/// 结构体声明
297#[derive(Debug, Clone, PartialEq)]
298#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
299pub struct StructDeclaration {
300    /// 结构体名
301    pub name: String,
302    /// 修饰符
303    pub modifiers: Vec<String>,
304    /// 实现的接口
305    pub implements: Vec<String>,
306    /// 成员
307    pub members: Vec<Member>,
308    /// 源码位置
309    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
310    pub span: Range<usize>,
311}
312
313/// 枚举声明
314#[derive(Debug, Clone, PartialEq)]
315#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
316pub struct EnumDeclaration {
317    /// 枚举名
318    pub name: String,
319    /// 修饰符
320    pub modifiers: Vec<String>,
321    /// 枚举项
322    pub variants: Vec<String>,
323    /// 成员
324    pub members: Vec<Member>,
325    /// 源码位置
326    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
327    pub span: Range<usize>,
328}
329
330/// 记录声明
331#[derive(Debug, Clone, PartialEq)]
332#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
333pub struct RecordDeclaration {
334    /// 记录名
335    pub name: String,
336    /// 修饰符
337    pub modifiers: Vec<String>,
338    /// 参数列表 (C# record 有主构造函数)
339    pub parameters: Vec<Parameter>,
340    /// 实现的接口
341    pub implements: Vec<String>,
342    /// 成员
343    pub members: Vec<Member>,
344    /// 源码位置
345    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
346    pub span: Range<usize>,
347}
348
349/// 包声明
350#[derive(Debug, Clone, PartialEq)]
351#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
352pub struct PackageDeclaration {
353    /// 包名
354    pub name: String,
355    /// 源码位置
356    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
357    pub span: Range<usize>,
358}
359
360/// 导入声明
361#[derive(Debug, Clone, PartialEq)]
362#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
363pub struct ImportDeclaration {
364    /// 导入路径
365    pub path: String,
366    /// 是否为静态导入
367    pub is_static: bool,
368    /// 源码位置
369    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
370    pub span: Range<usize>,
371}