Skip to main content

luaur_analysis/methods/
stringifier_state_emit_primitives.rs

1//! Source: `Analysis/src/ToString.cpp:254-305` (hand-ported)
2//! The C++ overloaded `emit(...)` family as a trait + generic method
3//! (the AstJsonEncoder::write precedent).
4
5use crate::records::stringifier_state::StringifierState;
6use crate::records::type_level::TypeLevel;
7use alloc::string::{String, ToString};
8
9pub trait EmitText {
10    fn emit_text(&self, state: &mut StringifierState);
11}
12
13impl StringifierState {
14    /// Generic entry mirroring C++ overload resolution: `state.emit(x)`.
15    pub fn emit<T: EmitText + ?Sized>(&mut self, value: &T) {
16        value.emit_text(self);
17    }
18
19    fn emit_str_raw(&mut self, s: &str) {
20        unsafe {
21            // if (opts.maxTypeLength > 0 && result.name.length() > opts.maxTypeLength) return;
22            let opts = &*self.opts;
23            let result = &mut *self.result;
24            if opts.max_type_length > 0 && result.name.len() > opts.max_type_length as usize {
25                return;
26            }
27            result.name.push_str(s);
28        }
29    }
30}
31
32impl EmitText for str {
33    fn emit_text(&self, state: &mut StringifierState) {
34        state.emit_str_raw(self);
35    }
36}
37impl EmitText for String {
38    fn emit_text(&self, state: &mut StringifierState) {
39        state.emit_str_raw(self);
40    }
41}
42impl EmitText for TypeLevel {
43    fn emit_text(&self, state: &mut StringifierState) {
44        state.emit_str_raw(&self.level.to_string());
45        state.emit_str_raw("-");
46        state.emit_str_raw(&self.subLevel.to_string());
47    }
48}
49macro_rules! emit_int {
50    ($($t:ty),*) => {$(
51        impl EmitText for $t {
52            fn emit_text(&self, state: &mut StringifierState) {
53                state.emit_str_raw(&self.to_string());
54            }
55        }
56    )*};
57}
58emit_int!(i32, i64, u32, u64, usize, isize);