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/// Strongly typed AST root for the Go language
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    #[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 receiver: Option<Parameter>,
39    pub params: Vec<Parameter>,
40    pub return_types: Vec<String>,
41    pub body: Block,
42    #[serde(with = "oak_core::serde_range")]
43    pub span: Range<usize>,
44}
45
46#[derive(Debug, PartialEq, Clone)]
47#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
48pub struct Parameter {
49    pub name: String,
50    pub param_type: String,
51    #[serde(with = "oak_core::serde_range")]
52    pub span: Range<usize>,
53}
54
55#[derive(Debug, PartialEq, Clone)]
56#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
57pub struct Block {
58    pub statements: Vec<Statement>,
59    #[serde(with = "oak_core::serde_range")]
60    pub span: Range<usize>,
61}
62
63#[derive(Debug, PartialEq, Clone)]
64#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
65pub enum Statement {
66    Expression(Expression),
67    Assignment {
68        targets: Vec<String>,
69        values: Vec<Expression>,
70        #[serde(with = "oak_core::serde_range")]
71        span: Range<usize>,
72    },
73    Return {
74        values: Vec<Expression>,
75        #[serde(with = "oak_core::serde_range")]
76        span: Range<usize>,
77    },
78    If {
79        condition: Expression,
80        then_block: Block,
81        else_block: Option<Block>,
82        #[serde(with = "oak_core::serde_range")]
83        span: Range<usize>,
84    },
85    For {
86        init: Option<Box<Statement>>,
87        condition: Option<Expression>,
88        post: Option<Box<Statement>>,
89        body: Block,
90        #[serde(with = "oak_core::serde_range")]
91        span: Range<usize>,
92    },
93}
94
95#[derive(Debug, PartialEq, Clone)]
96#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
97pub enum Expression {
98    Identifier {
99        name: String,
100        #[serde(with = "oak_core::serde_range")]
101        span: Range<usize>,
102    },
103    Literal {
104        value: String,
105        #[serde(with = "oak_core::serde_range")]
106        span: Range<usize>,
107    },
108    Binary {
109        left: Box<Expression>,
110        op: String,
111        right: Box<Expression>,
112        #[serde(with = "oak_core::serde_range")]
113        span: Range<usize>,
114    },
115    Call {
116        func: Box<Expression>,
117        args: Vec<Expression>,
118        #[serde(with = "oak_core::serde_range")]
119        span: Range<usize>,
120    },
121}
122
123#[derive(Debug, PartialEq, Clone)]
124#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
125pub struct Variable {
126    pub name: String,
127    pub var_type: Option<String>,
128    pub value: Option<Expression>,
129    #[serde(with = "oak_core::serde_range")]
130    pub span: Range<usize>,
131}
132
133#[derive(Debug, PartialEq, Clone)]
134#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
135pub struct TypeDecl {
136    pub name: String,
137    pub definition: String,
138    #[serde(with = "oak_core::serde_range")]
139    pub span: Range<usize>,
140}
141
142#[derive(Debug, PartialEq, Clone)]
143#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
144pub struct Const {
145    pub name: String,
146    pub const_type: Option<String>,
147    pub value: Expression,
148    #[serde(with = "oak_core::serde_range")]
149    pub span: Range<usize>,
150}