gbf_core/decompiler/ast/
statement.rs

1#![deny(missing_docs)]
2
3use gbf_macros::AstNodeTransform;
4use serde::{Deserialize, Serialize};
5
6use super::{
7    AstKind, AstVisitable, assignment::AssignmentNode, ptr::P, ret::ReturnNode,
8    vbranch::VirtualBranchNode, visitors::AstVisitor,
9};
10
11/// Represents an expression node in the AST.
12#[derive(Debug, Clone, Serialize, Deserialize, Eq, AstNodeTransform)]
13#[convert_to(AstKind::Statement)]
14pub enum StatementKind {
15    /// Assignment
16    Assignment(P<AssignmentNode>),
17    /// Return
18    Return(P<ReturnNode>),
19    /// Virtual Branch
20    VirtualBranch(P<VirtualBranchNode>),
21}
22
23impl AstVisitable for StatementKind {
24    fn accept<V: AstVisitor>(&self, visitor: &mut V) -> V::Output {
25        visitor.visit_statement(self)
26    }
27}
28
29// == Other implementations for literal ==
30
31impl PartialEq for StatementKind {
32    fn eq(&self, other: &Self) -> bool {
33        match (self, other) {
34            (StatementKind::Assignment(a1), StatementKind::Assignment(a2)) => a1 == a2,
35            (StatementKind::Return(r1), StatementKind::Return(r2)) => r1 == r2,
36            (StatementKind::VirtualBranch(v1), StatementKind::VirtualBranch(v2)) => v1 == v2,
37            _ => false,
38        }
39    }
40}