Skip to content

Commit

Permalink
Fix predicate_id.
Browse files Browse the repository at this point in the history
  • Loading branch information
maximebuyse committed Jul 24, 2024
1 parent ea402a9 commit a996280
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 61 deletions.
129 changes: 68 additions & 61 deletions frontend/exporter/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ pub enum ImplExprPathChunk {
AssocItem {
item: AssocItem,
predicate: Binder<TraitPredicate>,
#[value(predicate.predicate_id(tcx))]
predicate_id: PredicateId,
index: usize,
},
Parent {
predicate: Binder<TraitPredicate>,
#[value(predicate.predicate_id(tcx))]
predicate_id: PredicateId,
index: usize,
},
Expand Down Expand Up @@ -92,12 +94,12 @@ pub mod rustc {
AssocItem {
item: AssocItem,
predicate: PolyTraitPredicate<'tcx>,
predicate_id: PredicateId,
//predicate_id: PredicateId,
index: usize,
},
Parent {
predicate: PolyTraitPredicate<'tcx>,
predicate_id: PredicateId,
//predicate_id: PredicateId,
index: usize,
},
}
Expand Down Expand Up @@ -201,83 +203,88 @@ pub mod rustc {
.collect()
}

#[tracing::instrument(level = "trace", skip(s))]
fn path_to(
self,
s: &S,
target: PolyTraitRef<'tcx>,
param_env: rustc_middle::ty::ParamEnv<'tcx>,
) -> Option<Path<'tcx>> {
let tcx = s.base().tcx;
#[tracing::instrument(level = "trace", skip(s, param_env))]
fn path_to(
self,
s: &S,
target: PolyTraitRef<'tcx>,
param_env: rustc_middle::ty::ParamEnv<'tcx>,
) -> Option<Path<'tcx>> {
let tcx = s.base().tcx;

/// A candidate projects `self` along a path reaching some
/// predicate. A candidate is selected when its predicate
/// is the one expected, aka `target`.
#[derive(Debug)]
struct Candidate<'tcx> {
path: Path<'tcx>,
pred: PolyTraitPredicate<'tcx>,
}
/// A candidate projects `self` along a path reaching some
/// predicate. A candidate is selected when its predicate
/// is the one expected, aka `target`.
#[derive(Debug)]
struct Candidate<'tcx> {
path: Path<'tcx>,
pred: PolyTraitPredicate<'tcx>,
}

use std::collections::VecDeque;
let mut candidates: VecDeque<Candidate<'tcx>> = vec![Candidate {
path: vec![],
pred: self,
}]
.into();
use std::collections::VecDeque;
let mut candidates: VecDeque<Candidate<'tcx>> = vec![Candidate {
path: vec![],
pred: self,
}]
.into();

let target_pred = target.to_predicate(tcx);
let mut seen = std::collections::HashSet::new();
let target_pred = target.upcast(tcx);
let mut seen = std::collections::HashSet::new();

while let Some(candidate) = candidates.pop_front() {
{
// If a predicate was already seen, we know it is
// not the one we are looking for: we skip it.
if seen.contains(&candidate.pred) {
continue;
while let Some(candidate) = candidates.pop_front() {
{
// If a predicate was already seen, we know it is
// not the one we are looking for: we skip it.
if seen.contains(&candidate.pred) {
continue;
}
seen.insert(candidate.pred.clone());
}
seen.insert(candidate.pred.clone());
}
tracing::trace!("candidate={:#?}", candidate);
//tracing::trace!("candidate={:#?}", candidate);

// if the candidate equals the target, let's return its path
if predicate_equality(candidate.pred.to_predicate(tcx), target_pred, param_env, s) {
return Some(candidate.path);
}
// if the candidate equals the target, let's return its path
if predicate_equality(candidate.pred.upcast(tcx), target_pred, param_env, s) {
return Some(candidate.path);
}

// otherwise, we add to the queue all paths reachable from the candidate
for (index, parent_pred) in self.parents_trait_predicates(s) {
let mut path = candidate.path.clone();
path.push(PathChunk::Parent {
predicate: parent_pred.clone(),
predicate_id: parent_pred.predicate_id(s),
index,
});
candidates.push_back(Candidate {
pred: parent_pred.clone(),
path,
});
}
for (item, binder) in self.associated_items_trait_predicates(s) {
for (index, parent_pred) in binder.skip_binder().into_iter() {
// otherwise, we add to the queue all paths reachable from the candidate
for (index, parent_pred) in self.parents_trait_predicates(s) {
let mut path = candidate.path.clone();
path.push(PathChunk::AssocItem {
item,
predicate_id: parent_pred.predicate_id(s),
let span = tracing::span!(tracing::Level::TRACE, "trace_span2");
let _span = span.enter();
//let predicate_id = parent_pred.predicate_id(s);
let span = tracing::span!(tracing::Level::TRACE, "trace_span3");
let _span = span.enter();
path.push(PathChunk::Parent {
predicate: parent_pred.clone(),
//predicate_id,
index,
});
candidates.push_back(Candidate {
pred: parent_pred.clone(),
path,
});
}
for (item, binder) in self.associated_items_trait_predicates(s) {
for (index, parent_pred) in binder.skip_binder().into_iter() {
let mut path = candidate.path.clone();
path.push(PathChunk::AssocItem {
item,
//predicate_id: parent_pred.predicate_id(s),
predicate: parent_pred.clone(),
index,
});
candidates.push_back(Candidate {
pred: parent_pred.clone(),
path,
});
}
}
}
None
}
None
}
}
}

impl ImplExprAtom {
fn with_args(self, args: Vec<ImplExpr>, r#trait: TraitRef) -> ImplExpr {
Expand Down Expand Up @@ -331,7 +338,7 @@ pub mod rustc {
}
}
impl<'tcx> IntoImplExpr<'tcx> for rustc_middle::ty::PolyTraitRef<'tcx> {
#[tracing::instrument(level = "trace", skip(s))]
#[tracing::instrument(level = "trace", skip(s, param_env))]
fn impl_expr<S: UnderOwnerState<'tcx>>(
&self,
s: &S,
Expand Down Expand Up @@ -434,7 +441,7 @@ pub mod rustc {
Some((new_clause_no_binder, impl_expr, span.sinto(s)))
}

#[tracing::instrument(level = "trace", skip(s))]
#[tracing::instrument(level = "trace", skip(s, param_env))]
pub fn select_trait_candidate<'tcx, S: UnderOwnerState<'tcx>>(
s: &S,
param_env: rustc_middle::ty::ParamEnv<'tcx>,
Expand Down
2 changes: 2 additions & 0 deletions frontend/exporter/src/types/new/predicate_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ mod rustc {
}

impl<'tcx, S: UnderOwnerState<'tcx>> IntoPredicateId<'tcx, S> for ty::Predicate<'tcx> {
#[tracing::instrument(level = "trace", skip(s))]
fn predicate_id(&self, s: &S) -> PredicateId {
// Here, we need to be careful about not hashing a `crate::Predicate`,
// but `crate::Binder<crate::PredicateKind>` instead,
Expand All @@ -37,6 +38,7 @@ mod rustc {
}

impl<'tcx, S: UnderOwnerState<'tcx>> IntoPredicateId<'tcx, S> for ty::PolyTraitPredicate<'tcx> {
#[tracing::instrument(level = "trace", skip(s))]
fn predicate_id(&self, s: &S) -> PredicateId {
use ty::Upcast;
let predicate: ty::Predicate<'tcx> = (*self).upcast(s.base().tcx);
Expand Down

0 comments on commit a996280

Please sign in to comment.