rs_parse_snapshot/
calculate.rs

1pub mod calculate {
2    use crate::define::define::{Node, RcNode};
3    use std::cell::RefMut;
4    use std::collections::HashMap;
5
6    pub fn calculate_constructor(node_type: &String, node_name: &String) -> String {
7        if node_type == "hidden" {
8            "(system)".to_string()
9        } else if node_type == "object" || node_type == "native" {
10            node_name.clone()
11        } else if node_type == "code" {
12            "(compiled code)".to_string()
13        } else {
14            let mut c = String::from("(");
15            c.push_str(node_type.as_str());
16            c.push_str(")");
17            c
18        }
19    }
20    pub fn calculate_source(nodes: &Vec<RcNode>, id_to_ordinal: &HashMap<usize, usize>) {
21        nodes.iter().for_each(|node| {
22            let mut node_mut = node.borrow_mut();
23            let edges = &node_mut.edges;
24            let shared_edge = edges
25                .iter()
26                .find(|&edge| String::from(&edge.ni) == String::from("shared"));
27            let debug_edge = edges
28                .iter()
29                .find(|&edge| String::from(&edge.ni) == String::from("script_or_debug_info"));
30            if shared_edge.is_some() {
31                let shared_edge = shared_edge.unwrap();
32                let tn = shared_edge.tn;
33                let shared_edge_node = get_ordinal(&id_to_ordinal, tn);
34                let share_node = &nodes[shared_edge_node];
35                node_mut.se = find_source_by_script_debug_info(
36                    &nodes,
37                    id_to_ordinal,
38                    &share_node.borrow_mut(),
39                )
40            } else if debug_edge.is_some() {
41                node_mut.se = find_source_by_script_debug_info(&nodes, id_to_ordinal, &node_mut)
42            }
43        });
44    }
45
46    fn find_source_by_script_debug_info(
47        nodes: &Vec<RcNode>,
48        id_to_ordinal: &HashMap<usize, usize>,
49        node: &RefMut<Node>,
50    ) -> Option<String> {
51        let edge = node
52            .edges
53            .iter()
54            .find(|&edge| String::from(&edge.ni) == String::from("script_or_debug_info"));
55        if edge.is_some() {
56            let edge = edge.unwrap();
57            let edge_node = &nodes[get_ordinal(&id_to_ordinal, edge.tn)];
58            let source = String::from(&edge_node.borrow().name);
59            return Some(source);
60        }
61        None
62    }
63    fn get_ordinal(id_to_ordinal: &HashMap<usize, usize>, node_id: usize) -> usize {
64        *id_to_ordinal.get(&node_id).unwrap()
65    }
66}