gbf_core/decompiler/ast/
ret.rs1#![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#[derive(Debug, Clone, Serialize, Deserialize, Eq, AstNodeTransform)]
12#[convert_to(StatementKind::Return, AstKind::Statement)]
13pub struct ReturnNode {
14 pub ret: ExprKind,
16}
17
18impl ReturnNode {
19 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
37impl 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}