use crate::graph_support::RubySource;
use crate::mixins::ruby_forward_superclass_targets;
use brokk_bifrost_core::analyzer::CodeUnit;
use brokk_bifrost_core::hash::HashMap;
pub fn ruby_resolve_supertype(ruby: &dyn RubySource, raw: &str) -> Option<CodeUnit> {
let cleaned = raw.trim();
if cleaned.is_empty() {
return None;
}
if let Some(found) = ruby.definitions(cleaned).next() {
return Some(found.clone());
}
let last_segment = cleaned.rsplit('$').next().unwrap_or(cleaned); ruby.types_by_identifier()
.get(last_segment)
.and_then(|types| types.first())
.cloned()
}
pub fn build_ruby_types_by_identifier(ruby: &dyn RubySource) -> HashMap<String, Vec<CodeUnit>> {
let mut index: HashMap<String, Vec<CodeUnit>> = HashMap::default();
for code_unit in ruby.all_declarations() {
if code_unit.is_class() || code_unit.is_module() {
index
.entry(code_unit.identifier().to_string())
.or_default()
.push(code_unit.clone());
}
}
index
}
pub fn ruby_supports_type_hierarchy(code_unit: &CodeUnit) -> bool {
code_unit.is_class() || code_unit.is_module()
}
pub fn ruby_direct_ancestors(ruby: &dyn RubySource, code_unit: &CodeUnit) -> Vec<CodeUnit> {
ruby_forward_superclass_targets(ruby, code_unit)
.iter()
.filter_map(|raw| ruby_resolve_supertype(ruby, raw))
.collect()
}