neo_solidity/solidity/analyse/inheritance/
interface_collection.rs1fn collect_interface_events_recursive(
2 contract: &ContractIR,
3 contract_map: &std::collections::HashMap<String, ContractIR>,
4 seen: &mut std::collections::HashSet<String>,
5 out: &mut Vec<EventIR>,
6) {
7 for base in &contract.bases {
8 let Some(base_name) = base_last_name(base) else {
9 continue;
10 };
11
12 let Some(base_contract) = contract_map.get(&base_name) else {
13 continue;
14 };
15
16 match base_contract.kind {
17 ContractKind::Interface => {
18 if seen.insert(base_name.clone()) {
19 out.extend(base_contract.events.clone());
20 collect_interface_events_recursive(base_contract, contract_map, seen, out);
21 }
22 }
23 ContractKind::Contract | ContractKind::AbstractContract => {
24 collect_interface_events_recursive(base_contract, contract_map, seen, out);
25 }
26 _ => {}
27 }
28 }
29}
30
31fn collect_interface_events(
32 contract: &ContractIR,
33 contract_map: &std::collections::HashMap<String, ContractIR>,
34) -> Vec<EventIR> {
35 let mut events = Vec::new();
36 let mut seen = std::collections::HashSet::new();
37 collect_interface_events_recursive(contract, contract_map, &mut seen, &mut events);
38 events
39}
40
41fn collect_interface_types_recursive(
42 contract: &ContractIR,
43 contract_map: &std::collections::HashMap<String, ContractIR>,
44 seen: &mut std::collections::HashSet<String>,
45 structs: &mut Vec<StructIR>,
46 enums: &mut Vec<EnumIR>,
47) {
48 for base in &contract.bases {
49 let Some(base_name) = base_last_name(base) else {
50 continue;
51 };
52
53 let Some(base_contract) = contract_map.get(&base_name) else {
54 continue;
55 };
56
57 match base_contract.kind {
58 ContractKind::Interface => {
59 if seen.insert(base_name.clone()) {
60 structs.extend(base_contract.structs.clone());
61 enums.extend(base_contract.enums.clone());
62 collect_interface_types_recursive(
63 base_contract,
64 contract_map,
65 seen,
66 structs,
67 enums,
68 );
69 }
70 }
71 ContractKind::Contract | ContractKind::AbstractContract => {
72 collect_interface_types_recursive(base_contract, contract_map, seen, structs, enums);
73 }
74 _ => {}
75 }
76 }
77}
78
79fn collect_interface_types(
80 contract: &ContractIR,
81 contract_map: &std::collections::HashMap<String, ContractIR>,
82) -> (Vec<StructIR>, Vec<EnumIR>) {
83 let mut structs = Vec::new();
84 let mut enums = Vec::new();
85 let mut seen = std::collections::HashSet::new();
86 collect_interface_types_recursive(contract, contract_map, &mut seen, &mut structs, &mut enums);
87 (structs, enums)
88}