use std::collections::{HashMap, HashSet};
use crate::db::queries::QueryBuilder;
use crate::types::Node;
use super::go_module::GoModule;
use super::lru_cache::LruCache;
use super::path_aliases::AliasMap;
use super::workspace_packages::WorkspacePackages;
pub use super::types::*;
mod builtins;
mod builtins_core;
mod builtins_native;
mod cache;
mod context;
mod edges;
mod helpers;
mod razor;
mod resolve;
mod this_member;
pub struct ReferenceResolver<'db> {
project_root: String,
pub queries: QueryBuilder<'db>,
frameworks: Vec<Box<dyn FrameworkResolver>>,
deferred_chain_refs: Vec<UnresolvedRef>,
deferred_this_member_refs: Vec<UnresolvedRef>,
razor_usings_cache: HashMap<String, Vec<String>>,
node_cache: LruCache<String, Vec<Node>>,
file_cache: LruCache<String, Option<String>>,
import_mapping_cache: LruCache<String, Vec<ImportMapping>>,
re_export_cache: LruCache<String, Vec<ReExport>>,
name_cache: LruCache<String, Vec<Node>>,
lower_name_cache: LruCache<String, Vec<Node>>,
qualified_name_cache: LruCache<String, Vec<Node>>,
known_names: Option<HashSet<String>>,
known_files: Option<HashSet<String>>,
caches_warmed: bool,
project_aliases: Option<AliasMap>,
project_aliases_loaded: bool,
go_module: Option<GoModule>,
go_module_loaded: bool,
workspace_packages: Option<WorkspacePackages>,
workspace_packages_loaded: bool,
}
pub fn create_resolver<'db>(
project_root: impl Into<String>,
queries: QueryBuilder<'db>,
) -> ReferenceResolver<'db> {
let mut resolver = ReferenceResolver::new(project_root, queries);
resolver.initialize();
resolver
}