use std::sync::Arc;
use mir_types::Type;
use crate::db::{Fqcn, MirDatabase};
const WIDEN_AFTER_ITERATIONS: u32 = 3;
pub(crate) fn should_widen(cycle: &salsa::Cycle) -> bool {
cycle.iteration() >= WIDEN_AFTER_ITERATIONS
}
pub(crate) fn widen_unstable<T: PartialEq>(
last: &[T],
value: &mut [T],
ty: impl Fn(&mut T) -> &mut Type,
) {
for entry in value.iter_mut() {
if !last.contains(entry) {
*ty(entry) = Type::mixed();
}
}
}
pub fn inferred_function_return_type_demand(db: &dyn MirDatabase, fqn: &str) -> Option<Arc<Type>> {
let sf = crate::db::function_loc(db, Fqcn::from_str(db, fqn))?.file();
let inferred = crate::db::infer_file_return_types(db, sf);
inferred.functions.get(fqn).cloned()
}
pub fn inferred_function_return_type_from(
db: &dyn MirDatabase,
file: &str,
fqn: &str,
) -> Option<Arc<Type>> {
let sf = crate::db::function_loc_from(db, file, Fqcn::from_str(db, fqn))?.file();
let inferred = crate::db::infer_file_return_types(db, sf);
inferred.functions.get(fqn).cloned()
}
pub fn inferred_method_return_type_demand(
db: &dyn MirDatabase,
fqcn: &str,
method_name_lower: &str,
) -> Option<Arc<Type>> {
let sf = crate::db::class_like_loc(db, Fqcn::from_str(db, fqcn))?.file();
let inferred = crate::db::infer_file_return_types(db, sf);
inferred
.methods
.get(&(Arc::<str>::from(fqcn), Arc::<str>::from(method_name_lower)))
.cloned()
}
pub fn inferred_property_type_demand(
db: &dyn MirDatabase,
fqcn: &str,
name: &str,
) -> Option<Arc<Type>> {
let sf = crate::db::class_like_loc(db, Fqcn::from_str(db, fqcn))?.file();
let inferred = crate::db::infer_file_return_types(db, sf);
inferred
.properties
.get(&(Arc::<str>::from(fqcn), Arc::<str>::from(name)))
.cloned()
}