Skip to main content

oak_matlab/ast/
mod.rs

1#![doc = include_str!("readme.md")]
2use core::range::Range;
3
4/// MATLAB Abstract Syntax Tree Root Node
5#[derive(Clone, Debug, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7pub struct MatlabRoot {
8    /// List of items in script or function
9    pub items: Vec<Item>,
10}
11
12/// Top-level items in MATLAB
13#[derive(Clone, Debug, PartialEq, Eq, Hash)]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15pub enum Item {
16    /// Function definition
17    Function(Function),
18    /// Class definition
19    Class(Class),
20    /// Statement
21    Statement(Statement),
22}
23
24/// Function definition
25#[derive(Clone, Debug, PartialEq, Eq, Hash)]
26#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
27pub struct Function {
28    /// Function name
29    pub name: String,
30    /// Input parameters
31    pub inputs: Vec<String>,
32    /// Output parameters
33    pub outputs: Vec<String>,
34    /// Function body
35    pub body: Vec<Statement>,
36    /// Source code span
37    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
38    pub span: Range<usize>,
39}
40
41/// Class definition
42#[derive(Clone, Debug, PartialEq, Eq, Hash)]
43#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
44pub struct Class {
45    /// Class name
46    pub name: String,
47    /// Base classes
48    pub superclasses: Vec<String>,
49    /// Property block
50    pub properties: Vec<Property>,
51    /// Method block
52    pub methods: Vec<Function>,
53    /// Source code span
54    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
55    pub span: Range<usize>,
56}
57
58/// Property
59#[derive(Clone, Debug, PartialEq, Eq, Hash)]
60#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
61pub struct Property {
62    /// Property name
63    pub name: String,
64    /// Default value
65    pub default_value: Option<String>,
66    /// Source code span
67    #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
68    pub span: Range<usize>,
69}
70
71/// Statement
72#[derive(Clone, Debug, PartialEq, Eq, Hash)]
73#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
74pub enum Statement {
75    /// Assignment statement
76    Assignment {
77        /// Target of the assignment.
78        target: String,
79        /// Value assigned.
80        value: String,
81        /// Source range.
82        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
83        span: Range<usize>,
84    },
85    /// Expression statement
86    Expression {
87        /// Expression value.
88        value: String,
89        /// Source range.
90        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
91        span: Range<usize>,
92    },
93    /// If statement
94    If {
95        /// Condition.
96        condition: String,
97        /// Body of the if branch.
98        body: Vec<Statement>,
99        /// Else-if branches.
100        else_ifs: Vec<(String, Vec<Statement>)>,
101        /// Else branch body.
102        else_body: Option<Vec<Statement>>,
103        /// Source range.
104        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
105        span: Range<usize>,
106    },
107    /// For loop
108    For {
109        /// Loop variable.
110        variable: String,
111        /// Range of the loop.
112        range: String,
113        /// Body of the loop.
114        body: Vec<Statement>,
115        /// Source range.
116        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
117        span: Range<usize>,
118    },
119    /// While loop
120    While {
121        /// Loop condition.
122        condition: String,
123        /// Body of the loop.
124        body: Vec<Statement>,
125        /// Source range.
126        #[cfg_attr(feature = "serde", serde(with = "oak_core::serde_range"))]
127        span: Range<usize>,
128    },
129}
130
131/// Matlab script.
132pub struct MatlabScript {
133    /// Items in the script.
134    pub items: Vec<Item>,
135}
136
137impl MatlabScript {
138    /// Creates a new `MatlabScript` with the given items.
139    pub fn new(items: Vec<Item>) -> Self {
140        Self { items }
141    }
142}