|
| 1 | +use crate::solve::assembly::Candidate; |
| 2 | + |
1 | 3 | use super::EvalCtxt;
|
2 |
| -use rustc_middle::traits::solve::{inspect, CandidateSource, QueryResult}; |
| 4 | +use rustc_middle::traits::{ |
| 5 | + query::NoSolution, |
| 6 | + solve::{inspect, CandidateSource, QueryResult}, |
| 7 | +}; |
3 | 8 | use std::marker::PhantomData;
|
4 | 9 |
|
5 | 10 | pub(in crate::solve) struct ProbeCtxt<'me, 'a, 'tcx, F, T> {
|
|
36 | 41 | }
|
37 | 42 | }
|
38 | 43 |
|
| 44 | +pub(in crate::solve) struct TraitProbeCtxt<'me, 'a, 'tcx, F> { |
| 45 | + cx: ProbeCtxt<'me, 'a, 'tcx, F, QueryResult<'tcx>>, |
| 46 | + source: CandidateSource, |
| 47 | +} |
| 48 | + |
| 49 | +impl<'tcx, F> TraitProbeCtxt<'_, '_, 'tcx, F> |
| 50 | +where |
| 51 | + F: FnOnce(&QueryResult<'tcx>) -> inspect::ProbeKind<'tcx>, |
| 52 | +{ |
| 53 | + pub(in crate::solve) fn enter( |
| 54 | + self, |
| 55 | + f: impl FnOnce(&mut EvalCtxt<'_, 'tcx>) -> QueryResult<'tcx>, |
| 56 | + ) -> Result<Candidate<'tcx>, NoSolution> { |
| 57 | + self.cx.enter(|ecx| f(ecx)).map(|result| Candidate { source: self.source, result }) |
| 58 | + } |
| 59 | +} |
| 60 | + |
39 | 61 | impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
|
40 | 62 | /// `probe_kind` is only called when proof tree building is enabled so it can be
|
41 | 63 | /// as expensive as necessary to output the desired information.
|
@@ -69,20 +91,18 @@ impl<'a, 'tcx> EvalCtxt<'a, 'tcx> {
|
69 | 91 | pub(in crate::solve) fn probe_trait_candidate(
|
70 | 92 | &mut self,
|
71 | 93 | source: CandidateSource,
|
72 |
| - ) -> ProbeCtxt< |
73 |
| - '_, |
74 |
| - 'a, |
75 |
| - 'tcx, |
76 |
| - impl FnOnce(&QueryResult<'tcx>) -> inspect::ProbeKind<'tcx>, |
77 |
| - QueryResult<'tcx>, |
78 |
| - > { |
79 |
| - ProbeCtxt { |
80 |
| - ecx: self, |
81 |
| - probe_kind: move |result: &QueryResult<'tcx>| inspect::ProbeKind::TraitCandidate { |
82 |
| - source, |
83 |
| - result: *result, |
| 94 | + ) -> TraitProbeCtxt<'_, 'a, 'tcx, impl FnOnce(&QueryResult<'tcx>) -> inspect::ProbeKind<'tcx>> |
| 95 | + { |
| 96 | + TraitProbeCtxt { |
| 97 | + cx: ProbeCtxt { |
| 98 | + ecx: self, |
| 99 | + probe_kind: move |result: &QueryResult<'tcx>| inspect::ProbeKind::TraitCandidate { |
| 100 | + source, |
| 101 | + result: *result, |
| 102 | + }, |
| 103 | + _result: PhantomData, |
84 | 104 | },
|
85 |
| - _result: PhantomData, |
| 105 | + source, |
86 | 106 | }
|
87 | 107 | }
|
88 | 108 | }
|
0 commit comments