use crate::ir::ast::{ClassDefinition, ClassType, StoredDefinition};
use indexmap::IndexSet;
fn collect_function_names_from_class(
class: &ClassDefinition,
prefix: &str,
names: &mut IndexSet<String>,
) {
let full_name = if prefix.is_empty() {
class.name.text.clone()
} else {
format!("{}.{}", prefix, class.name.text)
};
if matches!(class.class_type, ClassType::Function) {
names.insert(full_name.clone());
names.insert(class.name.text.clone());
}
if matches!(class.class_type, ClassType::Package) {
names.insert(full_name.clone());
names.insert(class.name.text.clone());
}
for (_name, nested_class) in &class.classes {
collect_function_names_from_class(nested_class, &full_name, names);
}
if matches!(class.class_type, ClassType::Package) {
collect_function_names_with_relative_paths(class, &class.name.text, names);
}
}
fn collect_function_names_with_relative_paths(
class: &ClassDefinition,
relative_prefix: &str,
names: &mut IndexSet<String>,
) {
for (_name, nested_class) in &class.classes {
let relative_name = format!("{}.{}", relative_prefix, nested_class.name.text);
if matches!(nested_class.class_type, ClassType::Function) {
names.insert(relative_name.clone());
}
if matches!(nested_class.class_type, ClassType::Package) {
collect_function_names_with_relative_paths(nested_class, &relative_name, names);
}
}
}
pub fn collect_all_functions(def: &StoredDefinition) -> Vec<String> {
let mut names = IndexSet::new();
for (_class_name, class) in &def.class_list {
collect_function_names_from_class(class, "", &mut names);
}
names.into_iter().collect()
}