use crate::{
    database::{AstStorage, HirStorage, InputStorage},
    validation::ValidationStorage,
    HirDatabase,
};
pub trait Upcast<T: ?Sized> {
    fn upcast(&self) -> &T;
}
#[salsa::database(InputStorage, AstStorage, HirStorage, ValidationStorage)]
#[derive(Default)]
pub struct RootDatabase {
    pub storage: salsa::Storage<RootDatabase>,
}
impl salsa::Database for RootDatabase {}
impl salsa::ParallelDatabase for RootDatabase {
    fn snapshot(&self) -> salsa::Snapshot<RootDatabase> {
        salsa::Snapshot::new(RootDatabase {
            storage: self.storage.snapshot(),
        })
    }
}
impl Upcast<dyn HirDatabase> for RootDatabase {
    fn upcast(&self) -> &(dyn HirDatabase + 'static) {
        self
    }
}