use std::collections::{HashMap, HashSet};
use crate::types::Node;
use super::{ReferenceResolver, ResolutionContext, ResolvedBy, ResolvedRef, UnresolvedRef};
impl<'db> ReferenceResolver<'db> {
fn get_razor_usings(&mut self, file_path: &str) -> Vec<String> {
if let Some(cached) = self.razor_usings_cache.get(file_path) {
return cached.clone();
}
let mut usings = HashSet::new();
let mut add_from = |src: Option<String>| {
let Some(src) = src else {
return;
};
for line in src.lines() {
let trimmed = line.trim_start();
let Some(rest) = trimmed.strip_prefix("@using") else {
continue;
};
let rest = rest
.trim_start()
.strip_prefix("static")
.unwrap_or(rest)
.trim_start();
let ns = rest
.chars()
.take_while(|ch| ch.is_ascii_alphanumeric() || *ch == '_' || *ch == '.')
.collect::<String>();
if !ns.is_empty() {
usings.insert(ns);
}
}
};
add_from(self.read_file(file_path));
let mut dir = file_path
.rsplit_once('/')
.map(|(dir, _)| dir.to_string())
.unwrap_or_default();
loop {
let imports = if dir.is_empty() {
"_Imports.razor".to_string()
} else {
format!("{dir}/_Imports.razor")
};
add_from(self.read_file(&imports));
if dir.is_empty() {
break;
}
dir = dir
.rsplit_once('/')
.map(|(parent, _)| parent.to_string())
.unwrap_or_default();
}
let arr = usings.into_iter().collect::<Vec<_>>();
self.razor_usings_cache
.insert(file_path.to_string(), arr.clone());
arr
}
pub(super) fn resolve_razor_using(&mut self, reference: &UnresolvedRef) -> Option<ResolvedRef> {
if reference.reference_name.contains('.') || reference.reference_name.contains("::") {
return None;
}
let usings = self.get_razor_usings(&reference.file_path);
if usings.is_empty() {
return None;
}
let mut found: HashMap<String, Node> = HashMap::new();
for ns in usings {
for candidate in
self.get_nodes_by_qualified_name(&format!("{}::{}", ns, reference.reference_name))
{
found.insert(candidate.id.clone(), candidate);
}
}
if found.len() != 1 {
return None;
}
let target = found.into_values().next()?;
Some(ResolvedRef {
original: reference.clone(),
target_node_id: target.id,
confidence: 0.9,
resolved_by: ResolvedBy::Import,
})
}
}