2 use smallvec
::SmallVec
;
4 use crate::traits
::project
::Normalized
;
5 use crate::ty
::fold
::{TypeFoldable, TypeFolder, TypeVisitor}
;
6 use crate::ty
::{self, Lift, Ty, TyCtxt}
;
7 use syntax
::symbol
::Symbol
;
11 use std
::collections
::{BTreeSet, BTreeMap}
;
13 // Structural impls for the structs in `traits`.
15 impl<'tcx
, T
: fmt
::Debug
> fmt
::Debug
for Normalized
<'tcx
, T
> {
16 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
17 write
!(f
, "Normalized({:?}, {:?})", self.value
, self.obligations
)
21 impl<'tcx
, O
: fmt
::Debug
> fmt
::Debug
for traits
::Obligation
<'tcx
, O
> {
22 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
23 if ty
::tls
::with(|tcx
| tcx
.sess
.verbose()) {
26 "Obligation(predicate={:?}, cause={:?}, param_env={:?}, depth={})",
27 self.predicate
, self.cause
, self.param_env
, self.recursion_depth
32 "Obligation(predicate={:?}, depth={})",
33 self.predicate
, self.recursion_depth
39 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::Vtable
<'tcx
, N
> {
40 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
42 super::VtableImpl(ref v
) => write
!(f
, "{:?}", v
),
44 super::VtableAutoImpl(ref t
) => write
!(f
, "{:?}", t
),
46 super::VtableClosure(ref d
) => write
!(f
, "{:?}", d
),
48 super::VtableGenerator(ref d
) => write
!(f
, "{:?}", d
),
50 super::VtableFnPointer(ref d
) => write
!(f
, "VtableFnPointer({:?})", d
),
52 super::VtableObject(ref d
) => write
!(f
, "{:?}", d
),
54 super::VtableParam(ref n
) => write
!(f
, "VtableParam({:?})", n
),
56 super::VtableBuiltin(ref d
) => write
!(f
, "{:?}", d
),
58 super::VtableTraitAlias(ref d
) => write
!(f
, "{:?}", d
),
63 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableImplData
<'tcx
, N
> {
64 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
67 "VtableImplData(impl_def_id={:?}, substs={:?}, nested={:?})",
68 self.impl_def_id
, self.substs
, self.nested
73 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableGeneratorData
<'tcx
, N
> {
74 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
77 "VtableGeneratorData(generator_def_id={:?}, substs={:?}, nested={:?})",
78 self.generator_def_id
, self.substs
, self.nested
83 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableClosureData
<'tcx
, N
> {
84 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
87 "VtableClosureData(closure_def_id={:?}, substs={:?}, nested={:?})",
88 self.closure_def_id
, self.substs
, self.nested
93 impl<N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableBuiltinData
<N
> {
94 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
95 write
!(f
, "VtableBuiltinData(nested={:?})", self.nested
)
99 impl<N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableAutoImplData
<N
> {
100 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
103 "VtableAutoImplData(trait_def_id={:?}, nested={:?})",
104 self.trait_def_id
, self.nested
109 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableObjectData
<'tcx
, N
> {
110 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
113 "VtableObjectData(upcast={:?}, vtable_base={}, nested={:?})",
114 self.upcast_trait_ref
, self.vtable_base
, self.nested
119 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableFnPointerData
<'tcx
, N
> {
120 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
123 "VtableFnPointerData(fn_ty={:?}, nested={:?})",
124 self.fn_ty
, self.nested
129 impl<'tcx
, N
: fmt
::Debug
> fmt
::Debug
for traits
::VtableTraitAliasData
<'tcx
, N
> {
130 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
133 "VtableTraitAlias(alias_def_id={:?}, substs={:?}, nested={:?})",
134 self.alias_def_id
, self.substs
, self.nested
139 impl<'tcx
> fmt
::Debug
for traits
::FulfillmentError
<'tcx
> {
140 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
141 write
!(f
, "FulfillmentError({:?},{:?})", self.obligation
, self.code
)
145 impl<'tcx
> fmt
::Debug
for traits
::FulfillmentErrorCode
<'tcx
> {
146 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
148 super::CodeSelectionError(ref e
) => write
!(f
, "{:?}", e
),
149 super::CodeProjectionError(ref e
) => write
!(f
, "{:?}", e
),
150 super::CodeSubtypeError(ref a
, ref b
) => {
151 write
!(f
, "CodeSubtypeError({:?}, {:?})", a
, b
)
153 super::CodeAmbiguity
=> write
!(f
, "Ambiguity"),
158 impl<'tcx
> fmt
::Debug
for traits
::MismatchedProjectionTypes
<'tcx
> {
159 fn fmt(&self, f
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
160 write
!(f
, "MismatchedProjectionTypes({:?})", self.err
)
164 impl<'tcx
> fmt
::Display
for traits
::WhereClause
<'tcx
> {
165 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
166 use crate::traits
::WhereClause
::*;
168 // Bypass `ty::print` because it does not print out anonymous regions.
169 // FIXME(eddyb) implement a custom `PrettyPrinter`, or move this to `ty::print`.
170 fn write_region_name
<'tcx
>(
172 fmt
: &mut fmt
::Formatter
<'_
>
175 ty
::ReLateBound(index
, br
) => match br
{
176 ty
::BoundRegion
::BrNamed(_
, name
) => write
!(fmt
, "{}", name
),
177 ty
::BoundRegion
::BrAnon(var
) => {
178 if *index
== ty
::INNERMOST
{
179 write
!(fmt
, "'^{}", var
)
181 write
!(fmt
, "'^{}_{}", index
.index(), var
)
184 _
=> write
!(fmt
, "'_"),
187 _
=> write
!(fmt
, "{}", r
),
192 Implemented(trait_ref
) => write
!(fmt
, "Implemented({})", trait_ref
),
193 ProjectionEq(projection
) => write
!(fmt
, "ProjectionEq({})", projection
),
194 RegionOutlives(predicate
) => {
195 write
!(fmt
, "RegionOutlives({}: ", predicate
.0)?
;
196 write_region_name(predicate
.1, fmt
)?
;
199 TypeOutlives(predicate
) => {
200 write
!(fmt
, "TypeOutlives({}: ", predicate
.0)?
;
201 write_region_name(predicate
.1, fmt
)?
;
208 impl<'tcx
> fmt
::Display
for traits
::WellFormed
<'tcx
> {
209 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
210 use crate::traits
::WellFormed
::*;
213 Trait(trait_ref
) => write
!(fmt
, "WellFormed({})", trait_ref
),
214 Ty(ty
) => write
!(fmt
, "WellFormed({})", ty
),
219 impl<'tcx
> fmt
::Display
for traits
::FromEnv
<'tcx
> {
220 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
221 use crate::traits
::FromEnv
::*;
224 Trait(trait_ref
) => write
!(fmt
, "FromEnv({})", trait_ref
),
225 Ty(ty
) => write
!(fmt
, "FromEnv({})", ty
),
230 impl<'tcx
> fmt
::Display
for traits
::DomainGoal
<'tcx
> {
231 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
232 use crate::traits
::DomainGoal
::*;
235 Holds(wc
) => write
!(fmt
, "{}", wc
),
236 WellFormed(wf
) => write
!(fmt
, "{}", wf
),
237 FromEnv(from_env
) => write
!(fmt
, "{}", from_env
),
238 Normalize(projection
) => write
!(
240 "Normalize({} -> {})",
241 projection
.projection_ty
,
248 impl fmt
::Display
for traits
::QuantifierKind
{
249 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
250 use crate::traits
::QuantifierKind
::*;
253 Universal
=> write
!(fmt
, "forall"),
254 Existential
=> write
!(fmt
, "exists"),
259 /// Collect names for regions / types bound by a quantified goal / clause.
260 /// This collector does not try to do anything clever like in `ty::print`, it's just used
261 /// for debug output in tests anyway.
262 struct BoundNamesCollector
{
263 // Just sort by name because `BoundRegion::BrNamed` does not have a `BoundVar` index anyway.
264 regions
: BTreeSet
<Symbol
>,
266 // Sort by `BoundVar` index, so usually this should be equivalent to the order given
267 // by the list of type parameters.
268 types
: BTreeMap
<u32, Symbol
>,
270 binder_index
: ty
::DebruijnIndex
,
273 impl BoundNamesCollector
{
275 BoundNamesCollector
{
276 regions
: BTreeSet
::new(),
277 types
: BTreeMap
::new(),
278 binder_index
: ty
::INNERMOST
,
282 fn is_empty(&self) -> bool
{
283 self.regions
.is_empty() && self.types
.is_empty()
286 fn write_names(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
287 let mut start
= true;
288 for r
in &self.regions
{
293 write
!(fmt
, "{}", r
)?
;
295 for (_
, t
) in &self.types
{
300 write
!(fmt
, "{}", t
)?
;
306 impl<'tcx
> TypeVisitor
<'tcx
> for BoundNamesCollector
{
307 fn visit_binder
<T
: TypeFoldable
<'tcx
>>(&mut self, t
: &ty
::Binder
<T
>) -> bool
{
308 self.binder_index
.shift_in(1);
309 let result
= t
.super_visit_with(self);
310 self.binder_index
.shift_out(1);
314 fn visit_ty(&mut self, t
: Ty
<'tcx
>) -> bool
{
316 ty
::Bound(debruijn
, bound_ty
) if debruijn
== self.binder_index
=> {
318 bound_ty
.var
.as_u32(),
319 match bound_ty
.kind
{
320 ty
::BoundTyKind
::Param(name
) => name
,
321 ty
::BoundTyKind
::Anon
=>
322 Symbol
::intern(&format
!("^{}", bound_ty
.var
.as_u32()),
331 t
.super_visit_with(self)
334 fn visit_region(&mut self, r
: ty
::Region
<'tcx
>) -> bool
{
336 ty
::ReLateBound(index
, br
) if *index
== self.binder_index
=> {
338 ty
::BoundRegion
::BrNamed(_
, name
) => {
339 self.regions
.insert(*name
);
342 ty
::BoundRegion
::BrAnon(var
) => {
343 self.regions
.insert(Symbol
::intern(&format
!("'^{}", var
)));
353 r
.super_visit_with(self)
357 impl<'tcx
> fmt
::Display
for traits
::Goal
<'tcx
> {
358 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
359 use crate::traits
::GoalKind
::*;
362 Implies(hypotheses
, goal
) => {
363 write
!(fmt
, "if (")?
;
364 for (index
, hyp
) in hypotheses
.iter().enumerate() {
368 write
!(fmt
, "{}", hyp
)?
;
370 write
!(fmt
, ") {{ {} }}", goal
)
372 And(goal1
, goal2
) => write
!(fmt
, "({} && {})", goal1
, goal2
),
373 Not(goal
) => write
!(fmt
, "not {{ {} }}", goal
),
374 DomainGoal(goal
) => write
!(fmt
, "{}", goal
),
375 Quantified(qkind
, goal
) => {
376 let mut collector
= BoundNamesCollector
::new();
377 goal
.skip_binder().visit_with(&mut collector
);
379 if !collector
.is_empty() {
380 write
!(fmt
, "{}<", qkind
)?
;
381 collector
.write_names(fmt
)?
;
382 write
!(fmt
, "> {{ ")?
;
385 write
!(fmt
, "{}", goal
.skip_binder())?
;
387 if !collector
.is_empty() {
393 Subtype(a
, b
) => write
!(fmt
, "{} <: {}", a
, b
),
394 CannotProve
=> write
!(fmt
, "CannotProve"),
399 impl<'tcx
> fmt
::Display
for traits
::ProgramClause
<'tcx
> {
400 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
401 let traits
::ProgramClause { goal, hypotheses, .. }
= self;
402 write
!(fmt
, "{}", goal
)?
;
403 if !hypotheses
.is_empty() {
404 write
!(fmt
, " :- ")?
;
405 for (index
, condition
) in hypotheses
.iter().enumerate() {
409 write
!(fmt
, "{}", condition
)?
;
416 impl<'tcx
> fmt
::Display
for traits
::Clause
<'tcx
> {
417 fn fmt(&self, fmt
: &mut fmt
::Formatter
<'_
>) -> fmt
::Result
{
418 use crate::traits
::Clause
::*;
421 Implies(clause
) => write
!(fmt
, "{}", clause
),
423 let mut collector
= BoundNamesCollector
::new();
424 clause
.skip_binder().visit_with(&mut collector
);
426 if !collector
.is_empty() {
427 write
!(fmt
, "forall<")?
;
428 collector
.write_names(fmt
)?
;
429 write
!(fmt
, "> {{ ")?
;
432 write
!(fmt
, "{}", clause
.skip_binder())?
;
434 if !collector
.is_empty() {
444 ///////////////////////////////////////////////////////////////////////////
445 // Lift implementations
447 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::SelectionError
<'a
> {
448 type Lifted
= traits
::SelectionError
<'tcx
>;
449 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
451 super::Unimplemented
=> Some(super::Unimplemented
),
452 super::OutputTypeParameterMismatch(a
, b
, ref err
) => {
453 tcx
.lift(&(a
, b
)).and_then(|(a
, b
)|
455 .map(|err
| super::OutputTypeParameterMismatch(a
, b
, err
))
458 super::TraitNotObjectSafe(def_id
) => Some(super::TraitNotObjectSafe(def_id
)),
459 super::ConstEvalFailure(err
) => Some(super::ConstEvalFailure(err
)),
460 super::Overflow
=> Some(super::Overflow
),
465 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::ObligationCauseCode
<'a
> {
466 type Lifted
= traits
::ObligationCauseCode
<'tcx
>;
467 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
469 super::ReturnNoExpression
=> Some(super::ReturnNoExpression
),
470 super::MiscObligation
=> Some(super::MiscObligation
),
471 super::SliceOrArrayElem
=> Some(super::SliceOrArrayElem
),
472 super::TupleElem
=> Some(super::TupleElem
),
473 super::ProjectionWf(proj
) => tcx
.lift(&proj
).map(super::ProjectionWf
),
474 super::ItemObligation(def_id
) => Some(super::ItemObligation(def_id
)),
475 super::BindingObligation(def_id
, span
) => Some(super::BindingObligation(def_id
, span
)),
476 super::ReferenceOutlivesReferent(ty
) => {
477 tcx
.lift(&ty
).map(super::ReferenceOutlivesReferent
)
479 super::ObjectTypeBound(ty
, r
) => tcx
.lift(&ty
).and_then(|ty
|
481 .and_then(|r
| Some(super::ObjectTypeBound(ty
, r
)))
483 super::ObjectCastObligation(ty
) => tcx
.lift(&ty
).map(super::ObjectCastObligation
),
484 super::Coercion { source, target }
=> Some(super::Coercion
{
485 source
: tcx
.lift(&source
)?
,
486 target
: tcx
.lift(&target
)?
,
488 super::AssignmentLhsSized
=> Some(super::AssignmentLhsSized
),
489 super::TupleInitializerSized
=> Some(super::TupleInitializerSized
),
490 super::StructInitializerSized
=> Some(super::StructInitializerSized
),
491 super::VariableType(id
) => Some(super::VariableType(id
)),
492 super::ReturnValue(id
) => Some(super::ReturnValue(id
)),
493 super::ReturnType
=> Some(super::ReturnType
),
494 super::SizedArgumentType
=> Some(super::SizedArgumentType
),
495 super::SizedReturnType
=> Some(super::SizedReturnType
),
496 super::SizedYieldType
=> Some(super::SizedYieldType
),
497 super::RepeatVec(suggest_flag
) => Some(super::RepeatVec(suggest_flag
)),
498 super::FieldSized { adt_kind, last }
=> Some(super::FieldSized { adt_kind, last }
),
499 super::ConstSized
=> Some(super::ConstSized
),
500 super::ConstPatternStructural
=> Some(super::ConstPatternStructural
),
501 super::SharedStatic
=> Some(super::SharedStatic
),
502 super::BuiltinDerivedObligation(ref cause
) => {
503 tcx
.lift(cause
).map(super::BuiltinDerivedObligation
)
505 super::ImplDerivedObligation(ref cause
) => {
506 tcx
.lift(cause
).map(super::ImplDerivedObligation
)
508 super::CompareImplMethodObligation
{
512 } => Some(super::CompareImplMethodObligation
{
517 super::ExprAssignable
=> Some(super::ExprAssignable
),
518 super::MatchExpressionArm(box super::MatchExpressionArmCause
{
525 tcx
.lift(&last_ty
).map(|last_ty
| {
526 super::MatchExpressionArm(box super::MatchExpressionArmCause
{
529 prior_arms
: prior_arms
.clone(),
535 super::MatchExpressionArmPattern { span, ty }
=> {
536 tcx
.lift(&ty
).map(|ty
| super::MatchExpressionArmPattern { span, ty }
)
538 super::IfExpression(box super::IfExpressionCause { then, outer, semicolon }
) => {
539 Some(super::IfExpression(box super::IfExpressionCause
{
545 super::IfExpressionWithNoElse
=> Some(super::IfExpressionWithNoElse
),
546 super::MainFunctionType
=> Some(super::MainFunctionType
),
547 super::StartFunctionType
=> Some(super::StartFunctionType
),
548 super::IntrinsicType
=> Some(super::IntrinsicType
),
549 super::MethodReceiver
=> Some(super::MethodReceiver
),
550 super::BlockTailExpression(id
) => Some(super::BlockTailExpression(id
)),
551 super::TrivialBound
=> Some(super::TrivialBound
),
552 super::AssocTypeBound(ref data
) => Some(super::AssocTypeBound(data
.clone())),
557 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::DerivedObligationCause
<'a
> {
558 type Lifted
= traits
::DerivedObligationCause
<'tcx
>;
559 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
560 tcx
.lift(&self.parent_trait_ref
).and_then(|trait_ref
|
561 tcx
.lift(&*self.parent_code
)
562 .map(|code
| traits
::DerivedObligationCause
{
563 parent_trait_ref
: trait_ref
,
564 parent_code
: Rc
::new(code
),
570 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::ObligationCause
<'a
> {
571 type Lifted
= traits
::ObligationCause
<'tcx
>;
572 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
573 tcx
.lift(&self.code
).map(|code
| traits
::ObligationCause
{
575 body_id
: self.body_id
,
582 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::Vtable
<'a
, ()> {
583 type Lifted
= traits
::Vtable
<'tcx
, ()>;
584 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
586 traits
::VtableImpl(traits
::VtableImplData
{
590 }) => tcx
.lift(&substs
).map(|substs
|
591 traits
::VtableImpl(traits
::VtableImplData
{
597 traits
::VtableAutoImpl(t
) => Some(traits
::VtableAutoImpl(t
)),
598 traits
::VtableGenerator(traits
::VtableGeneratorData
{
602 }) => tcx
.lift(&substs
).map(|substs
|
603 traits
::VtableGenerator(traits
::VtableGeneratorData
{
604 generator_def_id
: generator_def_id
,
609 traits
::VtableClosure(traits
::VtableClosureData
{
613 }) => tcx
.lift(&substs
).map(|substs
|
614 traits
::VtableClosure(traits
::VtableClosureData
{
620 traits
::VtableFnPointer(traits
::VtableFnPointerData { fn_ty, nested }
) => {
621 tcx
.lift(&fn_ty
).map(|fn_ty
|
622 traits
::VtableFnPointer(traits
::VtableFnPointerData { fn_ty, nested }
)
625 traits
::VtableParam(n
) => Some(traits
::VtableParam(n
)),
626 traits
::VtableBuiltin(n
) => Some(traits
::VtableBuiltin(n
)),
627 traits
::VtableObject(traits
::VtableObjectData
{
631 }) => tcx
.lift(&upcast_trait_ref
).map(|trait_ref
|
632 traits
::VtableObject(traits
::VtableObjectData
{
633 upcast_trait_ref
: trait_ref
,
638 traits
::VtableTraitAlias(traits
::VtableTraitAliasData
{
642 }) => tcx
.lift(&substs
).map(|substs
|
643 traits
::VtableTraitAlias(traits
::VtableTraitAliasData
{
653 impl<'a
, 'tcx
> Lift
<'tcx
> for traits
::Environment
<'a
> {
654 type Lifted
= traits
::Environment
<'tcx
>;
655 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
656 tcx
.lift(&self.clauses
).map(|clauses
| {
657 traits
::Environment
{
664 impl<'a
, 'tcx
, G
: Lift
<'tcx
>> Lift
<'tcx
> for traits
::InEnvironment
<'a
, G
> {
665 type Lifted
= traits
::InEnvironment
<'tcx
, G
::Lifted
>;
666 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
667 tcx
.lift(&self.environment
).and_then(|environment
| {
668 tcx
.lift(&self.goal
).map(|goal
| {
669 traits
::InEnvironment
{
678 impl<'tcx
, C
> Lift
<'tcx
> for chalk_engine
::ExClause
<C
>
680 C
: chalk_engine
::context
::Context
+ Clone
,
681 C
: traits
::ChalkContextLift
<'tcx
>,
683 type Lifted
= C
::LiftedExClause
;
685 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
686 <C
as traits
::ChalkContextLift
>::lift_ex_clause_to_tcx(self, tcx
)
690 impl<'tcx
, C
> Lift
<'tcx
> for chalk_engine
::DelayedLiteral
<C
>
692 C
: chalk_engine
::context
::Context
+ Clone
,
693 C
: traits
::ChalkContextLift
<'tcx
>,
695 type Lifted
= C
::LiftedDelayedLiteral
;
697 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
698 <C
as traits
::ChalkContextLift
>::lift_delayed_literal_to_tcx(self, tcx
)
702 impl<'tcx
, C
> Lift
<'tcx
> for chalk_engine
::Literal
<C
>
704 C
: chalk_engine
::context
::Context
+ Clone
,
705 C
: traits
::ChalkContextLift
<'tcx
>,
707 type Lifted
= C
::LiftedLiteral
;
709 fn lift_to_tcx(&self, tcx
: TyCtxt
<'tcx
>) -> Option
<Self::Lifted
> {
710 <C
as traits
::ChalkContextLift
>::lift_literal_to_tcx(self, tcx
)
714 ///////////////////////////////////////////////////////////////////////////
715 // TypeFoldable implementations.
717 impl<'tcx
, O
: TypeFoldable
<'tcx
>> TypeFoldable
<'tcx
> for traits
::Obligation
<'tcx
, O
> {
718 fn super_fold_with
<F
: TypeFolder
<'tcx
>>(&self, folder
: &mut F
) -> Self {
720 cause
: self.cause
.clone(),
721 recursion_depth
: self.recursion_depth
,
722 predicate
: self.predicate
.fold_with(folder
),
723 param_env
: self.param_env
.fold_with(folder
),
727 fn super_visit_with
<V
: TypeVisitor
<'tcx
>>(&self, visitor
: &mut V
) -> bool
{
728 self.predicate
.visit_with(visitor
)
732 CloneTypeFoldableAndLiftImpls
! {
733 traits
::QuantifierKind
,
736 impl<'tcx
> TypeFoldable
<'tcx
> for &'tcx ty
::List
<traits
::Goal
<'tcx
>> {
737 fn super_fold_with
<F
: TypeFolder
<'tcx
>>(&self, folder
: &mut F
) -> Self {
739 .map(|t
| t
.fold_with(folder
))
740 .collect
::<SmallVec
<[_
; 8]>>();
741 folder
.tcx().intern_goals(&v
)
744 fn super_visit_with
<V
: TypeVisitor
<'tcx
>>(&self, visitor
: &mut V
) -> bool
{
745 self.iter().any(|t
| t
.visit_with(visitor
))
749 impl<'tcx
> TypeFoldable
<'tcx
> for traits
::Goal
<'tcx
> {
750 fn super_fold_with
<F
: TypeFolder
<'tcx
>>(&self, folder
: &mut F
) -> Self {
751 let v
= (**self).fold_with(folder
);
752 folder
.tcx().mk_goal(v
)
755 fn super_visit_with
<V
: TypeVisitor
<'tcx
>>(&self, visitor
: &mut V
) -> bool
{
756 (**self).visit_with(visitor
)
760 CloneTypeFoldableAndLiftImpls
! {
761 traits
::ProgramClauseCategory
,
764 impl<'tcx
> TypeFoldable
<'tcx
> for traits
::Clauses
<'tcx
> {
765 fn super_fold_with
<F
: TypeFolder
<'tcx
>>(&self, folder
: &mut F
) -> Self {
767 .map(|t
| t
.fold_with(folder
))
768 .collect
::<SmallVec
<[_
; 8]>>();
769 folder
.tcx().intern_clauses(&v
)
772 fn super_visit_with
<V
: TypeVisitor
<'tcx
>>(&self, visitor
: &mut V
) -> bool
{
773 self.iter().any(|t
| t
.visit_with(visitor
))
777 impl<'tcx
, C
> TypeFoldable
<'tcx
> for chalk_engine
::ExClause
<C
>
779 C
: traits
::ExClauseFold
<'tcx
>,
780 C
::Substitution
: Clone
,
781 C
::RegionConstraint
: Clone
,
783 fn super_fold_with
<F
: TypeFolder
<'tcx
>>(&self, folder
: &mut F
) -> Self {
784 <C
as traits
::ExClauseFold
>::fold_ex_clause_with(
790 fn super_visit_with
<V
: TypeVisitor
<'tcx
>>(&self, visitor
: &mut V
) -> bool
{
791 <C
as traits
::ExClauseFold
>::visit_ex_clause_with(
798 EnumTypeFoldableImpl
! {
799 impl<'tcx
, C
> TypeFoldable
<'tcx
> for chalk_engine
::DelayedLiteral
<C
> {
800 (chalk_engine
::DelayedLiteral
::CannotProve
)(a
),
801 (chalk_engine
::DelayedLiteral
::Negative
)(a
),
802 (chalk_engine
::DelayedLiteral
::Positive
)(a
, b
),
804 C
: chalk_engine
::context
::Context
<CanonicalConstrainedSubst
: TypeFoldable
<'tcx
>> + Clone
,
807 EnumTypeFoldableImpl
! {
808 impl<'tcx
, C
> TypeFoldable
<'tcx
> for chalk_engine
::Literal
<C
> {
809 (chalk_engine
::Literal
::Negative
)(a
),
810 (chalk_engine
::Literal
::Positive
)(a
),
812 C
: chalk_engine
::context
::Context
<GoalInEnvironment
: Clone
+ TypeFoldable
<'tcx
>> + Clone
,
815 CloneTypeFoldableAndLiftImpls
! {
816 chalk_engine
::TableIndex
,