Skip to main content

oak_csharp/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2//! C# AST definitions
3
4use core::range::Range;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8/// C# 程序的根节点
9#[derive(Debug, Clone, PartialEq)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct CSharpRoot {
12    /// 编译单元中的项目
13    pub items: Vec<Item>,
14}
15
16/// C# 程序中的顶级项目
17#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub enum Item {
20    /// 命名空间声明
21    Namespace(NamespaceDeclaration),
22    /// Using 指令
23    Using(UsingDirective),
24    /// 类声明
25    Class(ClassDeclaration),
26    /// 接口声明
27    Interface(InterfaceDeclaration),
28    /// 结构体声明
29    Struct(StructDeclaration),
30    /// 枚举声明
31    Enum(EnumDeclaration),
32    /// 记录声明
33    Record(RecordDeclaration),
34    /// 委托声明
35    Delegate(DelegateDeclaration),
36}
37
38/// 命名空间声明
39#[derive(Debug, Clone, PartialEq)]
40#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
41pub struct NamespaceDeclaration {
42    /// 命名空间名
43    pub name: String,
44    /// 特性
45    pub attributes: Vec<Attribute>,
46    /// 成员
47    pub items: Vec<Item>,
48    /// 源码位置
49    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
50    pub span: Range<usize>,
51}
52
53/// Using 指令
54#[derive(Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct UsingDirective {
57    /// 导入路径
58    pub path: String,
59    /// 是否为静态导入
60    pub is_static: bool,
61    /// 别名
62    pub alias: Option<String>,
63    /// 全局
64    pub is_global: bool,
65    /// 源码位置
66    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
67    pub span: Range<usize>,
68}
69
70/// 类声明
71#[derive(Debug, Clone, PartialEq)]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73pub struct ClassDeclaration {
74    /// 类名
75    pub name: String,
76    /// 特性
77    pub attributes: Vec<Attribute>,
78    /// 修饰符
79    pub modifiers: Vec<String>,
80    /// 基类和接口
81    pub base_types: Vec<String>,
82    /// 泛型参数
83    pub type_parameters: Vec<TypeParameter>,
84    /// 泛型约束
85    pub constraints: Vec<TypeParameterConstraint>,
86    /// 成员
87    pub members: Vec<Member>,
88    /// 源码位置
89    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
90    pub span: Range<usize>,
91}
92
93/// 结构体声明
94#[derive(Debug, Clone, PartialEq)]
95#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96pub struct StructDeclaration {
97    pub name: String,
98    pub attributes: Vec<Attribute>,
99    pub modifiers: Vec<String>,
100    pub members: Vec<Member>,
101    pub type_parameters: Vec<TypeParameter>,
102    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
103    pub span: Range<usize>,
104}
105
106/// 接口声明
107#[derive(Debug, Clone, PartialEq)]
108#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
109pub struct InterfaceDeclaration {
110    pub name: String,
111    pub attributes: Vec<Attribute>,
112    pub modifiers: Vec<String>,
113    pub members: Vec<Member>,
114    pub type_parameters: Vec<TypeParameter>,
115    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
116    pub span: Range<usize>,
117}
118
119/// 枚举声明
120#[derive(Debug, Clone, PartialEq)]
121#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
122pub struct EnumDeclaration {
123    pub name: String,
124    pub attributes: Vec<Attribute>,
125    pub modifiers: Vec<String>,
126    pub members: Vec<EnumMember>,
127    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
128    pub span: Range<usize>,
129}
130
131/// 枚举成员
132#[derive(Debug, Clone, PartialEq)]
133#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
134pub struct EnumMember {
135    pub name: String,
136    pub attributes: Vec<Attribute>,
137    pub value: Option<Expression>,
138}
139
140/// 记录声明
141#[derive(Debug, Clone, PartialEq)]
142#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
143pub struct RecordDeclaration {
144    pub name: String,
145    pub attributes: Vec<Attribute>,
146    pub modifiers: Vec<String>,
147    pub members: Vec<Member>,
148    pub type_parameters: Vec<TypeParameter>,
149    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
150    pub span: Range<usize>,
151}
152
153/// 委托声明
154#[derive(Debug, Clone, PartialEq)]
155#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
156pub struct DelegateDeclaration {
157    pub name: String,
158    pub attributes: Vec<Attribute>,
159    pub modifiers: Vec<String>,
160    pub return_type: String,
161    pub type_parameters: Vec<TypeParameter>,
162    pub parameters: Vec<Parameter>,
163    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
164    pub span: Range<usize>,
165}
166
167/// 成员
168#[derive(Debug, Clone, PartialEq)]
169#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
170pub enum Member {
171    /// 方法声明
172    Method(MethodDeclaration),
173    /// 字段声明
174    Field(FieldDeclaration),
175    /// 属性声明
176    Property(PropertyDeclaration),
177    /// 索引器声明
178    Indexer(IndexerDeclaration),
179    /// 构造函数
180    Constructor(MethodDeclaration),
181    /// 事件声明
182    Event(EventDeclaration),
183}
184
185/// 方法声明
186#[derive(Debug, Clone, PartialEq)]
187#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
188pub struct MethodDeclaration {
189    /// 方法名
190    pub name: String,
191    /// 特性
192    pub attributes: Vec<Attribute>,
193    /// 修饰符
194    pub modifiers: Vec<String>,
195    /// 返回类型
196    pub return_type: String,
197    /// 泛型参数
198    pub type_parameters: Vec<TypeParameter>,
199    /// 参数列表
200    pub parameters: Vec<Parameter>,
201    /// 方法体
202    pub body: Option<Vec<Statement>>,
203    /// 是否为异步
204    pub is_async: bool,
205    /// 源码位置
206    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
207    pub span: Range<usize>,
208}
209
210/// 属性声明
211#[derive(Debug, Clone, PartialEq)]
212#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
213pub struct PropertyDeclaration {
214    pub name: String,
215    pub attributes: Vec<Attribute>,
216    pub r#type: String,
217    pub modifiers: Vec<String>,
218    pub get_accessor: Option<Accessor>,
219    pub set_accessor: Option<Accessor>,
220    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
221    pub span: Range<usize>,
222}
223
224/// 访问器 (get/set)
225#[derive(Debug, Clone, PartialEq)]
226#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
227pub struct Accessor {
228    pub attributes: Vec<Attribute>,
229    pub body: Option<Vec<Statement>>,
230    pub modifiers: Vec<String>,
231}
232
233/// 索引器声明
234#[derive(Debug, Clone, PartialEq)]
235#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
236pub struct IndexerDeclaration {
237    pub attributes: Vec<Attribute>,
238    pub r#type: String,
239    pub parameters: Vec<Parameter>,
240    pub get_accessor: Option<Accessor>,
241    pub set_accessor: Option<Accessor>,
242    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
243    pub span: Range<usize>,
244}
245
246/// 事件声明
247#[derive(Debug, Clone, PartialEq)]
248#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
249pub struct EventDeclaration {
250    pub name: String,
251    pub attributes: Vec<Attribute>,
252    pub r#type: String,
253    pub modifiers: Vec<String>,
254    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
255    pub span: Range<usize>,
256}
257
258/// 参数
259#[derive(Debug, Clone, PartialEq)]
260#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
261pub struct Parameter {
262    /// 特性
263    pub attributes: Vec<Attribute>,
264    /// 参数名
265    pub name: String,
266    /// 参数类型
267    pub r#type: String,
268    /// 修饰符 (ref, out, params)
269    pub modifiers: Vec<String>,
270    /// 默认值
271    pub default_value: Option<Expression>,
272}
273
274/// 字段声明
275#[derive(Debug, Clone, PartialEq)]
276#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
277pub struct FieldDeclaration {
278    pub name: String,
279    pub attributes: Vec<Attribute>,
280    pub r#type: String,
281    pub modifiers: Vec<String>,
282    pub initializer: Option<Expression>,
283    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
284    pub span: Range<usize>,
285}
286
287/// 特性
288#[derive(Debug, Clone, PartialEq)]
289#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
290pub struct Attribute {
291    pub name: String,
292    pub arguments: Vec<Expression>,
293}
294
295/// 泛型参数
296#[derive(Debug, Clone, PartialEq)]
297#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
298pub struct TypeParameter {
299    pub name: String,
300    pub attributes: Vec<Attribute>,
301    pub variance: Option<String>, // in, out
302}
303
304/// 泛型约束
305#[derive(Debug, Clone, PartialEq)]
306#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
307pub struct TypeParameterConstraint {
308    pub parameter_name: String,
309    pub constraints: Vec<String>,
310}
311
312/// 语句
313#[derive(Debug, Clone, PartialEq)]
314#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
315pub enum Statement {
316    /// 表达式语句
317    Expression(Expression),
318    /// 返回语句
319    Return(Option<Expression>),
320    /// 块语句
321    Block(Vec<Statement>),
322    /// 条件判断
323    If { condition: Expression, then_branch: Box<Statement>, else_branch: Option<Box<Statement>> },
324    /// While 循环
325    While { condition: Expression, body: Box<Statement> },
326    /// For 循环
327    For { init: Option<Box<Statement>>, condition: Option<Expression>, update: Option<Expression>, body: Box<Statement> },
328    /// Foreach 循环
329    Foreach { item_type: String, item_name: String, iterable: Expression, body: Box<Statement> },
330    /// 变量声明语句
331    LocalVariable { r#type: String, name: String, initializer: Option<Expression> },
332    /// Break
333    Break,
334    /// Continue
335    Continue,
336}
337
338/// 表达式
339#[derive(Debug, Clone, PartialEq)]
340#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
341pub enum Expression {
342    /// 字面量
343    Literal(Literal),
344    /// 变量引用
345    Identifier(String),
346    /// 方法调用
347    MethodCall(MethodCall),
348    /// 字段/属性访问
349    MemberAccess(MemberAccess),
350    /// 索引访问
351    ElementAccess(ElementAccess),
352    /// New 表达式
353    New(NewExpression),
354    /// This 表达式
355    This,
356    /// Base 表达式
357    Base,
358    /// 二元运算
359    Binary { left: Box<Expression>, op: String, right: Box<Expression> },
360    /// 一元运算
361    Unary { op: String, expression: Box<Expression> },
362    /// 赋值运算
363    Assignment { left: Box<Expression>, op: String, right: Box<Expression> },
364    /// Await 表达式
365    Await(Box<Expression>),
366    /// LINQ 查询表达式
367    Query(Box<QueryExpression>),
368}
369
370/// LINQ 查询表达式
371#[derive(Debug, Clone, PartialEq)]
372#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
373pub struct QueryExpression {
374    pub from_clause: FromClause,
375    pub body: QueryBody,
376}
377
378#[derive(Debug, Clone, PartialEq)]
379#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
380pub struct FromClause {
381    pub identifier: String,
382    pub expression: Box<Expression>,
383}
384
385#[derive(Debug, Clone, PartialEq)]
386#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
387pub struct QueryBody {
388    pub clauses: Vec<QueryClause>,
389    pub select_or_group: SelectOrGroupClause,
390    pub continuation: Option<String>,
391}
392
393#[derive(Debug, Clone, PartialEq)]
394#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
395pub enum QueryClause {
396    From(FromClause),
397    Let(LetClause),
398    Where(Expression),
399    Join(JoinClause),
400    OrderBy(Vec<Ordering>),
401}
402
403#[derive(Debug, Clone, PartialEq)]
404#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
405pub enum QueryClauseExt {
406    GroupBy(Expression),
407}
408
409#[derive(Debug, Clone, PartialEq)]
410#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
411pub struct LetClause {
412    pub identifier: String,
413    pub expression: Expression,
414}
415
416#[derive(Debug, Clone, PartialEq)]
417#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
418pub struct JoinClause {
419    pub identifier: String,
420    pub in_expression: Expression,
421    pub on_expression: Expression,
422    pub equals_expression: Expression,
423    pub into_identifier: Option<String>,
424}
425
426#[derive(Debug, Clone, PartialEq)]
427#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
428pub struct Ordering {
429    pub expression: Expression,
430    pub ascending: bool,
431}
432
433#[derive(Debug, Clone, PartialEq)]
434#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
435pub enum SelectOrGroupClause {
436    Select(Expression),
437    Group { expression: Expression, by_expression: Expression },
438}
439
440/// New 表达式
441#[derive(Debug, Clone, PartialEq)]
442#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
443pub struct NewExpression {
444    pub r#type: String,
445    pub arguments: Vec<Expression>,
446}
447
448/// 字面量
449#[derive(Debug, Clone, PartialEq)]
450#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
451pub enum Literal {
452    Integer(i64),
453    String(String),
454    Boolean(bool),
455    Null,
456}
457
458/// 成员访问
459#[derive(Debug, Clone, PartialEq)]
460#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
461pub struct MemberAccess {
462    pub target: Box<Expression>,
463    pub name: String,
464}
465
466/// 方法调用
467#[derive(Debug, Clone, PartialEq)]
468#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
469pub struct MethodCall {
470    pub target: Option<Box<Expression>>,
471    pub name: String,
472    pub arguments: Vec<Expression>,
473}
474
475/// 元素访问 (索引器)
476#[derive(Debug, Clone, PartialEq)]
477#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
478pub struct ElementAccess {
479    pub target: Box<Expression>,
480    pub arguments: Vec<Expression>,
481}