Skip to main content

oak_elixir/ast/
mod.rs

1use core::range::Range;
2use serde::{Deserialize, Serialize};
3use std::{boxed::Box, string::String, vec::Vec};
4
5use crate::ElixirSyntaxKind;
6
7#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
8pub struct Identifier {
9    pub name: String,
10    #[serde(with = "oak_core::serde_range")]
11    pub span: Range<usize>,
12}
13
14/// 强类型 AST 根
15#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
16pub struct ElixirRoot {
17    pub items: Vec<Item>,
18}
19
20/// 顶层项:模块、函数或语句
21#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
22pub enum Item {
23    Module(Module),
24    Function(Function),
25    Statement(Statement),
26}
27
28#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
29pub struct Module {
30    pub name: Identifier,
31    pub items: Vec<Item>,
32    #[serde(with = "oak_core::serde_range")]
33    pub span: Range<usize>,
34}
35
36#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
37pub struct Function {
38    pub name: Identifier,
39    pub params: Vec<Param>,
40    pub body: Block,
41    #[serde(with = "oak_core::serde_range")]
42    pub span: Range<usize>,
43}
44
45#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
46pub struct Param {
47    pub name: Identifier,
48    pub ty: Option<String>,
49    #[serde(with = "oak_core::serde_range")]
50    pub span: Range<usize>,
51}
52
53#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
54pub struct Block {
55    pub statements: Vec<Statement>,
56    #[serde(with = "oak_core::serde_range")]
57    pub span: Range<usize>,
58}
59
60#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
61pub enum Statement {
62    Let {
63        name: Identifier,
64        expr: Expr,
65        #[serde(with = "oak_core::serde_range")]
66        span: Range<usize>,
67    },
68    ExprStmt {
69        expr: Expr,
70        #[serde(with = "oak_core::serde_range")]
71        span: Range<usize>,
72    },
73}
74
75#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
76pub enum Expr {
77    Ident(Identifier),
78    Atom {
79        value: String,
80        #[serde(with = "oak_core::serde_range")]
81        span: Range<usize>,
82    },
83    Number {
84        value: String,
85        #[serde(with = "oak_core::serde_range")]
86        span: Range<usize>,
87    },
88    String {
89        value: String,
90        #[serde(with = "oak_core::serde_range")]
91        span: Range<usize>,
92    },
93    Bool {
94        value: bool,
95        #[serde(with = "oak_core::serde_range")]
96        span: Range<usize>,
97    },
98    Unary {
99        op: ElixirSyntaxKind,
100        expr: Box<Expr>,
101        #[serde(with = "oak_core::serde_range")]
102        span: Range<usize>,
103    },
104    Binary {
105        left: Box<Expr>,
106        op: ElixirSyntaxKind,
107        right: Box<Expr>,
108        #[serde(with = "oak_core::serde_range")]
109        span: Range<usize>,
110    },
111    Call {
112        callee: Box<Expr>,
113        args: Vec<Expr>,
114        #[serde(with = "oak_core::serde_range")]
115        span: Range<usize>,
116    },
117    Field {
118        receiver: Box<Expr>,
119        field: Identifier,
120        #[serde(with = "oak_core::serde_range")]
121        span: Range<usize>,
122    },
123    Index {
124        receiver: Box<Expr>,
125        index: Box<Expr>,
126        #[serde(with = "oak_core::serde_range")]
127        span: Range<usize>,
128    },
129    Paren {
130        expr: Box<Expr>,
131        #[serde(with = "oak_core::serde_range")]
132        span: Range<usize>,
133    },
134    Block(Block),
135}