use crate::AliasTy;
use crate::AssocTypeId;
use crate::CanonicalVarKind;
use crate::CanonicalVarKinds;
use crate::ClosureId;
use crate::Constraint;
use crate::Constraints;
use crate::CoroutineId;
use crate::FnDefId;
use crate::ForeignDefId;
use crate::GenericArg;
use crate::GenericArgData;
use crate::Goal;
use crate::GoalData;
use crate::Goals;
use crate::InEnvironment;
use crate::Lifetime;
use crate::LifetimeData;
use crate::OpaqueTy;
use crate::OpaqueTyId;
use crate::ProgramClause;
use crate::ProgramClauseData;
use crate::ProgramClauseImplication;
use crate::ProgramClauses;
use crate::ProjectionTy;
use crate::QuantifiedWhereClause;
use crate::QuantifiedWhereClauses;
use crate::SeparatorTraitRef;
use crate::Substitution;
use crate::TraitId;
use crate::Ty;
use crate::TyData;
use crate::VariableKind;
use crate::VariableKinds;
use crate::Variance;
use crate::Variances;
use crate::{AdtId, TyKind};
use crate::{Const, ConstData};
use std::fmt::{self, Debug};
use std::hash::Hash;
use std::marker::PhantomData;
use std::sync::Arc;
pub trait Interner: Debug + Copy + Eq + Hash + Sized {
type InternedType: Debug + Clone + Eq + Hash;
type InternedLifetime: Debug + Clone + Eq + Hash;
type InternedConst: Debug + Clone + Eq + Hash;
type InternedConcreteConst: Debug + Clone + Eq + Hash;
type InternedGenericArg: Debug + Clone + Eq + Hash;
type InternedGoal: Debug + Clone + Eq + Hash;
type InternedGoals: Debug + Clone + Eq + Hash;
type InternedSubstitution: Debug + Clone + Eq + Hash;
type InternedProgramClauses: Debug + Clone + Eq + Hash;
type InternedProgramClause: Debug + Clone + Eq + Hash;
type InternedQuantifiedWhereClauses: Debug + Clone + Eq + Hash;
type InternedVariableKinds: Debug + Clone + Eq + Hash;
type InternedCanonicalVarKinds: Debug + Clone + Eq + Hash;
type InternedConstraints: Debug + Clone + Eq + Hash;
type InternedVariances: Debug + Clone + Eq + Hash;
type DefId: Debug + Copy + Eq + Hash;
type InternedAdtId: Debug + Copy + Eq + Hash;
type Identifier: Debug + Clone + Eq + Hash;
type FnAbi: Debug + Copy + Eq + Hash;
#[allow(unused_variables)]
fn debug_adt_id(adt_id: AdtId<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_trait_id(
trait_id: TraitId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_assoc_type_id(
type_id: AssocTypeId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_opaque_ty_id(
opaque_ty_id: OpaqueTyId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_fn_def_id(
fn_def_id: FnDefId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_closure_id(
fn_def_id: ClosureId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_foreign_def_id(
foreign_def_id: ForeignDefId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_coroutine_id(
coroutine_id: CoroutineId<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_alias(alias: &AliasTy<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_projection_ty(
projection_ty: &ProjectionTy<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_opaque_ty(
opaque_ty: &OpaqueTy<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_ty(ty: &Ty<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_lifetime(
lifetime: &Lifetime<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_const(constant: &Const<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_generic_arg(
generic_arg: &GenericArg<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_variable_kinds(
variable_kinds: &VariableKinds<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_variable_kinds_with_angles(
variable_kinds: &VariableKinds<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_canonical_var_kinds(
canonical_var_kinds: &CanonicalVarKinds<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_goal(goal: &Goal<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_goals(goals: &Goals<Self>, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_program_clause_implication(
pci: &ProgramClauseImplication<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_program_clause(
clause: &ProgramClause<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_program_clauses(
clauses: &ProgramClauses<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_substitution(
substitution: &Substitution<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_separator_trait_ref(
separator_trait_ref: &SeparatorTraitRef<'_, Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_quantified_where_clauses(
clauses: &QuantifiedWhereClauses<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_constraints(
clauses: &Constraints<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
#[allow(unused_variables)]
fn debug_variances(
variances: &Variances<Self>,
fmt: &mut fmt::Formatter<'_>,
) -> Option<fmt::Result> {
None
}
fn intern_ty(self, kind: TyKind<Self>) -> Self::InternedType;
fn ty_data(self, ty: &Self::InternedType) -> &TyData<Self>;
fn intern_lifetime(self, lifetime: LifetimeData<Self>) -> Self::InternedLifetime;
fn lifetime_data(self, lifetime: &Self::InternedLifetime) -> &LifetimeData<Self>;
fn intern_const(self, constant: ConstData<Self>) -> Self::InternedConst;
fn const_data(self, constant: &Self::InternedConst) -> &ConstData<Self>;
fn const_eq(
self,
ty: &Self::InternedType,
c1: &Self::InternedConcreteConst,
c2: &Self::InternedConcreteConst,
) -> bool;
fn intern_generic_arg(self, data: GenericArgData<Self>) -> Self::InternedGenericArg;
fn generic_arg_data(self, lifetime: &Self::InternedGenericArg) -> &GenericArgData<Self>;
fn intern_goal(self, data: GoalData<Self>) -> Self::InternedGoal;
fn goal_data(self, goal: &Self::InternedGoal) -> &GoalData<Self>;
fn intern_goals<E>(
self,
data: impl IntoIterator<Item = Result<Goal<Self>, E>>,
) -> Result<Self::InternedGoals, E>;
fn goals_data(self, goals: &Self::InternedGoals) -> &[Goal<Self>];
fn intern_substitution<E>(
self,
data: impl IntoIterator<Item = Result<GenericArg<Self>, E>>,
) -> Result<Self::InternedSubstitution, E>;
fn substitution_data(self, substitution: &Self::InternedSubstitution) -> &[GenericArg<Self>];
fn intern_program_clause(self, data: ProgramClauseData<Self>) -> Self::InternedProgramClause;
fn program_clause_data(self, clause: &Self::InternedProgramClause) -> &ProgramClauseData<Self>;
fn intern_program_clauses<E>(
self,
data: impl IntoIterator<Item = Result<ProgramClause<Self>, E>>,
) -> Result<Self::InternedProgramClauses, E>;
fn program_clauses_data(self, clauses: &Self::InternedProgramClauses)
-> &[ProgramClause<Self>];
fn intern_quantified_where_clauses<E>(
self,
data: impl IntoIterator<Item = Result<QuantifiedWhereClause<Self>, E>>,
) -> Result<Self::InternedQuantifiedWhereClauses, E>;
fn quantified_where_clauses_data(
self,
clauses: &Self::InternedQuantifiedWhereClauses,
) -> &[QuantifiedWhereClause<Self>];
fn intern_generic_arg_kinds<E>(
self,
data: impl IntoIterator<Item = Result<VariableKind<Self>, E>>,
) -> Result<Self::InternedVariableKinds, E>;
fn variable_kinds_data(
self,
variable_kinds: &Self::InternedVariableKinds,
) -> &[VariableKind<Self>];
fn intern_canonical_var_kinds<E>(
self,
data: impl IntoIterator<Item = Result<CanonicalVarKind<Self>, E>>,
) -> Result<Self::InternedCanonicalVarKinds, E>;
fn canonical_var_kinds_data(
self,
canonical_var_kinds: &Self::InternedCanonicalVarKinds,
) -> &[CanonicalVarKind<Self>];
fn intern_constraints<E>(
self,
data: impl IntoIterator<Item = Result<InEnvironment<Constraint<Self>>, E>>,
) -> Result<Self::InternedConstraints, E>;
fn constraints_data(
self,
constraints: &Self::InternedConstraints,
) -> &[InEnvironment<Constraint<Self>>];
fn intern_variances<E>(
self,
data: impl IntoIterator<Item = Result<Variance, E>>,
) -> Result<Self::InternedVariances, E>;
fn variances_data(self, variances: &Self::InternedVariances) -> &[Variance];
}
pub trait HasInterner {
type Interner: Interner;
}
impl<T: HasInterner> HasInterner for [T] {
type Interner = T::Interner;
}
impl<T: HasInterner> HasInterner for Vec<T> {
type Interner = T::Interner;
}
impl<T: HasInterner + ?Sized> HasInterner for Box<T> {
type Interner = T::Interner;
}
impl<T: HasInterner + ?Sized> HasInterner for Arc<T> {
type Interner = T::Interner;
}
impl<T: HasInterner + ?Sized> HasInterner for &T {
type Interner = T::Interner;
}
impl<I: Interner> HasInterner for PhantomData<I> {
type Interner = I;
}
impl<A, B, I> HasInterner for (A, B)
where
A: HasInterner<Interner = I>,
B: HasInterner<Interner = I>,
I: Interner,
{
type Interner = I;
}
impl<A, B, C, I> HasInterner for (A, B, C)
where
A: HasInterner<Interner = I>,
B: HasInterner<Interner = I>,
C: HasInterner<Interner = I>,
I: Interner,
{
type Interner = I;
}
impl<'a, T: HasInterner> HasInterner for std::slice::Iter<'a, T> {
type Interner = T::Interner;
}