GoalCandidate to Probe

This commit is contained in:
lcnr 2023-09-14 09:58:29 +02:00
parent 2394959310
commit be9d7e0b94
4 changed files with 41 additions and 40 deletions

View File

@ -52,19 +52,22 @@ pub struct GoalEvaluationStep<'tcx> {
pub instantiated_goal: QueryInput<'tcx, ty::Predicate<'tcx>>, pub instantiated_goal: QueryInput<'tcx, ty::Predicate<'tcx>>,
/// The actual evaluation of the goal, always `ProbeKind::Root`. /// The actual evaluation of the goal, always `ProbeKind::Root`.
pub evaluation: GoalCandidate<'tcx>, pub evaluation: Probe<'tcx>,
} }
/// A self-contained computation during trait solving. This either
/// corresponds to a `EvalCtxt::probe(_X)` call or the root evaluation
/// of a goal.
#[derive(Eq, PartialEq)] #[derive(Eq, PartialEq)]
pub struct GoalCandidate<'tcx> { pub struct Probe<'tcx> {
pub added_goals_evaluations: Vec<AddedGoalsEvaluation<'tcx>>, pub added_goals_evaluations: Vec<AddedGoalsEvaluation<'tcx>>,
pub candidates: Vec<GoalCandidate<'tcx>>, pub nested_probes: Vec<Probe<'tcx>>,
pub kind: ProbeKind<'tcx>, pub kind: ProbeKind<'tcx>,
} }
impl Debug for GoalCandidate<'_> { impl Debug for Probe<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
ProofTreeFormatter::new(f).format_candidate(self) ProofTreeFormatter::new(f).format_probe(self)
} }
} }

View File

