use std::collections::HashMap;
use crate::db::queries::QueryBuilder;
use crate::types::Language;
use super::ReferenceResolver;
use super::helpers::resolve_cache_limit;
use crate::resolution::lru_cache::LruCache;
impl<'db> ReferenceResolver<'db> {
pub fn new(project_root: impl Into<String>, queries: QueryBuilder<'db>) -> Self {
let limit = resolve_cache_limit();
let content_limit = 64.max(limit / 5);
Self {
project_root: project_root.into(),
queries,
frameworks: Vec::new(),
deferred_chain_refs: Vec::new(),
deferred_this_member_refs: Vec::new(),
razor_usings_cache: HashMap::new(),
node_cache: LruCache::new(limit),
file_cache: LruCache::new(content_limit),
import_mapping_cache: LruCache::new(limit),
re_export_cache: LruCache::new(limit),
name_cache: LruCache::new(limit),
lower_name_cache: LruCache::new(limit),
qualified_name_cache: LruCache::new(limit),
known_names: None,
known_files: None,
caches_warmed: false,
project_aliases: None,
project_aliases_loaded: false,
go_module: None,
go_module_loaded: false,
workspace_packages: None,
workspace_packages_loaded: false,
}
}
pub fn initialize(&mut self) {
self.frameworks.clear();
self.clear_caches();
}
pub fn run_post_extract(&mut self) -> usize {
0
}
pub fn warm_caches(&mut self) {
if self.caches_warmed {
return;
}
self.known_files = Some(
self.queries
.get_all_file_paths()
.unwrap_or_default()
.into_iter()
.collect(),
);
self.known_names = Some(
self.queries
.get_all_node_names()
.unwrap_or_default()
.into_iter()
.collect(),
);
self.caches_warmed = true;
}
pub fn clear_caches(&mut self) {
self.node_cache.clear();
self.file_cache.clear();
self.import_mapping_cache.clear();
self.re_export_cache.clear();
self.name_cache.clear();
self.lower_name_cache.clear();
self.qualified_name_cache.clear();
self.known_names = None;
self.known_files = None;
self.caches_warmed = false;
}
pub fn get_detected_frameworks(&self) -> Vec<String> {
self.frameworks
.iter()
.map(|framework| framework.name().to_string())
.collect()
}
pub(super) fn get_file_path_from_node_id(&mut self, node_id: &str) -> String {
self.queries
.get_node_by_id(node_id)
.unwrap_or(None)
.map(|node| node.file_path)
.unwrap_or_default()
}
pub(super) fn get_language_from_node_id(&mut self, node_id: &str) -> Language {
self.queries
.get_node_by_id(node_id)
.unwrap_or(None)
.map(|node| node.language)
.unwrap_or(Language::Unknown)
}
}