gbf_core/decompiler/ast/
literal.rs

1#![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/// Represents a type of literal.
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, AstNodeTransform)]
10#[convert_to(ExprKind::Literal, AstKind::Expression)]
11pub enum LiteralNode {
12    /// A string literal.
13    String(String),
14    /// A number literal.
15    Number(i32),
16    /// A floating point number literal (represented in GS2 as a string).
17    Float(String),
18    /// A boolean literal.
19    Boolean(bool),
20    /// A null literal.
21    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}