@ -92,11 +92,11 @@ impl<'a, 'b> ProofTreeFormatter<'a, 'b> {
evaluation_step: &GoalEvaluationStep<'_>, evaluation_step: &GoalEvaluationStep<'_>,
) -> std::fmt::Result { ) -> std::fmt::Result {
writeln!(self.f, "INSTANTIATED: {:?}", evaluation_step.instantiated_goal)?; writeln!(self.f, "INSTANTIATED: {:?}", evaluation_step.instantiated_goal)?;
self.format_candidate(&evaluation_step.evaluation) self.format_probe(&evaluation_step.evaluation)
} }
pub(super) fn format_candidate(&mut self, candidate: &GoalCandidate<'_>) -> std::fmt::Result { pub(super) fn format_probe(&mut self, probe: &Probe<'_>) -> std::fmt::Result {
match &candidate.kind { match &probe.kind {
ProbeKind::Root { result } => { ProbeKind::Root { result } => {
writeln!(self.f, "ROOT RESULT: {result:?}") writeln!(self.f, "ROOT RESULT: {result:?}")
} }
@ -118,10 +118,10 @@ impl<'a, 'b> ProofTreeFormatter<'a, 'b> {
}?; }?;
self.nested(|this| { self.nested(|this| {
for candidate in &candidate.candidates { for probe in &probe.nested_probes {
this.format_candidate(candidate)?; this.format_probe(probe)?;
} }
for nested in &candidate.added_goals_evaluations { for nested in &probe.added_goals_evaluations {
this.format_added_goals_evaluation(nested)?; this.format_added_goals_evaluation(nested)?;
} }
Ok(()) Ok(())

View File

@ -24,13 +24,13 @@ where
search_graph: outer_ecx.search_graph, search_graph: outer_ecx.search_graph,
nested_goals: outer_ecx.nested_goals.clone(), nested_goals: outer_ecx.nested_goals.clone(),
tainted: outer_ecx.tainted, tainted: outer_ecx.tainted,
inspect: outer_ecx.inspect.new_goal_candidate(), inspect: outer_ecx.inspect.new_probe(),
}; };
let r = nested_ecx.infcx.probe(|_| f(&mut nested_ecx)); let r = nested_ecx.infcx.probe(|_| f(&mut nested_ecx));
if !outer_ecx.inspect.is_noop() { if !outer_ecx.inspect.is_noop() {
let probe_kind = probe_kind(&r); let probe_kind = probe_kind(&r);
nested_ecx.inspect.probe_kind(probe_kind); nested_ecx.inspect.probe_kind(probe_kind);
outer_ecx.inspect.goal_candidate(nested_ecx.inspect); outer_ecx.inspect.finish_probe(nested_ecx.inspect);
} }
r r
} }

View File

@ -87,7 +87,7 @@ impl<'tcx> WipAddedGoalsEvaluation<'tcx> {
pub struct WipGoalEvaluationStep<'tcx> { pub struct WipGoalEvaluationStep<'tcx> {
pub instantiated_goal: QueryInput<'tcx, ty::Predicate<'tcx>>, pub instantiated_goal: QueryInput<'tcx, ty::Predicate<'tcx>>,
pub evaluation: WipGoalCandidate<'tcx>, pub evaluation: WipProbe<'tcx>,
} }
impl<'tcx> WipGoalEvaluationStep<'tcx> { impl<'tcx> WipGoalEvaluationStep<'tcx> {
@ -102,21 +102,21 @@ impl<'tcx> WipGoalEvaluationStep<'tcx> {
} }
#[derive(Eq, PartialEq, Debug)] #[derive(Eq, PartialEq, Debug)]
pub struct WipGoalCandidate<'tcx> { pub struct WipProbe<'tcx> {
pub added_goals_evaluations: Vec<WipAddedGoalsEvaluation<'tcx>>, pub added_goals_evaluations: Vec<WipAddedGoalsEvaluation<'tcx>>,
pub candidates: Vec<WipGoalCandidate<'tcx>>, pub nested_probes: Vec<WipProbe<'tcx>>,
pub kind: Option<ProbeKind<'tcx>>, pub kind: Option<ProbeKind<'tcx>>,
} }
impl<'tcx> WipGoalCandidate<'tcx> { impl<'tcx> WipProbe<'tcx> {
pub fn finalize(self) -> inspect::GoalCandidate<'tcx> { pub fn finalize(self) -> inspect::Probe<'tcx> {
inspect::GoalCandidate { inspect::Probe {
added_goals_evaluations: self added_goals_evaluations: self
.added_goals_evaluations .added_goals_evaluations
.into_iter() .into_iter()
.map(WipAddedGoalsEvaluation::finalize) .map(WipAddedGoalsEvaluation::finalize)
.collect(), .collect(),
candidates: self.candidates.into_iter().map(WipGoalCandidate::finalize).collect(), nested_probes: self.nested_probes.into_iter().map(WipProbe::finalize).collect(),
kind: self.kind.unwrap(), kind: self.kind.unwrap(),
} }
} }
@ -129,7 +129,7 @@ pub enum DebugSolver<'tcx> {
CanonicalGoalEvaluation(WipCanonicalGoalEvaluation<'tcx>), CanonicalGoalEvaluation(WipCanonicalGoalEvaluation<'tcx>),
AddedGoalsEvaluation(WipAddedGoalsEvaluation<'tcx>), AddedGoalsEvaluation(WipAddedGoalsEvaluation<'tcx>),
GoalEvaluationStep(WipGoalEvaluationStep<'tcx>), GoalEvaluationStep(WipGoalEvaluationStep<'tcx>),
GoalCandidate(WipGoalCandidate<'tcx>), Probe(WipProbe<'tcx>),
} }
impl<'tcx> From<WipGoalEvaluation<'tcx>> for DebugSolver<'tcx> { impl<'tcx> From<WipGoalEvaluation<'tcx>> for DebugSolver<'tcx> {
@ -156,9 +156,9 @@ impl<'tcx> From<WipGoalEvaluationStep<'tcx>> for DebugSolver<'tcx> {
} }
} }
impl<'tcx> From<WipGoalCandidate<'tcx>> for DebugSolver<'tcx> { impl<'tcx> From<WipProbe<'tcx>> for DebugSolver<'tcx> {
fn from(g: WipGoalCandidate<'tcx>) -> DebugSolver<'tcx> { fn from(p: WipProbe<'tcx>) -> DebugSolver<'tcx> {
DebugSolver::GoalCandidate(g) DebugSolver::Probe(p)
} }
} }
@ -329,9 +329,9 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
) -> ProofTreeBuilder<'tcx> { ) -> ProofTreeBuilder<'tcx> {
self.nested(|| WipGoalEvaluationStep { self.nested(|| WipGoalEvaluationStep {
instantiated_goal, instantiated_goal,
evaluation: WipGoalCandidate { evaluation: WipProbe {
added_goals_evaluations: vec![], added_goals_evaluations: vec![],
candidates: vec![], nested_probes: vec![],
kind: None, kind: None,
}, },
}) })
@ -350,10 +350,10 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
} }
} }
pub fn new_goal_candidate(&mut self) -> ProofTreeBuilder<'tcx> { pub fn new_probe(&mut self) -> ProofTreeBuilder<'tcx> {
self.nested(|| WipGoalCandidate { self.nested(|| WipProbe {
added_goals_evaluations: vec![], added_goals_evaluations: vec![],
candidates: vec![], nested_probes: vec![],
kind: None, kind: None,
}) })
} }
@ -361,7 +361,7 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
pub fn probe_kind(&mut self, probe_kind: ProbeKind<'tcx>) { pub fn probe_kind(&mut self, probe_kind: ProbeKind<'tcx>) {
if let Some(this) = self.as_mut() { if let Some(this) = self.as_mut() {
match this { match this {
DebugSolver::GoalCandidate(this) => { DebugSolver::Probe(this) => {
assert_eq!(this.kind.replace(probe_kind), None) assert_eq!(this.kind.replace(probe_kind), None)
} }
_ => unreachable!(), _ => unreachable!(),
@ -369,17 +369,17 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
} }
} }
pub fn goal_candidate(&mut self, candidate: ProofTreeBuilder<'tcx>) { pub fn finish_probe(&mut self, probe: ProofTreeBuilder<'tcx>) {
if let Some(this) = self.as_mut() { if let Some(this) = self.as_mut() {
match (this, candidate.state.unwrap().tree) { match (this, probe.state.unwrap().tree) {
( (
DebugSolver::GoalCandidate(WipGoalCandidate { candidates, .. }) DebugSolver::Probe(WipProbe { nested_probes, .. })
| DebugSolver::GoalEvaluationStep(WipGoalEvaluationStep { | DebugSolver::GoalEvaluationStep(WipGoalEvaluationStep {
evaluation: WipGoalCandidate { candidates, .. }, evaluation: WipProbe { nested_probes, .. },
.. ..
}), }),
DebugSolver::GoalCandidate(candidate), DebugSolver::Probe(probe),
) => candidates.push(candidate), ) => nested_probes.push(probe),
_ => unreachable!(), _ => unreachable!(),
} }
} }
@ -416,12 +416,10 @@ impl<'tcx> ProofTreeBuilder<'tcx> {
match (this, added_goals_evaluation.state.unwrap().tree) { match (this, added_goals_evaluation.state.unwrap().tree) {
( (
DebugSolver::GoalEvaluationStep(WipGoalEvaluationStep { DebugSolver::GoalEvaluationStep(WipGoalEvaluationStep {
evaluation: WipGoalCandidate { added_goals_evaluations, .. }, evaluation: WipProbe { added_goals_evaluations, .. },
.. ..
}) })
| DebugSolver::GoalCandidate(WipGoalCandidate { | DebugSolver::Probe(WipProbe { added_goals_evaluations, .. }),
added_goals_evaluations, ..
}),
DebugSolver::AddedGoalsEvaluation(added_goals_evaluation), DebugSolver::AddedGoalsEvaluation(added_goals_evaluation),
) => added_goals_evaluations.push(added_goals_evaluation), ) => added_goals_evaluations.push(added_goals_evaluation),
_ => unreachable!(), _ => unreachable!(),