rs_parse_snapshot/
calculate.rs1pub 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}