#![deny(rust_2018_idioms)]
use crate::display::sanitize_debug_name;
use crate::rust_ir::*;
use chalk_ir::interner::Interner;
use chalk_ir::*;
use std::fmt::Debug;
use std::sync::Arc;
pub mod clauses;
pub mod coherence;
pub mod coinductive_goal;
pub mod display;
pub mod ext;
pub mod goal_builder;
pub mod infer;
pub mod logging;
pub mod logging_db;
pub mod rust_ir;
pub mod solve;
pub mod split;
pub mod wf;
pub trait RustIrDatabase<I: Interner>: Debug {
fn custom_clauses(&self) -> Vec<ProgramClause<I>>;
fn associated_ty_data(&self, ty: AssocTypeId<I>) -> Arc<AssociatedTyDatum<I>>;
fn trait_datum(&self, trait_id: TraitId<I>) -> Arc<TraitDatum<I>>;
fn adt_datum(&self, adt_id: AdtId<I>) -> Arc<AdtDatum<I>>;
fn generator_datum(&self, generator_id: GeneratorId<I>) -> Arc<GeneratorDatum<I>>;
fn generator_witness_datum(
&self,
generator_id: GeneratorId<I>,
) -> Arc<GeneratorWitnessDatum<I>>;
fn adt_repr(&self, id: AdtId<I>) -> Arc<AdtRepr<I>>;
fn adt_size_align(&self, id: AdtId<I>) -> Arc<AdtSizeAlign>;
fn fn_def_datum(&self, fn_def_id: FnDefId<I>) -> Arc<FnDefDatum<I>>;
fn impl_datum(&self, impl_id: ImplId<I>) -> Arc<ImplDatum<I>>;
fn associated_ty_value(&self, id: AssociatedTyValueId<I>) -> Arc<AssociatedTyValue<I>>;
fn opaque_ty_data(&self, id: OpaqueTyId<I>) -> Arc<OpaqueTyDatum<I>>;
fn hidden_opaque_type(&self, id: OpaqueTyId<I>) -> Ty<I>;
fn impls_for_trait(
&self,
trait_id: TraitId<I>,
parameters: &[GenericArg<I>],
binders: &CanonicalVarKinds<I>,
) -> Vec<ImplId<I>>;
fn local_impls_to_coherence_check(&self, trait_id: TraitId<I>) -> Vec<ImplId<I>>;
fn impl_provided_for(&self, auto_trait_id: TraitId<I>, ty: &TyKind<I>) -> bool;
fn well_known_trait_id(&self, well_known_trait: WellKnownTrait) -> Option<TraitId<I>>;
fn program_clauses_for_env(&self, environment: &Environment<I>) -> ProgramClauses<I>;
fn interner(&self) -> I;
fn is_object_safe(&self, trait_id: TraitId<I>) -> bool;
fn closure_kind(&self, closure_id: ClosureId<I>, substs: &Substitution<I>) -> ClosureKind;
fn closure_inputs_and_output(
&self,
closure_id: ClosureId<I>,
substs: &Substitution<I>,
) -> Binders<FnDefInputsAndOutputDatum<I>>;
fn closure_upvars(&self, closure_id: ClosureId<I>, substs: &Substitution<I>) -> Binders<Ty<I>>;
fn closure_fn_substitution(
&self,
closure_id: ClosureId<I>,
substs: &Substitution<I>,
) -> Substitution<I>;
fn unification_database(&self) -> &dyn UnificationDatabase<I>;
fn trait_name(&self, trait_id: TraitId<I>) -> String {
sanitize_debug_name(|f| I::debug_trait_id(trait_id, f))
}
fn adt_name(&self, adt_id: AdtId<I>) -> String {
sanitize_debug_name(|f| I::debug_adt_id(adt_id, f))
}
fn assoc_type_name(&self, assoc_ty_id: AssocTypeId<I>) -> String {
sanitize_debug_name(|f| I::debug_assoc_type_id(assoc_ty_id, f))
}
fn opaque_type_name(&self, opaque_ty_id: OpaqueTyId<I>) -> String {
sanitize_debug_name(|f| I::debug_opaque_ty_id(opaque_ty_id, f))
}
fn fn_def_name(&self, fn_def_id: FnDefId<I>) -> String {
sanitize_debug_name(|f| I::debug_fn_def_id(fn_def_id, f))
}
fn discriminant_type(&self, ty: Ty<I>) -> Ty<I>;
}
pub use clauses::program_clauses_for_env;
pub use solve::Guidance;
pub use solve::Solution;
pub use solve::Solver;
pub use solve::SubstitutionResult;
#[macro_use]
mod debug_macros {
#[macro_export]
macro_rules! debug_span {
($($t: tt)*) => {
let __span = tracing::debug_span!($($t)*);
let __span = __span.enter();
};
}
}