gbf_core/decompiler/ast/visitors/
mod.rs

1#![deny(missing_docs)]
2
3use super::{
4    AstKind, array_access::ArrayAccessNode, array_kind::ArrayKind, array_node::ArrayNode,
5    assignment::AssignmentNode, bin_op::BinaryOperationNode, block::BlockNode,
6    control_flow::ControlFlowNode, expr::ExprKind, func_call::FunctionCallNode,
7    function::FunctionNode, identifier::IdentifierNode, literal::LiteralNode,
8    member_access::MemberAccessNode, phi::PhiNode, ptr::P, ret::ReturnNode,
9    statement::StatementKind, unary_op::UnaryOperationNode,
10};
11
12/// Represents a visitor for the AST.
13pub mod emit_context;
14/// An emitter for the AST.
15pub mod emitter;
16
17/// Represents a visitor for the AST.
18pub trait AstVisitor {
19    /// The output type of the visitor.
20    type Output;
21
22    /// Visits an AST node.
23    fn visit_node(&mut self, node: &AstKind) -> Self::Output;
24    /// Visits a statement node.
25    fn visit_statement(&mut self, node: &StatementKind) -> Self::Output;
26    /// Visits an assignment node.
27    fn visit_assignment(&mut self, node: &P<AssignmentNode>) -> Self::Output;
28    /// Visits an expression node.
29    fn visit_expr(&mut self, node: &ExprKind) -> Self::Output;
30    /// Visits a binary operation node.
31    fn visit_bin_op(&mut self, node: &P<BinaryOperationNode>) -> Self::Output;
32    /// Visits a unary operation node.
33    fn visit_unary_op(&mut self, node: &P<UnaryOperationNode>) -> Self::Output;
34    /// Visits an identifier node.
35    fn visit_identifier(&mut self, node: &P<IdentifierNode>) -> Self::Output;
36    /// Visits a literal node.
37    fn visit_literal(&mut self, node: &P<LiteralNode>) -> Self::Output;
38    /// Visits a member access node.
39    fn visit_member_access(&mut self, node: &P<MemberAccessNode>) -> Self::Output;
40    /// Visits a function call node.
41    fn visit_function_call(&mut self, node: &P<FunctionCallNode>) -> Self::Output;
42    /// Visits an array node.
43    fn visit_array(&mut self, node: &ArrayKind) -> Self::Output;
44    /// Visits an array node.
45    fn visit_array_node(&mut self, node: &P<ArrayNode>) -> Self::Output;
46    /// Visits a phi array node.
47    fn visit_phi_array(
48        &mut self,
49        node: &P<crate::decompiler::ast::phi_array::PhiArrayNode>,
50    ) -> Self::Output;
51    /// Visits an array access node.
52    fn visit_array_access(&mut self, node: &P<ArrayAccessNode>) -> Self::Output;
53    /// Visits a function node.
54    fn visit_function(&mut self, node: &P<FunctionNode>) -> Self::Output;
55    /// Visits a return node.
56    fn visit_return(&mut self, node: &P<ReturnNode>) -> Self::Output;
57    /// Visits a block node.
58    fn visit_block(&mut self, node: &P<BlockNode>) -> Self::Output;
59    /// Visits a control flow node.
60    fn visit_control_flow(&mut self, node: &P<ControlFlowNode>) -> Self::Output;
61    /// Visits a phi node.
62    fn visit_phi(&mut self, node: &P<PhiNode>) -> Self::Output;
63    /// Visits a `new` node.
64    fn visit_new(&mut self, node: &P<crate::decompiler::ast::new::NewNode>) -> Self::Output;
65    /// Visits a `new_array` node.
66    fn visit_new_array(
67        &mut self,
68        node: &P<crate::decompiler::ast::new_array::NewArrayNode>,
69    ) -> Self::Output;
70    /// Visits a virtual branch node.
71    fn visit_virtual_branch(
72        &mut self,
73        node: &P<crate::decompiler::ast::vbranch::VirtualBranchNode>,
74    ) -> Self::Output;
75    /// Visits a range node.
76    fn visit_range(&mut self, node: &P<crate::decompiler::ast::range::RangeNode>) -> Self::Output;
77}