mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-02 14:51:48 +00:00
Pass interner to TraitRef::self_type_parameter
This commit is contained in:
parent
aefcbf2758
commit
d7546d8c23
4 changed files with 24 additions and 20 deletions
|
@ -592,20 +592,21 @@ impl HirDisplay for Ty {
|
||||||
}
|
}
|
||||||
TypeParamProvenance::ArgumentImplTrait => {
|
TypeParamProvenance::ArgumentImplTrait => {
|
||||||
let substs = generics.type_params_subst(f.db);
|
let substs = generics.type_params_subst(f.db);
|
||||||
let bounds = f
|
let bounds =
|
||||||
.db
|
f.db.generic_predicates(id.parent)
|
||||||
.generic_predicates(id.parent)
|
.into_iter()
|
||||||
.into_iter()
|
.map(|pred| pred.clone().subst(&substs))
|
||||||
.map(|pred| pred.clone().subst(&substs))
|
.filter(|wc| match &wc.skip_binders() {
|
||||||
.filter(|wc| match &wc.skip_binders() {
|
WhereClause::Implemented(tr) => {
|
||||||
WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
|
tr.self_type_parameter(&Interner) == self
|
||||||
WhereClause::AliasEq(AliasEq {
|
}
|
||||||
alias: AliasTy::Projection(proj),
|
WhereClause::AliasEq(AliasEq {
|
||||||
ty: _,
|
alias: AliasTy::Projection(proj),
|
||||||
}) => proj.self_type_parameter(&Interner) == self,
|
ty: _,
|
||||||
_ => false,
|
}) => proj.self_type_parameter(&Interner) == self,
|
||||||
})
|
_ => false,
|
||||||
.collect::<Vec<_>>();
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
write_bounds_like_dyn_trait_with_prefix("impl", &bounds, f)?;
|
write_bounds_like_dyn_trait_with_prefix("impl", &bounds, f)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -780,7 +781,7 @@ impl TraitRef {
|
||||||
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
return write!(f, "{}", TYPE_HINT_TRUNCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.self_type_parameter().hir_fmt(f)?;
|
self.self_type_parameter(&Interner).hir_fmt(f)?;
|
||||||
if use_as {
|
if use_as {
|
||||||
write!(f, " as ")?;
|
write!(f, " as ")?;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -165,8 +165,8 @@ impl<T: TypeWalk> Binders<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TraitRef {
|
impl TraitRef {
|
||||||
pub fn self_type_parameter(&self) -> &Ty {
|
pub fn self_type_parameter(&self, interner: &Interner) -> &Ty {
|
||||||
&self.substitution.at(&Interner, 0).assert_ty_ref(&Interner)
|
&self.substitution.at(interner, 0).assert_ty_ref(interner)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn hir_trait_id(&self) -> TraitId {
|
pub fn hir_trait_id(&self) -> TraitId {
|
||||||
|
@ -473,7 +473,9 @@ impl Ty {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|pred| pred.clone().subst(&substs))
|
.map(|pred| pred.clone().subst(&substs))
|
||||||
.filter(|wc| match &wc.skip_binders() {
|
.filter(|wc| match &wc.skip_binders() {
|
||||||
WhereClause::Implemented(tr) => tr.self_type_parameter() == self,
|
WhereClause::Implemented(tr) => {
|
||||||
|
tr.self_type_parameter(&Interner) == self
|
||||||
|
}
|
||||||
WhereClause::AliasEq(AliasEq {
|
WhereClause::AliasEq(AliasEq {
|
||||||
alias: AliasTy::Projection(proj),
|
alias: AliasTy::Projection(proj),
|
||||||
ty: _,
|
ty: _,
|
||||||
|
|
|
@ -941,7 +941,8 @@ pub(crate) fn trait_environment_query(
|
||||||
for pred in resolver.where_predicates_in_scope() {
|
for pred in resolver.where_predicates_in_scope() {
|
||||||
for pred in ctx.lower_where_predicate(pred, false) {
|
for pred in ctx.lower_where_predicate(pred, false) {
|
||||||
if let WhereClause::Implemented(tr) = &pred.skip_binders() {
|
if let WhereClause::Implemented(tr) = &pred.skip_binders() {
|
||||||
traits_in_scope.push((tr.self_type_parameter().clone(), tr.hir_trait_id()));
|
traits_in_scope
|
||||||
|
.push((tr.self_type_parameter(&Interner).clone(), tr.hir_trait_id()));
|
||||||
}
|
}
|
||||||
let program_clause: chalk_ir::ProgramClause<Interner> =
|
let program_clause: chalk_ir::ProgramClause<Interner> =
|
||||||
pred.clone().to_chalk(db).cast(&Interner);
|
pred.clone().to_chalk(db).cast(&Interner);
|
||||||
|
|
|
@ -539,7 +539,7 @@ pub(super) fn generic_predicate_to_inline_bound(
|
||||||
let self_ty_shifted_in = self_ty.clone().shift_bound_vars(DebruijnIndex::ONE);
|
let self_ty_shifted_in = self_ty.clone().shift_bound_vars(DebruijnIndex::ONE);
|
||||||
match &pred.value {
|
match &pred.value {
|
||||||
WhereClause::Implemented(trait_ref) => {
|
WhereClause::Implemented(trait_ref) => {
|
||||||
if trait_ref.self_type_parameter() != &self_ty_shifted_in {
|
if trait_ref.self_type_parameter(&Interner) != &self_ty_shifted_in {
|
||||||
// we can only convert predicates back to type bounds if they
|
// we can only convert predicates back to type bounds if they
|
||||||
// have the expected self type
|
// have the expected self type
|
||||||
return None;
|
return None;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue