Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/chalk_ext.rs')
-rw-r--r--crates/hir-ty/src/chalk_ext.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/crates/hir-ty/src/chalk_ext.rs b/crates/hir-ty/src/chalk_ext.rs
index 302558162a..51c178b90d 100644
--- a/crates/hir-ty/src/chalk_ext.rs
+++ b/crates/hir-ty/src/chalk_ext.rs
@@ -443,13 +443,25 @@ impl ProjectionTyExt for ProjectionTy {
}
pub trait DynTyExt {
- fn principal(&self) -> Option<&TraitRef>;
+ fn principal(&self) -> Option<Binders<Binders<&TraitRef>>>;
+ fn principal_id(&self) -> Option<chalk_ir::TraitId<Interner>>;
}
impl DynTyExt for DynTy {
- fn principal(&self) -> Option<&TraitRef> {
+ fn principal(&self) -> Option<Binders<Binders<&TraitRef>>> {
+ self.bounds.as_ref().filter_map(|bounds| {
+ bounds.interned().first().and_then(|b| {
+ b.as_ref().filter_map(|b| match b {
+ crate::WhereClause::Implemented(trait_ref) => Some(trait_ref),
+ _ => None,
+ })
+ })
+ })
+ }
+
+ fn principal_id(&self) -> Option<chalk_ir::TraitId<Interner>> {
self.bounds.skip_binders().interned().first().and_then(|b| match b.skip_binders() {
- crate::WhereClause::Implemented(trait_ref) => Some(trait_ref),
+ crate::WhereClause::Implemented(trait_ref) => Some(trait_ref.trait_id),
_ => None,
})
}