gbf_core/decompiler/ast/
ret.rs

1#![deny(missing_docs)]
2
3use gbf_macros::AstNodeTransform;
4use serde::{Deserialize, Serialize};
5
6use super::{
7    AstKind, AstVisitable, expr::ExprKind, ptr::P, statement::StatementKind, visitors::AstVisitor,
8};
9
10/// Represents a return node in the AST, such as `return 5`.
11#[derive(Debug, Clone, Serialize, Deserialize, Eq, AstNodeTransform)]
12#[convert_to(StatementKind::Return, AstKind::Statement)]
13pub struct ReturnNode {
14    /// The value to return.
15    pub ret: ExprKind,
16}
17
18impl ReturnNode {
19    /// Creates a new return node.
20    ///
21    /// # Arguments
22    /// - `ret`: The value to return.
23    ///
24    /// # Returns
25    /// The return node.
26    pub fn new(ret: ExprKind) -> Self {
27        Self { ret }
28    }
29}
30
31impl AstVisitable for P<ReturnNode> {
32    fn accept<V: AstVisitor>(&self, visitor: &mut V) -> V::Output {
33        visitor.visit_return(self)
34    }
35}
36
37// == Other implementations for return ==
38impl PartialEq for ReturnNode {
39    fn eq(&self, other: &Self) -> bool {
40        self.ret == other.ret
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use crate::decompiler::ast::{emit, new_num, new_return};
47
48    #[test]
49    fn test_return_node() {
50        let ret = new_return(new_num(5));
51        assert_eq!(ret.ret, new_return(new_num(5)).ret);
52    }
53
54    #[test]
55    fn test_emit() {
56        let ret = new_return(new_num(5));
57        assert_eq!(emit(ret), "return 5;");
58    }
59
60    #[test]
61    fn test_equality() {
62        let ret = new_return(new_num(5));
63        let ret2 = new_return(new_num(5));
64        let ret3 = new_return(new_num(6));
65        assert_eq!(ret, ret2);
66        assert_ne!(ret, ret3);
67    }
68}