Skip to main content

luaur_analysis/functions/
write_json_emitter_alt_c.rs

1//! Source: `Analysis/include/Luau/JsonEmitter.h` (lines 236-245, hand-ported)
2//!
3//! C++ template:
4//! ```cpp
5//! template<typename T>
6//! void write(JsonEmitter& emitter, const std::unordered_map<std::string, T>& map)
7//! {
8//!     ObjectEmitter o = emitter.writeObject();
9//!     for (const auto& [k, v] : map)
10//!         o.writePair(k, v);
11//!     o.finish();
12//! }
13//! ```
14//!
15//! DcrLogger stores these maps as `DenseHashMap` / `std::unordered_map` (ported
16//! to `std::collections::HashMap`); both string-keyed forms write as objects
17//! keyed by the (string) key, exactly as the C++ unordered_map overload.
18
19extern crate alloc;
20
21use crate::functions::write_dcr_logger_alt_j::write_json_emitter_dense_hash_map_k_v;
22use crate::methods::object_emitter_write_pair::WriteJson;
23use crate::records::json_emitter::JsonEmitter;
24use alloc::string::String;
25use luaur_common::records::dense_hash_map::DenseHashMap;
26use luaur_common::records::dense_hash_table::DenseDefault;
27
28pub fn write_json_emitter_unordered_map_string_t<T: WriteJson + DenseDefault>(
29    emitter: &mut JsonEmitter,
30    map: &DenseHashMap<String, T>,
31) {
32    let mut o = emitter.write_object();
33
34    for (k, v) in map.iter() {
35        o.write_pair(k.as_str(), v);
36    }
37
38    o.finish();
39}
40
41/// `write(JsonEmitter&, const std::unordered_map<std::string, T>&)` for a
42/// string-keyed `DenseHashMap`.
43impl<T: WriteJson + DenseDefault> WriteJson for DenseHashMap<String, T> {
44    fn write_json(&self, emitter: &mut JsonEmitter) {
45        write_json_emitter_unordered_map_string_t(emitter, self);
46    }
47}
48
49/// Same overload for the `std::unordered_map<std::string, T>` ported to the std
50/// `HashMap` (used by `ScopeSnapshot::bindings` etc.).
51impl<T: WriteJson> WriteJson for std::collections::HashMap<String, T> {
52    fn write_json(&self, emitter: &mut JsonEmitter) {
53        let mut o = emitter.write_object();
54        for (k, v) in self.iter() {
55            o.write_pair(k.as_str(), v);
56        }
57        o.finish();
58    }
59}
60
61/// Pointer-keyed `DenseHashMap` (e.g. `unsolvedConstraints`, `typeStrings`):
62/// DcrLogger writes these through its own `write` overload, which keys the
63/// object by each key's pointer id.
64impl<K, V: WriteJson + DenseDefault> WriteJson for DenseHashMap<*const K, V> {
65    fn write_json(&self, emitter: &mut JsonEmitter) {
66        write_json_emitter_dense_hash_map_k_v(emitter, self);
67    }
68}