gbf_core/decompiler/ast/
literal.rs1#![deny(missing_docs)]
2
3use gbf_macros::AstNodeTransform;
4use serde::{Deserialize, Serialize};
5
6use super::{AstKind, AstVisitable, expr::ExprKind, ptr::P, visitors::AstVisitor};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, AstNodeTransform)]
10#[convert_to(ExprKind::Literal, AstKind::Expression)]
11pub enum LiteralNode {
12 String(String),
14 Number(i32),
16 Float(String),
18 Boolean(bool),
20 Null,
22}
23
24impl AstVisitable for P<LiteralNode> {
25 fn accept<V: AstVisitor>(&self, visitor: &mut V) -> V::Output {
26 visitor.visit_literal(self)
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use crate::decompiler::ast::{emit, new_bool, new_float, new_num, new_str};
33
34 #[test]
35 fn test_literal_emit() {
36 let string = new_str("str");
37 assert_eq!(emit(string), "\"str\"");
38
39 let number = new_num(42);
40 assert_eq!(emit(number), "42");
41
42 let float = new_float("3.14");
43 assert_eq!(emit(float), "3.14");
44
45 let boolean = new_bool(true);
46 assert_eq!(emit(boolean), "true");
47 }
48
49 #[test]
50 fn test_literal_equalities() {
51 let string = new_str("str");
52 let number = new_num(42);
53 let float = new_float("3.14");
54 let boolean = new_bool(true);
55
56 assert_eq!(string, new_str("str"));
57 assert_ne!(string, number);
58 assert_ne!(string, float);
59 assert_ne!(string, boolean);
60
61 assert_ne!(number, string);
62 assert_eq!(number, new_num(42));
63 assert_ne!(number, float);
64 assert_ne!(number, boolean);
65
66 assert_ne!(float, string);
67 assert_ne!(float, number);
68 assert_eq!(float, new_float("3.14"));
69 assert_ne!(float, boolean);
70
71 assert_ne!(boolean, string);
72 assert_ne!(boolean, number);
73 assert_ne!(boolean, float);
74 assert_eq!(boolean, new_bool(true));
75 }
76}