neo_solidity/solidity/analyse/inheritance/
interface_collection.rs

1fn 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}