use rustc_hash::{FxHashMap, FxHashSet};
use std::sync::Arc;
use mir_types::{Name, Type};
pub type FileImportSnapshot = (Arc<str>, Arc<FxHashMap<Name, Name>>);
pub type SubtypeCache = dashmap::DashMap<(u64, u64), (Box<str>, Box<str>, bool)>;
#[salsa::db]
pub trait MirDatabase: salsa::Database {
fn php_version_str(&self) -> Arc<str>;
fn file_namespace(&self, file: &str) -> Option<Arc<str>>;
fn file_imports(&self, file: &str) -> Arc<FxHashMap<Name, Name>>;
fn global_var_type(&self, name: &str) -> Option<Type>;
fn file_import_snapshots(&self) -> Vec<FileImportSnapshot>;
fn symbol_defining_file(&self, symbol: &str) -> Option<Arc<str>>;
fn symbols_defined_in_file(&self, file: &str) -> Vec<Arc<str>>;
fn file_defined_symbols(&self, file: &str) -> FxHashSet<Arc<str>>;
fn symbol_referencers_of(&self, symbol_key: &str) -> Vec<Arc<str>>;
fn record_reference_location(&self, loc: RefLoc);
fn take_pending_ref_locs(&self) -> Vec<RefLoc>;
fn replay_reference_locations(&self, file: Arc<str>, locs: &[(String, u32, u16, u16)]);
fn extract_file_reference_locations(&self, file: &str) -> Vec<(Arc<str>, u32, u16, u16)>;
fn reference_locations(&self, symbol: &str) -> Vec<(Arc<str>, u32, u16, u16)>;
fn has_reference(&self, symbol: &str) -> bool;
fn clear_file_references(&self, file: &str);
fn all_reference_location_pairs(&self) -> Vec<(Arc<str>, Arc<str>)>;
fn file_referenced_symbols(&self, file: &str) -> Vec<Arc<str>>;
fn lookup_source_file(&self, path: &str) -> Option<SourceFile>;
fn resolver_config(&self) -> Option<ResolverConfig>;
fn current_resolver(&self) -> Option<Arc<dyn crate::ClassResolver>>;
fn workspace_revision(&self) -> Option<WorkspaceRevision>;
fn workspace_symbol_index_singleton(&self) -> Option<WorkspaceSymbolIndexSingleton>;
fn frozen_workspace_index(&self) -> Option<&WorkspaceSymbolIndex>;
fn subtype_cache(&self) -> Option<&SubtypeCache>;
fn all_source_files(&self) -> Vec<SourceFile>;
fn user_stub_source_files(&self) -> Vec<SourceFile>;
fn stub_cache(&self) -> Option<Arc<crate::stub_cache::StubSliceCache>>;
fn parse_cache(&self) -> Arc<crate::parse_cache::ParseCache>;
}
pub use self::ancestors::*;
pub use self::find_queries::{
analyzed_class_defs, analyzed_interface_defs, class_ancestors_by_fqcn, class_in_file,
enum_in_file, find_class_constant_in_chain, find_class_constant_in_class, find_class_like,
find_function, find_global_constant, find_method_in_chain, find_method_in_class,
find_property_in_chain, find_property_in_class, function_in_file, global_constant_in_file,
has_method_in_chain, interface_in_file, is_method_concretely_implemented, trait_in_file,
ClassLike,
};
pub use self::inferred_types::{
inferred_function_return_type_demand, inferred_method_return_type_demand,
};
#[allow(unused_imports)]
pub use self::mirdb::MirDbStorage;
pub use self::nodes::*;
pub use self::per_function::{infer_function, FunctionInferenceResult};
pub use self::queries::{
class_constant_exists_in_chain, class_exists, class_kind, class_template_params,
collect_file_definitions, collect_file_definitions_uncached, constant_exists,
extends_or_implements, function_exists, has_unknown_ancestor, infer_file_return_types,
inherited_template_bindings, is_unchecked_exception, member_location, parse_file, resolve_name,
ClassKind, InferredFileTypes, TrackedParseResult,
};
pub use self::reference_locations::*;
pub use self::resolver::{resolve_fqcn_to_path, source_file_for_fqcn, Fqcn, ResolverConfig};
pub use self::workspace::{
collect_file_declarations, workspace_classes, workspace_functions, workspace_global_vars,
workspace_index, workspace_symbol_index, FileDeclarations, GlobalVarMap, IndexDeclCounts,
SymbolLoc, SymbolTier, WorkspaceRevision, WorkspaceSymbolIndex, WorkspaceSymbolIndexSingleton,
};
mod ancestors;
mod find_queries;
mod inferred_types;
mod mirdb;
mod nodes;
mod per_function;
mod queries;
mod reference_locations;
mod resolver;
mod workspace;
#[cfg(test)]
pub mod tests;