Skip to main content

oak_go/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5use std::{boxed::Box, string::String, vec::Vec};
6
7/// Go 语言强类型 AST 根
8#[derive(Debug, PartialEq, Clone)]
9#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
10pub struct GoRoot {
11    pub package: Option<String>,
12    pub imports: Vec<Import>,
13    pub declarations: Vec<Declaration>,
14}
15
16#[derive(Debug, PartialEq, Clone)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Import {
19    pub path: String,
20    pub alias: Option<String>,
21    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
22    pub span: Range<usize>,
23}
24
25#[derive(Debug, PartialEq, Clone)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27pub enum Declaration {
28    Function(Function),
29    Variable(Variable),
30    Type(TypeDecl),
31    Const(Const),
32}
33
34#[derive(Debug, PartialEq, Clone)]
35#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
36pub struct Function {
37    pub name: String,
38    pub params: Vec<Parameter>,
39    pub return_types: Vec<String>,
40    pub body: Block,
41    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
42    pub span: Range<usize>,
43}
44
45#[derive(Debug, PartialEq, Clone)]
46#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
47pub struct Parameter {
48    pub name: String,
49    pub param_type: String,
50    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
51    pub span: Range<usize>,
52}
53
54#[derive(Debug, PartialEq, Clone)]
55#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
56pub struct Block {
57    pub statements: Vec<Statement>,
58    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
59    pub span: Range<usize>,
60}
61
62#[derive(Debug, PartialEq, Clone)]
63#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
64pub enum Statement {
65    Expression(Expression),
66    Assignment {
67        targets: Vec<String>,
68        values: Vec<Expression>,
69        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
70        span: Range<usize>,
71    },
72    Return {
73        values: Vec<Expression>,
74        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
75        span: Range<usize>,
76    },
77    If {
78        condition: Expression,
79        then_block: Block,
80        else_block: Option<Block>,
81        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
82        span: Range<usize>,
83    },
84    For {
85        init: Option<Box<Statement>>,
86        condition: Option<Expression>,
87        post: Option<Box<Statement>>,
88        body: Block,
89        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
90        span: Range<usize>,
91    },
92}
93
94#[derive(Debug, PartialEq, Clone)]
95#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96pub enum Expression {
97    Identifier {
98        name: String,
99        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
100        span: Range<usize>,
101    },
102    Literal {
103        value: String,
104        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
105        span: Range<usize>,
106    },
107    Binary {
108        left: Box<Expression>,
109        op: String,
110        right: Box<Expression>,
111        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
112        span: Range<usize>,
113    },
114    Call {
115        func: Box<Expression>,
116        args: Vec<Expression>,
117        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
118        span: Range<usize>,
119    },
120}
121
122#[derive(Debug, PartialEq, Clone)]
123#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
124pub struct Variable {
125    pub name: String,
126    pub var_type: Option<String>,
127    pub value: Option<Expression>,
128    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
129    pub span: Range<usize>,
130}
131
132#[derive(Debug, PartialEq, Clone)]
133#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
134pub struct TypeDecl {
135    pub name: String,
136    pub definition: String,
137    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
138    pub span: Range<usize>,
139}
140
141#[derive(Debug, PartialEq, Clone)]
142#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
143pub struct Const {
144    pub name: String,
145    pub const_type: Option<String>,
146    pub value: Expression,
147    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
148    pub span: Range<usize>,
149}